Files

2.5 KiB
Raw Permalink Blame History

Docker + firewalld + iptables 关系总结

1. 三者分工

  • iptables:内核防火墙引擎,真正执行包过滤和 NAT。
  • firewalld:iptables 的“策略管理层”,按 zone / service / masquerade 等抽象生成规则。
  • Dockeriptables=true:在 iptables 中写入 容器相关 的规则:
    • 容器出网 SNATMASQUERADE
    • 宿主端口 → 容器端口的 DNAT
    • 容器网络之间的隔离(DOCKER-ISOLATION

三者是“共用 iptables,各管一摊”,不是互相替代。


2. Docker 关键配置项

/etc/docker/daemon.json

{
  "iptables": true,
  "ip-masq": true
}
  • "iptables": true(默认)

    • Docker 创建/维护 DOCKER 链、端口映射、容器出网 NAT 等规则。
    • 必须开启,否则大多数容器网络功能会坏(包括端口映射、bridge 容器出网)。
  • "iptables": false

    • Docker 不再改 iptables不再创建 DOCKER/NAT 规则
    • 需要你手工写所有 NAT / 端口映射规则。
    • 常见现象:宿主机 & --network host 容器有网,但所有 bridge 容器出不了网。
  • "ip-masq": true

    • 为 Docker 私网(如 172.17.0.0/16)自动加 MASQUERADE,容器可用宿主 IP 出网。

3. firewalld 与 Docker 的协作方式

典型做法(推荐):

  1. 保持 Docker 使用 iptables
    {
      "iptables": true,
      "ip-masq": true
    }
    
  2. 在 firewalld 里:
    • docker0br-xxxx 等网桥分配到 docker zone
      firewall-cmd --zone=docker --add-interface=docker0 --permanent
      firewall-cmd --zone=docker --add-interface=br-xxxx --permanent
      
    • 打开 masquerade 与 forward
      firewall-cmd --zone=docker --add-masquerade --permanent
      firewall-cmd --zone=docker --add-forward --permanent
      firewall-cmd --reload
      

原则:

  • Docker 负责:容器内部路由 + NAT + 端口映射的具体规则
  • firewalld 负责:哪些接口/zone 允许转发、伪装、对外开放哪些端口

4. 典型坑点(本次踩到的)

  • 设置:

    {
      "iptables": false
    }
    
  • 结果:

    • 宿主机有网;
    • --network host 容器有网;
    • 所有 bridge 网络容器无外网、访问 LE 超时。
  • 根因:

    • Docker 停止管理 iptables,不再生成容器 NAT 规则;
    • firewalld 只负责 zone 和 masquerade,但不知道容器网络细节,无法替 Docker 完成 SNAT/端口映射。