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

12 vpn openvpn docker

我有一个 OpenVPN 服务器运行,暴露了一些私有 IP 地址,我希望我的 docker swarm 服务访问这些地址。

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

到目前为止我尝试过的

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

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

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

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

所以我在这里,有什么想法吗?

PS 如果有帮助,这主要是设置一些自动化测试,这些测试将在单个 docker 机器上以 swarm 模式运行服务,如 swarm init > stack deploy > run tests > swarm leave。所以如果有一个“黑客”......我可能会感兴趣;)

spa*_*rks 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
Run Code Online (Sandbox Code Playgroud)

对我来说,我将其设置为通过 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
Run Code Online (Sandbox Code Playgroud)

注意这就是你在哪里使用的

  • 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 网络接口