容器同bridge网络下默认互通是因docker0网桥转发和IP转发开启,双向隔离需关闭ip-forward、设iptables FORWARD策略为DROP,并禁止docker0↔docker0转发。

默认 bridge 网络下容器能互通,不是因为网络命名空间没起作用,而是 Docker 默认放行了网桥间的转发流量。要实现容器间双向隔离(即同主机、同 bridge 网络下的容器彻底无法互相访问),关键不是关掉命名空间——它本来就是隔离的——而是切断数据在网桥层面的转发通路。
核心原理:隔离发生在网桥转发层,而非命名空间层
每个容器确实拥有独立 network namespace,但 docker0 网桥会把所有接入容器的 veth 设备当作同一局域网端口。只要宿主机内核开启 IP 转发 + FORWARD 链默认 ACCEPT,数据包就能跨容器转发。因此,双向隔离必须从 iptables 和 sysctl 两处入手。
- 关闭内核 IP 转发:防止网桥将一个容器的包“路由”给另一个容器
- 收紧 FORWARD 链策略:显式拒绝来自 docker0 的入向和出向互访流量
- 禁用网桥的 STP(可选):避免生成树协议意外打开转发路径
修改 Docker 守护进程配置(daemon.json)
编辑 /etc/docker/daemon.json,添加以下字段:
{
"iptables": false,
"ip-forward": false,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
}
}
⚠️ 注意:"iptables": false 表示 Docker 不再自动管理 iptables 规则,后续需手动配置;"ip-forward": false 会关闭 net.ipv4.ip_forward,这是阻断跨容器转发的关键一步。
重启守护进程生效:sudo systemctl restart docker
补充手动 iptables 规则(必需)
因已设 "iptables": false,需在宿主机上手动加固:
- 阻止 docker0 网桥内部转发:
sudo iptables -P FORWARD DROP - 仅允许容器访问外网(SNAT 出向):
sudo iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT - 仅允许外网响应返回:
sudo iptables -A FORWARD -i eth0 -o docker0 -m state --state RELATED,ESTABLISHED -j ACCEPT - 明确禁止 docker0 ↔ docker0 流量:
sudo iptables -A FORWARD -i docker0 -o docker0 -j DROP
这些规则确保:容器可上网,但彼此 ping 不通、telnet 不通、HTTP 也调不通——真正双向隔离。
验证是否生效
启动两个容器,例如:
docker run -d --name c1 nginx
docker run -it --rm alpine ping -c 3 $(docker inspect -f '{{.NetworkSettings.IPAddress}}' c1)
若返回 100% packet loss,且 curl http://[c1-ip] 也失败,则隔离成功。还可检查:sysctl net.ipv4.ip_forward 应为 0,iptables -L FORWARD -n 应含上述 DROP 规则。


















