Se connecter à un VPN (OpenVPN) à partir d'un service Docker sur Swarm

11

J'ai un serveur OpenVPN en cours d'exécution exposant certaines adresses IP privées, j'aimerais que mes services d'essaimage Docker accèdent à ces adresses.

Idéalement, il n'y aurait pas de client OpenVPN "à l'intérieur" des conteneurs car les images devraient être déployées dans un environnement où un VPN ne sera pas nécessaire.

Ce que j'ai essayé jusqu'à présent

J'ai réussi à connecter un conteneur à mon VPN avec l'image dperson / openvpn-client .

J'ai lancé avec succès un autre conteneur en utilisant ce conteneur comme réseau en utilisant le --net=container:my-vpn-clientdrapeau.

Maintenant, j'essaie de mettre en place un service docker qui accédera à mes adresses IP privées et ce que j'ai trouvé est:

  • Je ne peux pas exécuter le client openVPN dans un service car il ne peut pas être fourni cap-add: NET_ADMIN. Docker discute de ce problème, mais ils sont toujours ouverts.
  • Je pensais que je pouvais faire fonctionner le conteneur client openVPN "à côté" du cluster swarm, mais je ne peux pas l'utiliser network_mode: "container:my-vpn-client"car il n'est pas pris en charge et est logique car je ne pouvais pas forcer la présence d'un conteneur arbitraire sur chaque nœud du essaim sans que ce soit un service lui-même.
  • J'ai essayé de créer un réseau attachable (pont / superposition) et de simplement y coller mon conteneur client OpenVPN et m'attendre comme par magie que d'autres membres de ce réseau passent par ce canal ... et j'ai été déçu.

Alors je suis là, une idée?

PS Si cela peut aider, c'est principalement pour configurer des tests automatisés qui exécuteront les services sur une seule machine docker en mode swarm, comme dans swarm init> stack deploy> run tests> swarm Leave. Donc s'il y a un "hack" pour ça ... ça peut m'intéresser;)


la source

Réponses:

1

Je fais exactement la même chose, sur votre client docker openvpn, vous devrez configurer 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

Pour moi, je l'ai configuré pour s'exécuter au démarrage via une restauration iptables

Sur votre hôte docker, ajoutez ce qui suit aux interfaces / etc / network /

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 C'est ce que vous utilisez où

  • 172.18.0.0 est votre réseau docker
  • 172.18.0.50 est l'un de vos conteneurs Docker
  • 172.18.0.100 est votre client docker openvpn
  • 192.168.11.222 est l'IP privée à laquelle vous voulez que vos clients dockers puissent accéder
  • tun0 est l'interface OpenVPN de votre client docker
  • eth1 est l'interface réseau 172.18.0.0 de votre client docker openvpn
des étincelles
la source
Une excellente réponse ... votée. Notez comment il y a deux problèmes à traiter: (1) s'assurer que le trafic est acheminé au bon endroit, et (2) s'assurer que le logiciel exécuté dans l'environnement Docker sait que la route existe. Vous devrez peut-être également indiquer à OpenVPN comment acheminer le trafic, en utilisant un ccrfichier comme si vous faisiez affaire avec un réseau local. Comme pour tout routage TCP / IP, « tracerouteest votre meilleur ami, tel tcpdumpquel ou WireShark».
Mike Robinson