容器网络隔离防范内网横向渗透攻击:容器网络隔离实战
内网横向渗透攻击是攻击者利用一台被攻破的容器,向内网其他容器或主机发起扫描和连接,从而扩大战果。
如果容器之间没有网络隔离,攻击者能轻松发现敏感服务并提权。
本文面向零基础用户,手把手教你用 Docker 自身的网络功能实现容器隔离,阻断横向移动路径。
理解内网横向渗透与容器网络隔离
内网横向渗透核心在于“信任链”:传统架构中,同一宿主机上的容器默认可以互相通信。
攻击者只要拿下任意一个容器,就能扫描内网并尝试连接其他服务。
容器网络隔离就是打破这种信任,让容器之间不可见、不可达,即使某个容器失陷,也无法扩散到其他容器。
环境准备与基础概念
你需要一台安装了 Docker 的 Linux 服务器(Ubuntu/CentOS 均可)。
登录后确认 Docker 运行正常:
docker version
了解两个关键概念:
- 默认 bridge 网络:Docker 自动创建的
docker0,同一宿主机上的容器默认通过它通信。 - 自定义 bridge 网络:用户自己创建的网络,可以控制容器间是否允许通信。
创建隔离网络(关闭容器间通信)
核心操作:创建自定义 bridge 网络时,通过 -o 参数关闭容器间通信(ICC)。
docker network create --driver bridge \
-o "com.docker.network.bridge.enable_icc"="false" \
secure_net
查看网络确认选项生效:
docker network inspect secure_net | grep -A5 "Options"
如果看到 "com.docker.network.bridge.enable_icc": "false",说明配置成功。
启动容器并连接到隔离网络
启动两个容器,都加入 secure_net:
docker run -d --name web --network secure_net nginx:alpine
docker run -d --name db --network secure_net mysql:8.0
此时两个容器虽然在同一网段,但因为 ICC 被禁用,无法互相 ping 通。
验证隔离效果
进入 web 容器尝试 ping db:
docker exec -it web sh
ping db
应该一直卡住(无响应)。
按 Ctrl+C 退出。
再用 mysql 客户端尝试连接 3306 端口同样会失败。
如果想验证“默认网络可以通信”的对比效果,可以用 docker network create default_net(不设 ICC 选项),重复以上步骤就能看到 ping 成功。
避坑指南
- 不要使用默认
docker0网络:默认网络 ICC 是开启的,且无法动态关闭。必须创建自定义网络。 - 检查宿主机防火墙:如果宿主机开启了 iptables 并限制了 FORWARD 规则,可能影响容器通信,但 ICC 关闭后容器间会被直接阻断。确保宿主机没有额外放行规则。
- 使用
--internal的副作用:--internal会禁止容器访问外部网络(如互联网),如果你需要容器能向外请求(例如拉取依赖),请不要用--internal,而用上面的 ICC 关闭方法。 - 容器名解析:即使 ICC 关闭,DNS 解析仍然有效,但底层流量会被拒绝。在容器中执行
getent hosts db仍能拿到 IP,但ping db不通,这是正常现象。
如何进一步加固
如果需求更严格,可以考虑:
- 使用 macvlan 或 ipvlan 网络,让容器直接使用物理网络,但这种方法配置复杂,适合高级用户。
- 配合 iptables 或 nftables 编写白名单规则,只在必要容器间开放特定端口。
- 使用 Docker Compose 的场景,在
network定义中直接设置enable_icc: false(需注意 Compose 版本)。
常见问题解答
Q:为什么我创建网络时加上了 ICC 关闭参数,容器之间还是能 ping 通?
A:检查是否使用了自定义网络名称,并且容器确实连接到了该网络。可以用 docker inspect 容器名 | grep Networks 确认。如果容器还连接了其他网络(如默认 bridge),则可能通过其他网络通信。确保容器只有一个网络接口。
Q:关闭 ICC 后,容器还能访问外部互联网吗?
A:可以,ICC 仅限制容器间通信,不影响容器通过宿主机 NAT 访问外网。
Q:我已有大量容器在默认网络,怎么批量迁移?
A:需要逐一 docker network disconnect bridge 容器名 然后 docker network connect secure_net 容器名。建议在业务低峰期操作,并提前验证新网络的连通性。
总结
容器网络隔离是防范内网横向渗透的基础手段。
通过创建自定义 bridge 网络并关闭 ICC,能有效阻断攻击者在容器间的横向移动。
本文的步骤从环境准备到验证,零基础也能照做。
如果你正在部署业务容器,建议优先实施网络隔离策略,再根据实际需求微调防火墙规则。
遇到异常时回看避坑部分,通常会找到原因。