Docker 暴露的端口在连接到 VPN 时停止工作
Docker exposed port stops working when connected to a VPN
我正在尝试创建一个 Docker 图像,它将通过 VPN 转发一个端口。我创建了一个暴露端口 5144 的简单图像,并测试它是否正常工作:
sudo docker run -t -d -p 5144:5144 \
--name le-bridge \
--cap-add=NET_ADMIN \
--device=/dev/net/tun \
bridge
sudo docker exec -it le-bridge /bin/bash
我检查端口是否正确公开,如下所示:
[CONTAINER] root@6116787b1c1e:~# nc -lvvp 5144
[HOST] user$ nc -vv 127.0.0.1 5144
然后,无论我键入什么,都会在容器的终端中正确回显。但是,一旦我启动 openvpn 守护程序,它就不再起作用了:
[CONTAINER] root@6116787b1c1e:~# openvpn logger.ovpn &
[1] 33
Sun Apr 5 22:52:54 2020 OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 14 2019
Sun Apr 5 22:52:54 2020 library versions: OpenSSL 1.1.1 11 Sep 2018, LZO 2.08
Sun Apr 5 22:52:54 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]
Sun Apr 5 22:52:54 2020 UDPv4 link local (bound): [AF_INET][undef]:1194
Sun Apr 5 22:52:54 2020 UDPv4 link remote:
Sun Apr 5 22:52:54 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Sun Apr 5 22:52:55 2020 [] Peer Connection Initiated with [AF_INET]
Sun Apr 5 22:53:21 2020 TUN/TAP device tun0 opened
Sun Apr 5 22:53:21 2020 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Sun Apr 5 22:53:21 2020 /sbin/ip link set dev tun0 up mtu 1500
Sun Apr 5 22:53:21 2020 /sbin/ip addr add dev tun0 10.X.0.2/24 broadcast 10.X.0.255
Sun Apr 5 22:53:21 2020 Initialization Sequence Completed
root@6116787b1c1e:~#
root@6116787b1c1e:~# nc -lvvp 5144
listening on [any] 5144 ...
从这里开始,使用完全相同的 netcat 命令,我无法再从主机访问暴露的端口。
我错过了什么?
编辑:也许值得一提的是,VPN 启动后,主机的连接仍然成功;它永远不会到达容器内的 netcat 进程。
我不太清楚为什么,但事实证明路由需要固定在容器内。在我的例子中,以下命令解决了这个问题:
ip route add 192.168.0.0/24 via 172.17.42.1 dev eth0
...其中 172.17.42.1
是我主机上 docker0 接口的 IP。
希望有一天这对某人有所帮助。
我正在尝试创建一个 Docker 图像,它将通过 VPN 转发一个端口。我创建了一个暴露端口 5144 的简单图像,并测试它是否正常工作:
sudo docker run -t -d -p 5144:5144 \
--name le-bridge \
--cap-add=NET_ADMIN \
--device=/dev/net/tun \
bridge
sudo docker exec -it le-bridge /bin/bash
我检查端口是否正确公开,如下所示:
[CONTAINER] root@6116787b1c1e:~# nc -lvvp 5144
[HOST] user$ nc -vv 127.0.0.1 5144
然后,无论我键入什么,都会在容器的终端中正确回显。但是,一旦我启动 openvpn 守护程序,它就不再起作用了:
[CONTAINER] root@6116787b1c1e:~# openvpn logger.ovpn &
[1] 33
Sun Apr 5 22:52:54 2020 OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 14 2019
Sun Apr 5 22:52:54 2020 library versions: OpenSSL 1.1.1 11 Sep 2018, LZO 2.08
Sun Apr 5 22:52:54 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]
Sun Apr 5 22:52:54 2020 UDPv4 link local (bound): [AF_INET][undef]:1194
Sun Apr 5 22:52:54 2020 UDPv4 link remote:
Sun Apr 5 22:52:54 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Sun Apr 5 22:52:55 2020 [] Peer Connection Initiated with [AF_INET]
Sun Apr 5 22:53:21 2020 TUN/TAP device tun0 opened
Sun Apr 5 22:53:21 2020 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Sun Apr 5 22:53:21 2020 /sbin/ip link set dev tun0 up mtu 1500
Sun Apr 5 22:53:21 2020 /sbin/ip addr add dev tun0 10.X.0.2/24 broadcast 10.X.0.255
Sun Apr 5 22:53:21 2020 Initialization Sequence Completed
root@6116787b1c1e:~#
root@6116787b1c1e:~# nc -lvvp 5144
listening on [any] 5144 ...
从这里开始,使用完全相同的 netcat 命令,我无法再从主机访问暴露的端口。 我错过了什么?
编辑:也许值得一提的是,VPN 启动后,主机的连接仍然成功;它永远不会到达容器内的 netcat 进程。
我不太清楚为什么,但事实证明路由需要固定在容器内。在我的例子中,以下命令解决了这个问题:
ip route add 192.168.0.0/24 via 172.17.42.1 dev eth0
...其中 172.17.42.1
是我主机上 docker0 接口的 IP。
希望有一天这对某人有所帮助。