Ubuntu 20.04下Docker 20.10.7端口转发无法访问问题求助
问题可能原因及对应解决方案
1. iptables规则异常
Docker的端口转发完全依赖nat表中DOCKER链的规则,如果规则被第三方防火墙(如ufw、firewalld)误删,或者Docker启动时没有成功注入规则,就会出现TCP连接能建立但后续流量被丢弃的情况。
排查和解决方法:
- 执行命令查看nat表规则:
sudo iptables -t nat -L -n,确认存在DOCKER链,且链内有对应8089端口的DNAT规则 - 若规则缺失,直接重启Docker服务重新生成规则:
sudo systemctl restart docker - 如果使用ufw防火墙,需要在
/etc/ufw/sysctl.conf中开启IP转发:将net/ipv4/ip_forward=1的注释去掉,之后执行sudo ufw reload再重启Docker
2. 反向路径过滤(rp_filter)配置过严
Ubuntu默认开启严格模式的rp_filter,会校验数据包的源路由合法性,Docker网桥回包时可能被判定为非法而直接丢弃,最终触发连接重置。
排查和解决方法:
- 查看当前rp_filter配置:
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.docker0.rp_filter - 若输出值为1(严格模式),临时修改为宽松模式验证:
sudo sysctl net.ipv4.conf.all.rp_filter=2 sudo sysctl net.ipv4.conf.docker0.rp_filter=2
- 验证访问正常后,将以下配置写入
/etc/sysctl.conf永久生效:
net.ipv4.conf.all.rp_filter=2 net.ipv4.conf.docker0.rp_filter=2
- 执行
sudo sysctl -p加载配置
3. 内核转发/网桥参数配置错误
Docker的跨网络转发依赖IP转发开启,以及网桥流量可以被iptables处理,对应参数被修改后会导致转发中断。
排查和解决方法:
- 检查IP转发是否开启:
sysctl net.ipv4.ip_forward,若输出为0,执行sudo sysctl net.ipv4.ip_forward=1开启 - 检查网桥iptables调用参数:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables,若输出为0,执行以下命令修改:
sudo sysctl net.bridge.bridge-nf-call-iptables=1 sudo sysctl net.bridge.bridge-nf-call-ip6tables=1
- 所有修改验证生效后,写入
/etc/sysctl.conf永久保存
4. userland-proxy(docker-proxy)配置异常
如果手动关闭了docker-proxy且没有配置hairpin NAT,宿主机访问本地映射端口时会出现流量无法回环的问题。
排查和解决方法:
- 查看Docker daemon配置:
cat /etc/docker/daemon.json,确认是否存在"userland-proxy": false的配置 - 若存在该配置,可以直接删除该行或者改为
"userland-proxy": true,之后重启Docker服务即可
快速验证方案
如果要快速排除默认网桥的配置问题,可以新建一个自定义桥接网络测试:
docker network create test-bridge docker run --name nginx-test --network test-bridge -p 8090:80 -d nginx:alpine
访问宿主机8090端口验证是否可以正常访问。
内容的提问来源于stack exchange,提问作者Kokizzu
相关产品推荐
相关产品推荐

