Conecte-se a uma VPN (OpenVPN) a partir de um serviço docker no enxame

11

Eu tenho um servidor OpenVPN em execução, expondo alguns endereços IP privados. Gostaria que meus serviços de enxame de docker acessassem esses endereços.

Idealmente, não haveria um cliente OpenVPN "dentro" dos contêineres, pois as imagens devem ser implantadas em um ambiente em que uma VPN não seja necessária.

O que eu tentei até agora

Conectei com êxito um contêiner à minha VPN com a imagem dperson / openvpn-client .

Lancei com sucesso outro contêiner usando esse contêiner como sua rede usando o --net=container:my-vpn-clientsinalizador.

Agora estou tentando configurar um serviço docker que acessará meus endereços IP privados e o que encontrei é:

  • Não consigo executar o cliente openVPN em um serviço, pois ele não pode ser fornecido cap-add: NET_ADMIN. Existem questões em aberto com o Docker discutindo esse assunto, mas elas ainda estão em aberto.
  • Imaginei que poderia executar o contêiner do cliente openVPN "ao lado" do cluster de enxame, mas não posso usá- network_mode: "container:my-vpn-client"lo, pois ele não é suportado e faz sentido, pois não era possível forçar a presença de um contêiner arbitrário em todos os nós do enxame sem que seja um serviço em si.
  • Eu tentei criar uma rede acoplável (bridge / overlay) e apenas coloquei meu contêiner de cliente OpenVPN nele e esperei magicamente que outros membros dessa rede passassem por esse canal ... e fiquei desapontado.

Então aqui estou, alguma ideia?

PS Se puder ajudar, isso é principalmente para configurar alguns testes automatizados que executarão os serviços na máquina docker única no modo enxame, como em swarm init> empilhamento de implantação> execução de testes> execução de enxame. Então, se houver um "hack" para isso ... eu posso estar interessado;)


fonte

Respostas:

1

Eu faço exatamente a mesma coisa: no seu cliente docker openvpn, você precisará configurar o NAT

iptables -t nat -A POSTROUTING -s 172.18.0.0/24 -o tun0 -j SNAT --to-source 10.8.0.10
iptables -t nat -A POSTROUTING -d 172.18.0.50/32 -o eth1 -j SNAT --to-source 172.18.0.100

Para mim, configurei isso para executar na inicialização por meio de um iptables-restore

No host do docker, adicione o seguinte ao / etc / network / interfaces

post-up ip rule add from 172.18.0.0/16 table 200
post-up ip route add 192.168.11.222 via 172.18.0.100 table 200

NB Isto é o que você usa onde

  • 172.18.0.0 é a sua rede docker
  • 172.18.0.50 é um dos contêineres do docker
  • 172.18.0.100 é o seu cliente docker openvpn
  • 192.168.11.222 é o IP privado que você deseja que seus clientes estivadores possam acessar
  • tun0 é a interface OpenVPN do seu cliente docker
  • eth1 é a interface de rede 172.18.0.0 do seu cliente docker openvpn
faíscas
fonte
Uma excelente resposta ... votada. Observe como existem dois problemas a serem tratados: (1) garantir que o tráfego seja roteado para o local apropriado e (2) garantir que o software em execução no ambiente do Docker saiba que a rota existe. Você também pode precisar informar ao OpenVPN como rotear o tráfego, usando um ccrarquivo como se estivesse lidando com uma rede local. Como em todo roteamento TCP / IP, " tracerouteé seu melhor amigo, como é tcpdumpou o WireShark".
Mike Robinson