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
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