首页/云/Docker 容器速查/Docker 与 iptables 规则的关系
网络与存储52 条

Docker 与 iptables 规则的关系

Docker 通过 iptables 的 DOCKER 链实现端口发布与出网 NAT;DOCKER-USER 链是留给使用者的过滤入口,排端口不通先看这两条链。

Docker 容器速查云更新于 2026-10-13

Docker 与 iptables 的关系

Docker 通过 iptables 规则实现端口发布与容器出网 NAT:nat 表的 DOCKER 链负责 DNAT 转发,filter 表的 DOCKER-USER 链是留给使用者的过滤入口。排查端口不通或想按来源限制访问时,先看这两条链。宿主自身的防火墙规则与 Docker 链的生效顺序不同,这也是「防火墙拦不住容器端口」的常见原因。

基本信息

关键链nat 表 DOCKER(DNAT)、filter 表 DOCKER-USER(自定义过滤)
查看方式iptables -t nat -L DOCKER -n 与 iptables -L DOCKER-USER -n
生效顺序已发布端口的流量先经 Docker 自有链
推荐做法自定义过滤一律加在 DOCKER-USER 链
适用平台Linux 宿主上的 Docker Engine

典型使用场景

  • 已发布端口需要按来源 IP 限制访问
  • 排查「宿主防火墙屏蔽了但端口仍可访问」
  • 核对某容器端口实际生成的转发规则
  • 把仅本机使用的服务只绑定到回环地址
  • 容器无法出网时检查 NAT 相关链

查看与限制

查看与限制
sudo iptables -t nat -L DOCKER -n --line-numbers      # 查看 DNAT 转发规则
sudo iptables -L DOCKER-USER -n --line-numbers          # 查看自定义过滤链
sudo iptables -I DOCKER-USER -i eth0 -p tcp --dport 8080 -j DROP    # 丢弃来自 eth0 的 8080
docker run -d -p 127.0.0.1:8080:80 nginx:1.27           # 只绑回环,收敛方式更简单

常见链与作用

链所在表作用
DOCKERnat端口发布的 DNAT 规则
DOCKER-USERfilter使用者自定义过滤入口
POSTROUTINGnat容器出网的地址转换
FORWARDfilter容器流量转发策略
需要按来源限制已发布端口时,把规则加在 DOCKER-USER 链;只服务本机的端口直接绑定到 127.0.0.1 更简单也更可靠。
直接改动 DOCKER 链的规则会在 Docker 重建规则时被覆盖,自定义过滤必须放在 DOCKER-USER。

限制访问的推荐做法

  • 只服务本机的端口直接绑定回环地址,比写过滤规则更简单也更可靠
  • 需要按来源限制时把规则加在专用链,插入位置要排在放行规则之前
  • 改动后立刻用真实来源验证一次,确认限制确实生效
  • 容器或网络重建后复查规则链路,避免限制随重建失效
  • 把规则纳入配置管理,避免只存在于某台机器的运行状态里

易错点

  • 用宿主常规防火墙规则屏蔽端口却仍能访问:已发布端口的流量走 Docker 自有链,规则位置不对
  • 直接修改 DOCKER 链:规则会在 Docker 重载或重启后被覆盖,限制随之失效
  • 规则插到链尾:前面的放行规则先命中,限制不生效,需要插到合适位置
  • 容器或网络重建后不复查规则:链路被改写,原有的限制需要重新验证

数据来源与参考

  • Docker 官方文档:Packet filtering and firewalls(docs.docker.com/network/packet-filtering-firewalls)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌