-1

我在 CoreOS 中运行 docker Openvpn 容器:

docker run --cap-add NET_ADMIN --device /dev/net/tun ...

容器作为客户端连接到 VPN,其他 VPN 客户端可以 ping 容器。它使用配置中的选项在其中运行正常openvpn进程。dev tun

我的任务是使这台机器上的主机端口-p来自任何其他容器的未显示端口)可用于其他 VPN 客户端,通过tun0VPN 客户端容器内的那个(所以它必须是主机才能设置路由?)。如何实施?

4

1 回答 1

1

所以我假设你有一个连接到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=hostdocker 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
于 2019-03-17T15:18:52.547 回答