docker端口映射依赖iptables nat表中prerouting链跳转至docker链,再由docker链中dnat规则将宿主机端口流量转发至容器ip:端口;需确保容器ip、端口与规则一致,且docker-user链位于docker链之前以保障自定义规则生效。
直接看 iptables -t nat -l -n -v 就能定位端口转发链路,核心规则落在 docker 链里,它由 prerouting 链调用。
查 NAT 表的 PREROUTING 和 DOCKER 链
Docker 启动带 -p 参数的容器后,会在 nat 表中自动插入两条关键路径:
-
PREROUTING链里有一条跳转规则:匹配目标端口(如 8080),然后-j DOCKER -
DOCKER链里有一条 DNAT 规则:把流量改写成172.17.0.x:80这样的容器地址+端口
执行命令即可看到完整链条:
sudo iptables -t nat -L PREROUTING -n -v<br>sudo iptables -t nat -L DOCKER -n -v
确认容器 IP 和端口映射是否匹配
规则里的容器 IP 必须和实际运行容器的 IP 一致,否则转发失败。可用以下方式核对:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 查容器当前 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' - 查容器暴露端口:
docker port,输出类似8080->80/tcp - 对比
DOCKER链中--to-destination的 IP 和端口是否与上述结果一致
注意 DOCKER-USER 链的位置影响生效顺序
如果手动加了访问控制规则,必须放在 DOCKER-USER 链里,且要确保它在 DOCKER 链之前执行:
-
DOCKER-USER是 Docker 预留的用户自定义链,位于FORWARD链开头 - 若用
firewalld或其他工具 reload 过防火墙,可能打乱链顺序,导致DOCKER-USER移到DOCKER后面而失效 - 修复方法:重启 Docker 服务,让 iptables 规则重建并恢复正确顺序
区分 bridge 模式下不同方向的流量路径
bridge 网络中,外部访问容器和容器访问外部走的是完全不同的 iptables 路径:
- 外部 → 容器:走
nat/PREROUTING → DOCKER(DNAT)→ filter/FORWARD → 容器 - 容器 → 外部:走
filter/FORWARD → nat/POSTROUTING(SNAT)→ 宿主机网卡 - 同 bridge 网络内容器互访:不经过
FORWARD链,只在docker0网桥内部二层转发










