根本原因是firewalld重启或重载时清空非其托管的iptables规则,而docker自建的docker、docker-user等链不在firewalld管理范围内;应让firewalld仅开放宿主机映射端口、移除docker0接口绑定,并将自定义规则写入docker-user链以确保不被覆盖。

升级 Docker 容器引擎(即 dockerd)时,宿主机防火墙规则丢失,根本原因不是 Docker 升级本身清空规则,而是 firewalld 服务重启或重载时主动清空非托管的 iptables 规则——而 Docker 自动插入的 DOCKER、DOCKER-USER 等链及其规则,恰恰不在 firewalld 的管理范围内。
所以关键不是“防止 Docker 升级删规则”,而是 避免 firewalld 在升级前后误清规则,并确保 Docker 重启后能正确重建自身网络链。
✅ 明确职责边界:firewalld 只管宿主机暴露端口
firewalld 应仅负责开放容器映射到宿主机的端口(如 -p 8080:80 → 放行 8080/tcp),不干预 docker0 网桥、容器间通信或 NAT 转发。
操作示例:
# 开放宿主机端口(firewalld 的本职工作) sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload # 验证是否生效 sudo firewall-cmd --list-ports # 应含 8080/tcp
⚠️ 必须移除 docker0 接口在 firewalld 中的绑定
firewalld 默认可能把 docker0 加入 public 或其他 zone,触发默认拒绝策略,导致容器无法与宿主机通信。
执行以下任一操作(推荐后者):
- 将
docker0从所有 zone 移除:sudo firewall-cmd --permanent --remove-interface=docker0
- 或将其显式加入
trustedzone(允许所有流量,最稳妥):sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
然后重载:
sudo firewall-cmd --reload
? Docker 升级后自动恢复网络规则的关键动作
Docker 升级(如 yum update docker-ce)通常会重启 dockerd 服务。此时它会自动重建 DOCKER、DOCKER-USER、NAT 表中的 MASQUERADE/DNAT 等规则——但前提是:
-
iptables服务未被禁用(RHEL/CentOS 8+ 默认用 nftables 后端,需确认兼容性); -
firewalld没有在dockerd启动前抢先清空规则(见下一点)。
✅ 建议在升级后立即验证:
# 检查 FORWARD 链策略是否仍为 ACCEPT(Docker 不改 policy,但某些发行版脚本会) sudo iptables -L FORWARD | head -n 2 # 检查 DOCKER-USER 链是否存在且有规则(自定义规则应在此链) sudo iptables -L DOCKER-USER -n # 检查 nat 表中是否有 MASQUERADE(容器出网依赖) sudo iptables -t nat -vnL POSTROUTING | grep MASQUERADE
?️ 自定义规则必须写进 DOCKER-USER 链(而非 INPUT/FORWARD)
所有针对容器流量的过滤(如封 IP、限速),务必插入 DOCKER-USER 链——它位于 Docker 所有自动规则之前,不会被 dockerd 重启覆盖,也不受 firewalld --reload 影响。
例如封禁恶意源 IP:
sudo iptables -I DOCKER-USER -s 203.0.113.45 -j DROP
⚠️ 注意:iptables 命令不持久化。若需开机保留,应:
- 使用
iptables-save > /etc/sysconfig/iptables(CentOS/RHEL 7); - 或写入 systemd service,在
docker.service后启动加载规则; - 或改用
firewall-cmd --direct添加持久化直通规则(高级用法,需谨慎)。
❌ 不要做的三件事
- 不要关闭 firewalld(关闭 ≠ 安全,反而失去对宿主机端口的集中管控);
- 不要在
INPUT或FORWARD主链里加容器相关规则(升级/重启后大概率失效); - 不要手动删除或修改
DOCKER链里的规则(Docker 会强制同步,强行改动易引发不可逆断网)。
规则不丢失,靠的是分工清晰、接口隔离、链位正确。Docker 管容器网络,firewalld 管宿主机边界——各守其链,互不越界。











