daemon.json不直接配置转发规则,仅控制docker是否管理iptables;设"iptables": false可禁用自动规则,或利用docker-user链实现firewalld统一管控。
daemon.json 本身不直接配置容器网络转发规则,它只控制 docker 守护进程是否参与 iptables 规则管理。真正的端口转发、nat 和流量拦截行为由 iptables(或 nftables)规则链实现,docker 默认会自动写入这些规则——但你可以通过 daemon.json 关键参数来改变它的介入方式。
关闭 Docker 自动操作 iptables
如果你希望 firewalld 或手动 iptables 规则完全掌控网络转发逻辑(比如统一用 firewalld 开放端口、禁止容器随意暴露服务),最直接的方式是让 Docker 不碰 iptables:
- 在 /etc/docker/daemon.json 中添加:
"iptables": false - 重启 Docker:
sudo systemctl restart docker - 注意:启用后,Docker 不再自动添加
DOCKER、DOCKER-USER链及 DNAT/SNAT 规则;所有端口映射(-p)将失效,除非你手动补全 iptables 转发规则和 IP 转发设置
保留 Docker 管理 iptables,但限制其影响范围
更推荐的做法是保持 "iptables": true(默认值),同时利用 DOCKER-USER 链做前置控制——这是 Docker 明确预留的、在自身规则之前执行的自定义链:
- Docker 启动时自动创建
DOCKER-USER链,且保证它在FORWARD链中位于DOCKER规则之前 - 所有你想强制生效的转发策略(如仅允许某网段访问容器端口、屏蔽特定源 IP)都应加到该链:
sudo iptables -I DOCKER-USER -i eth0 -s 192.168.10.0/24 -j ACCEPT
sudo iptables -I DOCKER-USER -i eth0 -j DROP - 这些规则不会被 Docker 覆盖,firewalld 也支持管理
DOCKER-USER(需开启FirewallBackend = iptables)
配合网络模式调整转发行为
某些网络场景下,根本不需要传统端口映射转发。可通过 daemon.json 引导容器使用更底层的网络模型:
- 禁用默认桥接网络干扰:
"bridge": "none"(不推荐全局设,但可配合--network none单容器使用) - 为 macvlan/ipvlan 网络预设参数(虽不直接写转发规则,但绕过 NAT 层):
确保内核开启ip_forward,并在 daemon.json 中留出干净的子网:
"default-address-pools": [{"base": "192.168.100.0/24", "size": 26}] - 这样创建的 macvlan 容器拥有独立物理网段 IP,外部直接路由访问,无需 Docker 做任何 DNAT
补充:不要手动改 DOCKER 链
Docker 会动态维护 DOCKER 链中的规则(如容器启停时增删 ACCEPT tcp -- anywhere 172.17.0.x dpt:http)。你若手动修改该链,下次容器重启或 Docker reload 就会被覆盖。所有持久化策略必须落在 DOCKER-USER 或 firewalld zone 规则里。











