.png)
Eu sou novo em redes, então estou tentando isso pela primeira vez. Criei um docker openvpn que se conecta a um servidor VPN. A execução wget -q -O - https://api.myip.com
dentro do contêiner do docker confirma que a rede do docker está conectada adequadamente à VPN e que o IP é do servidor VPN. Agora quero tentar rotear o tráfego do host através do contêiner do docker e obter o mesmo resultado fora do contêiner onde o tráfego do host usa a conexão VPN do docker. Não está muito claro para mim como fazer isso a partir de um relacionamento docker host <-> container, então pensei que talvez pudesse usar o recurso de mapeamento de porta no docker e também criar um proxy da web no docker para lidar com qualquer http/https solicitações de.
Portanto, levantei o servidor squid e openvpn dentro do mesmo docker e expus a porta 3128 (já que é nisso que o squid está escutando). O comando wget no host se torna:
wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345
Mas os testes mostram que o tráfego não passa pela conexão VPN do docker. Em vez disso, os resultados mostram que a comunicação ocorre pela conexão de Internet do host.
Eu executo o contêiner usando o seguinte comando de execução do Docker:
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun --name vpn -it --sysctl net.ipv6.conf.all.disable_ipv6=0 -p 12345:3128 vpn-image
A abordagem acima está errada? Qual é a melhor abordagem para rotear o tráfego do host em várias conexões VPN do Docker?
Os recursos a seguir indicam que isso é possível, mas oferecem soluções próprias específicas para seu caso de uso. Seria bom ter uma ferramenta de rede Linux como wget ou curl que pudesse me ajudar a depurar/testar o progresso da minha solução.
Responder1
Esta é uma pergunta antiga, mas parece ter recebido pelo menos algum tráfego recente, então responderei.
Dependendo do que você está tentando fazer, existem duas maneiras de fazer com que sua rede passe pela VPN e, dependendo do que você está tentando rotear, existem três maneiras de fazer isso.
Proxy (proxy de encaminhamento)
Isso requer que o sistema host ou contêiner que você deseja usar a VPN direcione explicitamente seu tráfego para um proxy em execução no contêiner VPN. Seu contêiner VPN precisa estar executando um proxy, bem como a VPN ativa. O gerencia com bastante eficiência o encaminhamento de rede bidirecional.
A técnica exige que você exponha uma porta do servidor proxy de contêineres que você configurou manualmente no contêiner VPN e, em seguida, configure seu sistema host para usar localhost:port
como proxy. Isso é bastante complicado e tem muitas opções, então você deve pesquisar especificamente no Google.
Controle direto da pilha de rede (do host)
Normalmente, o contêiner VPN tem uma pilha de rede separada em execução em um namespace separado, mas você pode dizer ao docker para não separar o namespace da rede e conceder-lhe acesso total à pilha de rede, pois estava sendo executado nativamente no host. Se você estiver tentando usar uma VPN em contêiner como se ela estivesse instalada nativamente no host, é isso que você faria. No entanto, o controle do namespace da rede host é uma permissão separada de apenas compartilhá-lo, portanto, você também precisa adicionar alguns recursos. Os recursos do 3xact dependem do seu software VPN, mas geralmente são CAP_NET
, CAP_NET_RAW
e frequentemente CAP_ADMIN
. Se você não tiver certeza e confiar em seu aplicativo, basta usar o modo privilegiado para conceder todos os recursos (além de alguns outros extras desnecessários). Então, para isso você adiciona estas duas opções ao seu comando de execução: --net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN
.
Controle direto da pilha de rede (de outro contêiner)
Esta opção tem o mesmo conceito do controle direto da pilha de rede do host, mas permite que sua VPN seja usada por outro contêiner em vez do host, como se estivesse sendo executada nesse contêiner. Para usá-lo, basta adicionar uma linha ao comando run do contêiner não VPN para instruí-lo a compartilhar a pilha de rede com seu contêiner VPN:--net=container:vpn-container-name