CoreOS-将主机端口公开给VPN

时间:2019-03-17 14:07:37

标签: docker networking coreos openvpn tun

我在CoreOS中运行docker Openvpn容器:

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

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

我的任务是通过VPN客户端容器内的-p使其他计算机上的主机端口(其他任何容器上的tun0未使用端口)可供其他VPN客户端使用(因此设置路由必须是主机的吗?)。如何实现呢?

1 个答案:

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