从swarm上的docker服务连接到VPN(OpenVPN)


11

我有一台运行OpenVPN的服务器公开了一些私有IP地址,我希望我的docker swarm服务可以访问这些地址。

理想情况下,容器内不会有OpenVPN客户端,因为预计映像将部署在不需要VPN的环境中。

到目前为止我尝试过的

我已使用dperson / openvpn-client映像成功将容器连接到我的VPN 。

我使用该--net=container:my-vpn-client标记成功启动了另一个使用该容器作为其网络的容器。

现在,我正在尝试设置一个可以访问我的私有IP地址的docker服务,我发现的是:

  • 我无法在服务中运行openVPN客户端,因为它无法提供cap-add: NET_ADMIN。Docker在讨论此问题时存在一些开放性问题,但它们仍然是开放性的。
  • 我认为我可以让openVPN客户端容器在群集集群旁边运行,但是我不能使用network_mode: "container:my-vpn-client"它,因为它不受支持并且确实有意义,因为我无法强制在容器的每个节点上都存在一个任意容器蜂拥而至,这本身并不是一项服务。
  • 我尝试创建一个可连接的网络(网桥/覆盖),然后将我的OpenVPN客户端容器粘在其中,并神奇地期望该网络的其他成员通过该管道...我对此感到失望。

所以我在这里,有什么主意吗?

PS如果可以帮助,这主要是设置一些自动化测试,这些测试将以swarm模式在单台docker机器上运行服务,如swarm init>堆栈部署>运行测试> swarm离开。所以,如果有一个“ hack”……我可能会感兴趣;)

Answers:


1

我做同样的事情,在您的openvpn docker客户端上,您将需要配置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

对我来说,我将其设置为通过iptables-restore在启动时运行

在您的Docker主机上,将以下内容添加到/ 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

注意:这是您在哪里使用的

  • 172.18.0.0是您的Docker网络
  • 172.18.0.50是您的Docker容器之一
  • 172.18.0.100是您的docker openvpn客户端
  • 192.168.11.222是您希望您的Docker客户端能够访问的私有IP
  • tun0是您的Docker客户端的OpenVPN接口
  • eth1是您的openvpn docker客户端的172.18.0.0网络接口

出色的回应...支持。请注意如何处理两个问题:(1)确保将流量路由到正确的位置,(2)确保在Docker环境中运行的软件知道该路由存在。您可能需要告诉OpenVPN如何使用ccr文件来路由流量,就像处理本地网络一样。与所有TCP / IP路由一样,“ 或WireShark traceroute都是您最好的朋友tcpdump”。
Mike Robinson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.