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 # 只绑回环,收敛方式更简单常见链与作用
| 链 | 所在表 | 作用 |
|---|---|---|
| DOCKER | nat | 端口发布的 DNAT 规则 |
| DOCKER-USER | filter | 使用者自定义过滤入口 |
| POSTROUTING | nat | 容器出网的地址转换 |
| FORWARD | filter | 容器流量转发策略 |
需要按来源限制已发布端口时,把规则加在 DOCKER-USER 链;只服务本机的端口直接绑定到 127.0.0.1 更简单也更可靠。
直接改动 DOCKER 链的规则会在 Docker 重建规则时被覆盖,自定义过滤必须放在 DOCKER-USER。
限制访问的推荐做法
- 只服务本机的端口直接绑定回环地址,比写过滤规则更简单也更可靠
- 需要按来源限制时把规则加在专用链,插入位置要排在放行规则之前
- 改动后立刻用真实来源验证一次,确认限制确实生效
- 容器或网络重建后复查规则链路,避免限制随重建失效
- 把规则纳入配置管理,避免只存在于某台机器的运行状态里