核心思路是用自定义网络切断默认互通路径,按最小权限原则划分前端、backend等专属网络,禁用隐式默认网络,设置internal:true限制出站,固定子网与DNS隔离实现通信可控与横向移动阻断。

核心思路是:用自定义网络切断默认互通路径,按最小权限原则只让必要服务共享网络,从通信层面阻断横向移动可能。
明确服务角色,划分网络层级
把微服务按访问关系归类,比如前端、API网关、业务服务、数据库、缓存等,每一类接入专属网络。不混用、不泛连。
- Web 前端只连 frontend 网络
- API 和业务服务同时接入 frontend 与 backend 网络
- PostgreSQL、Redis 等敏感后端服务仅接入 backend 网络
- 避免任何服务同时加入三个及以上网络,防止成为“跳板”
禁用默认网络,强制使用显式声明
Docker Compose 默认为项目创建一个隐式 bridge 网络,所有服务自动加入——这是横向刺探最常见的入口。必须关闭它。
- 在 docker-compose.yml 顶部添加 networks: 块,并确保每个服务的 networks: 字段只引用你明确定义的网络名
- 不写 network_mode: "default" 或依赖隐式网络
- 可配合 internal: true 屏蔽某网络对外出站能力(如 backend 网络设为 internal,则其中容器无法访问外网或宿主机)
子网固定 + DNS 隔离,增强边界可审计性
自定义网络时指定子网范围,不仅便于排查,还能防止 IP 冲突导致的路由绕过;Docker 内置 DNS 只在同网络内生效,天然形成解析隔离。
- 例如定义:frontend: {driver: bridge, subnet: "172.20.10.0/24"},backend: {driver: bridge, subnet: "172.20.20.0/24"}
- 服务间只能通过 服务名(如 db、cache)访问,且仅限同网络内解析成功
- 攻击者即使进入某个容器,也无法用 ping db 或 curl http://db:5432 探测其他层服务——因为 DNS 解析失败,网络层不通
配合启动约束与环境变量控制访问意图
网络隔离是基础,但需叠加逻辑级防护,防止配置错误或代码误连引发越权。
- 用 depends_on + healthcheck 确保服务只在依赖就绪后才启动,减少因连接未就绪导致的重试暴露
- 数据库连接字符串中,禁止硬编码 host: localhost 或 host: 127.0.0.1 ——应统一用服务名(如 host: db),否则会绕过 Docker DNS 和网络策略
- 敏感服务(如管理后台、配置中心)额外启用认证机制,不依赖网络层做唯一防线

















