通过自定义桥接网络、docker-user链iptables规则、k8s networkpolicy及阻断跳板路径,实现容器间横向访问的精细化管控。

直接用 Docker 自带的网络驱动和配套规则,就能有效限制容器间横向访问。关键不是封死所有通信,而是按业务逻辑划分信任边界,只放行必要连接。
用自定义桥接网络做基础隔离
默认 bridge 网络下所有容器互通,这是横向攻击的温床。应为不同用途的服务创建独立网络:
- 运行
docker network create --driver bridge --internal app-net创建内部网络(--internal禁止外部路由) - 数据库、缓存等敏感服务只接入
app-net,应用服务另建web-net并禁止连入app-net - 启动容器时显式指定网络:
docker run --network web-net ...,不挂载就无法通信
配合 iptables 精准拦截跨网段访问
Docker 的 iptables 规则在 DOCKER-USER 链生效,适合加白名单或黑名单:
- 拒绝 web 容器访问数据库网段:
iptables -I DOCKER-USER -s 172.20.0.0/16 -d 172.19.0.0/16 -j DROP - 限制仅允许特定端口出向:
iptables -I DOCKER-USER -s 172.20.0.0/16 -d 172.19.0.10 -p tcp --dport 3306 -j ACCEPT - 规则插入
DOCKER-USER而非FORWARD,确保对容器流量生效
在 Kubernetes 场景下用 NetworkPolicy 控制 egress
如果容器跑在 K8s 上,NetworkPolicy 是更声明式的手段,但需注意版本支持:
- Kubernetes v1.23+ 支持
egress规则,可明确禁止访问内网敏感段,如10.10.0.0/16 - 策略中
podSelector: {}匹配命名空间下所有 Pod,policyTypes: [Egress]启用出向控制 - 低于 v1.23 的集群,需依赖 CNI 插件(如 Cilium)或宿主机 iptables 补充
避免常见绕过路径
横向访问常通过“跳板容器”或宿主机服务中转,必须一并堵住:
- 禁用容器访问
127.0.0.1上的敏感端口(Docker API、kubelet、SSH),在DOCKER-USER中丢弃对应规则 - 不挂载
/var/run/docker.sock或/run/containerd到普通业务容器 - 对运维类容器单独建高隔离网络,并限制其入站来源 IP











