我在CoreOS中运行docker Openvpn容器:
docker run --cap-add NET_ADMIN --device /dev/net/tun ...
容器作为客户端连接到VPN,其他VPN客户端可以ping通该容器。可以在配置文件中使用openvpn
选项在其中运行普通的dev tun
进程。
我的任务是通过VPN客户端容器内的-p
使其他计算机上的主机端口(其他任何容器上的tun0
未使用端口)可供其他VPN客户端使用(因此设置路由必须是主机的吗?)。如何实现呢?
答案 0 :(得分:1)
因此,我假设您有一个连接到VPN服务器的容器,并且由于IP限制等原因,您需要通过此容器访问服务器。
1-如果您使用的是桥接网络,这是运行容器时的默认设置:
要实现此目的,您需要在容器内安装IPTable,并在启动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路由
假设您有一个带有端口9000的容器 Y ,并且可以通过容器 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