docker默认网桥docker0的iptables转发行为由--iptables参数控制,默认开启,需宿主机启用ip_forward且docker自动添加forward accept和postrouting masquerade等规则;关闭需同时设--iptables=false并建议关闭ip_forward。

Docker 默认网桥(docker0)的 iptables 转发行为,由 Docker daemon 启动时的 --iptables 参数控制,默认是开启的。是否生效,还依赖宿主机内核的 IP 转发功能是否启用。
开启 iptables 转发(默认行为)
Docker 启动时若未显式禁用,会自动:
- 设置
net.ipv4.ip_forward = 1(如果系统未开启) - 在
filter/FORWARD链中插入 ACCEPT 规则,允许容器间及容器→外部的流量 - 在
nat/POSTROUTING链中添加 MASQUERADE 规则,实现容器访问外网的源地址转换 - 在
nat/PREROUTING和filter/FORWARD中添加端口映射(如-p 8080:80)所需规则
验证方式:
sysctl net.ipv4.ip_forward # 应返回 1 iptables -t filter -L FORWARD -n -v | grep docker iptables -t nat -L POSTROUTING -n -v | grep docker
关闭 iptables 转发
需两步配合,缺一不可:
-
禁用 Docker 自动管理 iptables
启动 dockerd 时传入--iptables=false:dockerd --iptables=false
或修改 systemd 服务文件
/lib/systemd/system/docker.service,在ExecStart行末尾添加:--iptables=false
然后执行:
systemctl daemon-reload && systemctl restart docker
此时 Docker 不再增删任何 iptables 规则,
iptables-save输出中将看不到DOCKER链或相关规则。 -
手动关闭内核转发(可选,但推荐同步调整)
即使 Docker 不操作 iptables,若ip_forward=1仍开启,内核仍会尝试转发——但因缺少 FORWARD 规则,默认策略通常是 DROP,实际仍不通。如需彻底隔离,可关闭:sysctl -w net.ipv4.ip_forward=0 # 永久生效:echo 'net.ipv4.ip_forward = 0' >> /etc/sysctl.conf
注意点
- 关闭
--iptables=false后,-p端口映射、容器跨主机通信、DNS 解析等依赖 iptables 的功能将失效,必须手动补全规则或改用其他网络模式(如 host、macvlan) -
--iptables=false不影响--ip-forward参数;Docker 仍可能按需设置ip_forward,除非同时指定--ip-forward=false - 若仅想禁止修改 filter 表但保留 nat 表操作,Docker 不提供该粒度控制,需自行接管全部规则
基本上就这些。











