Docker容器内部端口转发失效问题排查求助
Docker容器内部端口转发失效问题排查求助
各位大佬好,我最近碰到了一个Docker容器端口转发的疑难问题,折腾好几天没搞定,想请大家帮忙分析下!
过去两年我一直用Windscribe的端口转发服务,通过Docker容器把外部IP的流量转发到局域网内的服务——因为我在NAT后面,这个方案之前一直稳得一批,完全满足我的需求。结果最近旧服务器坏了,换了新机器迁移所有配置后,端口转发突然失效了,我实在找不到原因。
我做的排查步骤:
为了排除Windscribe本身的问题,我用iperf3在本地IP之间做测试:
- 两台PC,一台跑iperf服务端,一台跑客户端,中间放负责转发的容器
- 直接PC对PC测试:完全正常
- 用宿主机做转发:也正常
- 容器内部跑iperf服务端:能正常连接
- 唯独容器内部的端口转发不行,哪怕给容器开了特权模式也没用
而且我确认了:容器版本、配置文件、宿主机系统(Ubuntu 22.04 Server)全和旧服务器一模一样,只是换了硬件而已。
容器内的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连接容器的5201端口,直接报错:
iperf3: error - unable to connect to server: Connection refused
但直接连接iperf服务端(192.168.36.56:5201)就完全正常,测速数据如下:
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网络,结果转发就正常了。但这样就得给每种容器各配一个接口,我觉得这根本不是正经解决办法。
更奇怪的是:除了容器内部的端口转发,其他所有网络功能都正常——容器能和局域网其他设备通信,设备也能回连容器,不同容器之间(LXD和Docker、Docker之间)也能互通,唯独容器内部的端口转发挂了。
有没有大佬碰到过类似的情况?或者能给我指个排查方向?
备注:内容来源于stack exchange,提问作者dbergloev
相关产品推荐
相关产品推荐

