我在CoreOS中运行docker Openvpn容器:
docker run --cap-add NET_ADMIN --device /dev/net/tun ...
Container作为客户端连接到VPN,其他VPN客户端可以ping容器。它在配置中使用openvpn
选项在其中运行正常的dev tun
进程。
我的任务是通过VPN客户端容器内的-p
将此机器上的主机端口(来自任何其他容器的tun0
ublushed端口)提供给其他VPN客户端(因此它必须是主机才能设置路由?)。怎么实现这个?
因此,我假设您有一个连接到VPN服务器的容器,并且由于IP限制等原因,您需要通过此容器访问服务器。
1-如果您使用的是Bridge Network,这是运行容器时的默认设置:
为了实现您需要在容器内安装IPTables,并在启动VPN连接后运行以下命令:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
从您要访问服务的主机上,您可以使用iproute
命令通过容器路由连接,如下所示:
假设您要通过IP:172.17.0.4的容器访问IP 192.168.0.20的远程服务器
ip route add 192.168.0.20 via 172.17.0.4
现在,无论何时访问192.168.0.20服务器,它都将通过容器内的VPN客户端。
2-您可以将--network=host
传递给docker run
,在这种情况下,您不需要执行任何额外的步骤,因为默认情况下连接将通过VPN路由
假设您有一个容器Y,其端口为9000,可通过容器X访问。
容器X连接到VPN。
连接到同一VPN的用户想要访问容器Y并且他应该通过容器X,然后您需要在容器X中应用以下防火墙规则
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 9000 -j DNAT --to-destination $CONTAINER_Y_DOCKER_IP
iptables -t nat -A POSTROUTING -p tcp -d $CONTAINER_Y_DOCKER_IP --dport 9000 -j SNAT --to-source $CONTAINER_X_DOCKER_IP
iptables -A FORWARD -m state -p tcp -d $CONTAINER_Y_DOCKER_IP --dport 9000 --state NEW,ESTABLISHED,RELATED -j ACCEPT