Docker默认bridge网络不隔离容器间通信,需通过iptables规则或Docker 27+原生策略实现可靠隔离:前者用DROP规则阻断docker0双向流量,后者通过network-policy引擎声明式控制。

Docker 默认 bridge 网络(如 docker0)不隔离容器间通信,同一网桥下的容器默认可直接通过 IP 互访——这不是“安全隔离”,而是横向移动风险点。icc=false(Inter-Container Communication)是 Docker 早期提供的一个启动级开关,用于全局禁用同网桥内容器的直接网络互通,但它在较新版本中已被弃用或失效(尤其 Docker 20.10+),且无法细粒度控制。
所以,真正可靠、可落地的实战方案不是依赖 icc,而是结合以下三类手段实现“bridge 模式下容器间隔离”:
✅ 用自定义 bridge 网络 + --icc=false(仅限旧版 dockerd)
适用于仍在使用 Docker 19.03 或更早版本、且未启用实验特性的环境:
- 启动 dockerd 时添加参数:
dockerd --icc=false --bip=172.20.0.1/24
- 创建自定义网桥时,
icc=false会生效(对默认bridge无效):docker network create --driver bridge --opt com.docker.network.bridge.enable_icc=false mynet
- 容器加入该网络后,彼此 ping IP 或 telnet 端口将失败(除非显式放行 iptables)。
⚠️ 注意:Docker 20.10 起 --icc 参数被忽略;Docker 23+ 完全移除支持。此法仅作兼容性了解,不推荐用于新项目。
✅ 用 iptables 规则精准阻断同网桥容器通信(通用有效)
这是目前最稳定、跨版本兼容的实战方式,基于 Linux 内核 FORWARD 链拦截:
# 1. 清空已有 DOCKER-ISOLATION-STAGE-1 规则(避免重复) sudo iptables -t filter -F DOCKER-ISOLATION-STAGE-1 # 2. 拒绝所有从 docker0 进入、又发往 docker0 的流量(即容器→容器) sudo iptables -t filter -I DOCKER-ISOLATION-STAGE-1 -i docker0 -o docker0 -j DROP # 3. 确保该链被 FORWARD 主链调用(Docker 自动维护,一般已存在) sudo iptables -t filter -C FORWARD -j DOCKER-ISOLATION-STAGE-1 2>/dev/null || \ sudo iptables -t filter -I FORWARD -j DOCKER-ISOLATION-STAGE-1 # 4. 保存规则(需安装 iptables-persistent) sudo iptables-save | sudo tee /etc/iptables/rules.v4
✅ 效果:
- 同属
docker0的容器(如172.17.0.2↔172.17.0.3)无法 ping、curl、telnet; - 容器仍可正常访问外网(NAT 不受影响);
- 宿主机仍可访问容器映射端口(-p 映射走的是 PREROUTING → DOCKER 链,不受影响)。
? 提示:可用 tcpdump -i docker0 icmp 在宿主机抓包验证隔离是否生效。
✅ 用 Docker 27+ 原生网络策略(推荐用于新环境)
Docker Engine v27.x 引入了内置网络策略引擎(需启用实验特性):
# 1. 启动 dockerd 时开启策略支持 --experimental --features=network-policy=true # 2. 创建启用了策略的自定义网络 docker network create \ --driver bridge \ --opt com.docker.network.bridge.enable_ip_masquerade=true \ --opt com.docker.network.bridge.enable_icc=false \ --subnet 10.200.1.0/24 \ --ipam-driver default \ --config-only \ secured-net-config docker network create \ --config-from secured-net-config \ --scope local \ secured-net # 3. 对网络应用默认拒绝策略(等效于关闭 ICC) docker network policy create \ --ingress --egress \ --action deny \ --target secured-net \ default-deny-all
✅ 效果:
- 同一
secured-net内容器默认无法通信; - 可按 label、端口、协议动态创建白名单策略(如只允许
app=frontend访问app=backend:8080); - 策略实时生效,无需重启容器或修改 iptables。
不复杂但容易忽略:icc 参数早已过时,真要隔离,得靠 iptables 控制转发路径,或升级到 Docker 27+ 用声明式策略。选哪种,取决于你用的 Docker 版本和运维可控性要求。










