Docker容器绕过iptables防火墙是其默认网络机制设计所致,本质非漏洞;根本原因是Docker在DOCKER-USER和FORWARD链插入高优先级规则,使firewalld/ufw的INPUT链规则失效,需统一由firewalld接管或使用ufw-docker工具协调。

Docker 容器绕过 iptables 防火墙,本质不是“漏洞”,而是默认网络机制的设计行为:Docker 直接在 DOCKER-USER 和 FORWARD 链中插入规则,优先级高于主机防火墙(如 firewalld 或 ufw)的 INPUT 链规则,导致你用 firewall-cmd 或 ufw deny 的端口依然能被访问。
确认是否真被绕过
先验证现象是否匹配:
- 执行
firewall-cmd --list-ports或ufw status显示某端口未开放,但curl -v http://localhost:8080和从外部nc -zv 服务器IP 8080均能通 - 运行
sudo iptables -t nat -L -n | grep :8080或sudo iptables -L FORWARD -n | grep DOCKER,能看到 Docker 自动添加的 DNAT/ACCEPT 规则 -
sudo firewall-cmd --state返回 running,但容器端口不受其管控
推荐方案:禁用 Docker 管理 iptables,交由 firewalld 统一控制
适用于 CentOS/RHEL/Fedora/AlmaLinux 等默认启用 firewalld 的系统,最干净、可审计、符合发行版规范:
- 编辑
/etc/docker/daemon.json(不存在则新建),写入:{"iptables": false} - 重启 Docker:
sudo systemctl restart docker - 启用 IP 伪装(确保容器出网正常):
sudo firewall-cmd --add-masquerade --permanent && sudo firewall-cmd --reload - 放行指定端口(如 8080/tcp):
sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload
⚠️ 注意:此后 docker run -p 8080:80 不再自动开防火墙,仅做本地端口绑定;是否对外暴露,完全由 firewalld 决定。
替代方案:用 ufw-docker 保留 Docker iptables 功能
适用于 Ubuntu/Debian 系统,无需禁用 Docker 网络能力,仍可通过 ufw 控制容器端口:
- 下载安装:
sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker && sudo chmod +x /usr/local/bin/ufw-docker - 执行安装:
sudo ufw-docker install(自动备份并修改/etc/ufw/after.rules) - 之后用 ufw 控制容器端口:
sudo ufw route allow proto tcp from any to any port 8080 - 默认拒绝所有外部对容器的新连接,只允许显式放行的端口
临时补救:在 DOCKER-USER 链顶部加拒绝规则
适合快速阻断特定端口,不改动 Docker 配置,但需手动维护:
- 插入拒绝规则(如封 8080):
sudo iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP - 查看是否生效:
sudo iptables -L DOCKER-USER -v -n - 注意:该规则全局生效,且重启 Docker 后会丢失,建议配合持久化(如保存到
/etc/iptables/rules.v4)
不复杂但容易忽略:关键在于明确谁管规则——要么让 Docker 退出 iptables 管理权,要么让防火墙工具(ufw/firewalld)接管 Docker 流量链。混用两者必然冲突。


















