我有一个正在运行的 OpenVPN 服务器,它公开了一些私有 IP 地址,我希望我的 docker swarm 服务能够访问这些地址。
理想情况下,容器“内部”不会有 OpenVPN 客户端,因为图像预计会部署在不需要 VPN 的环境中。
我迄今为止尝试过
我成功地将一个容器连接到我的VPNdperson/openvpn-客户端图像。
我使用该标志成功使用该容器作为其网络启动了另一个容器--net=container:my-vpn-client
。
现在我正在尝试建立一个docker 服务这将访问我的私有IP地址,我发现的是:
- 我无法在服务中运行 openVPN 客户端,因为无法提供
cap-add: NET_ADMIN
。Docker 中存在一些未解决的问题,正在讨论这个问题,但这些问题仍然悬而未决。 - 我想我可以让 openVPN 客户端容器在 Swarm 集群“旁边”运行,但我无法使用,
network_mode: "container:my-vpn-client"
因为它不受支持,而且这很有意义,因为我不可能强制一个任意容器出现在 Swarm 的每个节点上,而它本身又不是一个服务。 - 我尝试创建一个可连接的网络(桥接/覆盖),并将我的 OpenVPN 客户端容器放入其中,并期望该网络的其他成员能够神奇地通过该管道......但我感到失望。
所以我在这里,有什么想法吗?
PS 如果有帮助的话,这主要是设置一些自动化测试,这些测试将在 Swarm 模式下在单个 Docker 机器上运行服务,如 Swarm init > stack deploy > run tests > swarm leave。所以如果有一个“黑客”可以做到这一点……我可能感兴趣 ;)
答案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 网络接口