本质是宿主机未放行或伪装容器出向流量,需启用IPv4转发、补全MASQUERADE规则、验证DNS、检查FORWARD链策略并禁用IPv6干扰。

确认并启用 IPv4 转发
bridge 模式依赖宿主机做路由中转,但很多系统(尤其是 OpenWrt、精简版 Linux 或某些云镜像)默认关闭 IP 转发:
– 运行 sysctl net.ipv4.ip_forward,返回 0 就必须开启
– 临时生效:sudo sysctl -w net.ipv4.ip_forward=1
– 永久生效:往 /etc/sysctl.d/99-docker-forward.conf 写入 net.ipv4.ip_forward=1,再执行 sudo sysctl --system
补全 POSTROUTING MASQUERADE 规则
Docker 启动时本该自动加这条 SNAT 规则,但在非标准环境常被跳过:
– 查看规则:sudo iptables -t nat -L POSTROUTING -n
– 若缺失,按实际子网添加(例如容器用的是 172.30.0.0/16,网桥名是 br-abc123):
sudo iptables -t nat -A POSTROUTING -s 172.30.0.0/16 ! -o br-abc123 -j MASQUERADE
注意:! -o br-abc123 表示“除该网桥外的所有出口”,避免对容器间通信做重复 NAT
验证 DNS 是否真正可用
能 ping 通 8.8.8.8 但 curl 不了域名?说明网络通、DNS 断:
– 进容器执行:nslookup www.baidu.com 8.8.8.8,成功 → DNS 服务器可达,问题在容器默认 nameserver
– 启动时指定可信 DNS:docker run --dns 8.8.8.8 --dns 114.114.114.114 ...
– 或临时改配置:echo "nameserver 8.8.8.8" > /etc/resolv.conf(重启容器后失效)
检查 FORWARD 链策略与 IPv6 干扰
iptables FORWARD 链若设为 DROP,且无显式放行规则,容器出向流量会被拦住:
– 查看:sudo iptables -L FORWARD -n
– 确保策略是 ACCEPT,或有类似规则:-A FORWARD -i docker0 -o eth0 -j ACCEPT
– 在 OpenWrt 或 IPv6 不稳定环境,建议禁用 IPv6 避免协议栈争用:
往 /etc/sysctl.conf 加三行:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
然后 sudo sysctl -p


















