所以我假设你有一个连接到VPN服务器的容器,由于IP限制等等,你需要通过这个容器访问服务器。
1-如果您使用的是运行容器时的默认桥接网络:
为了实现这一点,您需要在容器内安装 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 路由
更新:
假设您有一个 Container Y端口为 9000 并可通过 Container X访问。
容器X连接到 VPN。
连接到同一个 VPN 的用户想要访问 Container Y并且他应该通过 Container X,那么您需要在 Container 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