核心是让Docker与firewalld共存而非互斥:停firewalld测试确认冲突后,将其配置为接管docker0接口和容器子网;或持久化iptables规则;再禁用userland-proxy并利用DOCKER-USER链强化端口控制。

核心在于让 Docker 的网络规则和防火墙共存,而不是互相覆盖。firewalld 重启清空 iptables 是最常见断网原因,关键不是关防火墙,而是让它“认识”Docker 的规则。
确认是否是 firewalld 导致的中断
临时停掉 firewalld 看网络是否恢复:
- systemctl stop firewalld
- 进容器 ping 宿主机(如 172.17.0.1)或访问外部网站
- 若恢复,说明冲突已定位;别长期关闭,要解决共存问题
让 firewalld 接管 Docker 网络(推荐方案)
不绕过 firewalld,而是把它配置成 Docker 的“合作伙伴”:
- 将 Docker 网桥接口(docker0)加入 firewalld 的 trusted 或自定义 zone:
firewall-cmd --permanent --zone=trusted --add-interface=docker0 - 允许容器子网(如 172.17.0.0/16)通过:
firewall-cmd --permanent --zone=trusted --add-source=172.17.0.0/16 - 重载配置:firewall-cmd --reload
持久化 iptables 规则(适用于必须用 iptables 的场景)
当 firewalld 不适用或需精细控制时,把 Docker 创建的规则固化下来:
- 运行 iptables-save > /etc/sysconfig/iptables(CentOS/RHEL)
- 确保 iptables-services 已安装并启用:
yum install iptables-services && systemctl enable iptables - 之后重启 firewalld 不会清空 Docker 规则,因为系统改由 iptables 服务加载规则
避免端口映射被绕过(安全加固要点)
Docker 默认在 INPUT 链插入规则,可能使 firewalld 的端口限制失效:
- 禁用 userland-proxy,在 /etc/docker/daemon.json 加:
{"userland-proxy": false} - 改用 DOCKER-USER 链做前置过滤(该链在 Docker 规则之前执行):
iptables -I DOCKER-USER -i docker0 -p tcp --dport 1521 -j DROP - 这样 firewalld 的策略 + 自定义 DOCKER-USER 规则可协同生效


















