容器出网排查四步法:先测容器到docker0连通性;再查nat和forward链规则是否缺失或策略为drop;接着停firewalld验证冲突并检查docker链及zone归属;最后确保自定义规则写入docker-user链而非input/forward主链。

直接看容器出网是否卡在转发和地址转换环节,不用猜、不绕路。
第一步:确认容器能否发出数据包
进容器执行 ping -c 3 172.17.0.1(宿主机 docker0 网关)。通了说明容器内部网络正常;不通则先检查 docker0 是否存在、容器是否分配到 IP,再查 /proc/sys/net/ipv4/ip_forward 是否为 1。
第二步:验证 NAT 和转发链状态
在宿主机运行两个命令:
-
iptables -t nat -vnL POSTROUTING | grep MASQUERADE—— 应看到类似masquerade all -- 172.17.0.0/16 anywhere的规则,缺失说明容器无法出网 -
iptables -L FORWARD -n | head -2—— 若显示Chain FORWARD (policy DROP),大概率导致流量被静默丢弃,尤其在有虚拟机或自定义网桥时
第三步:快速定位是否被 firewalld 清空规则
临时停 firewalld:systemctl stop firewalld,再测容器 ping 外网。若恢复,说明冲突成立。接着运行:
-
iptables -t nat -L DOCKER—— 报错 “No chain/target/match” 表示 DOCKER 链已被清空 -
firewall-cmd --get-active-zones—— 查看 docker0 是否归属某个 zone,未加入则转发策略不生效
第四步:检查规则是否写错位置
所有针对容器流量的控制,必须写进 DOCKER-USER 链,而不是 INPUT 或 FORWARD 主链:
- 错误写法:
iptables -A INPUT -p tcp --dport 8080 -j DROP(Docker 重启后可能失效) - 正确写法:
iptables -I DOCKER-USER -i docker0 -p tcp --dport 8080 -j DROP(始终在 Docker 规则前生效)











