CoreOS - 将主机端口暴露给 VPN

CoreOS - expose host ports to VPN

I 运行 docker CoreOS 中的 Openvpn 容器:

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

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

我的任务是通过[=14=使这台机器上的主机端口-p任何其他容器的模糊端口)可供其他VPN客户端使用] 在 VPN 客户端容器内(所以设置路由必须是主机的?)。如何实现?

所以我会假设你有一个连接到VPN服务器的容器,由于IP限制等原因,你需要通过这个容器访问服务器。

1- 如果您使用 运行 容器时的默认桥接网络:

为了实现,您需要在容器内安装 IPTables,并在启动 VPN 连接后 运行 以下命令:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

从您要访问服务的主机上,您可以使用 iproute 命令通过容器路由连接,如下所示:

Assuming you want to access a remote server with IP 192.168.0.20 through a container with IP: 172.17.0.4

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的用户想要访问容器Y,他应该通过容器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