答案是宿主机IPv4转发未启用或iptables MASQUERADE规则缺失。容器能通宿主机和docker0网关,说明内部网络正常,但出向流量因内核转发关闭或NAT规则缺失而无法到达外网,需依次检查并启用ip_forward、补全POSTROUTING SNAT规则、验证DNS及防火墙策略。

容器能 ping 通宿主机和 docker0 网关,却无法访问外网(比如 ping 8.8.8.8 超时、apt update 卡住),说明网络路径在宿主机转发环节中断了。核心问题通常不是容器本身,而是宿主机的内核转发或 NAT 规则缺失。
确认并开启 IPv4 转发
OpenWrt 或多数精简 Linux 发行版默认关闭 IP 转发,这是容器出网的第一道门槛:
- 运行
sysctl net.ipv4.ip_forward,若返回 0,必须启用 - 临时生效:
sysctl -w net.ipv4.ip_forward=1 - 永久生效:向
/etc/sysctl.d/99-docker-forward.conf写入net.ipv4.ip_forward=1,再执行/etc/init.d/sysctl restart
检查并补全 iptables MASQUERADE 规则
Docker 启动时本应自动添加 SNAT 规则,但在 OpenWrt 或某些定制系统中常被跳过:
- 运行
iptables -t nat -L POSTROUTING -n,确认是否有针对容器子网(如172.17.0.0/16)的MASQUERADE条目 - 若缺失,手动添加(以
172.17.0.0/16为例):iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE - 该规则确保容器流量离开宿主机时,源 IP 被替换为宿主机公网 IP
验证 DNS 是否可用
即使网络连通,DNS 失效也会导致“能 ping IP,不能 curl 域名”:
- 进容器执行
nslookup www.baidu.com 8.8.8.8:成功 → 说明 DNS 服务器可达,但默认解析器配置异常 - 启动容器时指定可信 DNS:
docker run --dns 8.8.8.8 --dns 114.114.114.114 ... - 或修改容器内
/etc/resolv.conf(仅临时):echo "nameserver 8.8.8.8" > /etc/resolv.conf
排除防火墙与网络模式干扰
部分环境会因安全策略或配置冲突阻断出口:
- 检查 UFW/iptables 是否拒绝了 FORWARD 链:
iptables -L FORWARD -n,确保策略为ACCEPT或有明确放行规则 - 禁用 IPv6(尤其在 OpenWrt 上)可避免协议栈争用:
在/etc/sysctl.conf中添加三行:net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv6.conf.lo.disable_ipv6 = 1,然后sysctl -p - 测试性使用
--net=host启动容器:若此时能上网,说明 bridge 模式配置有问题,需聚焦网桥或子网设置


















