在过去的两年里,我一直使用 Windscribes 端口转发服务从外部 IP 访问 LAN 中的一些服务。因为我位于 NAT 后面,所以这是最好的解决方案,并且在我的用例中运行良好。Windscribe 服务一直在 Docker 容器中运行,并将端口转发到我服务器上的其他容器。
最近我更换了服务器,并将旧服务器上的所有东西都搬了过来。由于某种原因,这破坏了我的转发功能,我似乎无法弄清楚原因。我一直在使用 iperf3 仅使用本地 IP 进行测试,只是为了排除 Windscribe 的任何问题。我设置了两台 PC,一台运行 iperf 服务器,一台运行 iperf 客户端,中间有转发容器。如果我直接从一台 PC 运行测试到另一台 PC,它运行正常。如果我使用服务器主机进行转发,它也能正常工作。即使容器内的 iperf 服务器也能工作,只是不能从容器内部转发。我甚至尝试以特权模式运行容器,但没有任何效果。
我正在运行相同的容器版本、相同的配置文件、相同的主机操作系统(Ubuntu 22.04 服务器)等。我只是将东西移到另一台机器上,因为旧机器坏了。
这是来自容器的 iptables 输出。
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere windscribe
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
**nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:5201 to:192.168.36.56
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE tcp -- anywhere target tcp dpt:5201
从客户端 PC 运行 iperf 到容器只会给出错误
iperf3: error - unable to connect to server: Connection refused
直接将其运行到 iperf 服务器就可以正常工作。
Connecting to host 192.168.36.56, port 5201
[ 5] local 192.168.36.105 port 48912 connected to 192.168.36.56 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 114 MBytes 958 Mbits/sec 26 475 KBytes
编辑:
经过一番尝试,我找到了一种解决方案,但实际上并不是这样。我的网络上有一个用于容器(LXD 和 Docker)的特定 vlan。我通过 netplan 创建了它,并使用 vlan 接口作为父级将其添加到 LXD 和 Docker。将其从 netplan 中删除并直接在 Docker 和 LXD 中创建 vlan 网络后,转发就可以了。但这意味着我需要为每种容器类型提供两个接口,我认为这不是一个很好的解决方案。奇怪的是,转发是 netplan 设置中唯一不起作用的功能。网络的其他功能都运行良好。容器可以与网络上的其他设备通信,而其他设备又可以与容器通信,容器之间也可以相互通信(LXD 到 Docker、Docker 到 Docker 等)。容器内的转发是唯一出现故障的功能。