docker网络策略安全防御的核心是用隔离代替放行、用显式控制替代默认互通,具体包括:弃用默认bridge网络,创建隔离的自定义网络;严格限制端口映射范围;结合iptables在docker-user链实施容器级流量过滤;对关键服务强制启用tls加密通信。

利用 Docker 网络策略加强容器化应用的安全防御,核心在于**用隔离代替放行、用显式控制替代默认互通**。Docker 原生不提供类似 Kubernetes NetworkPolicy 的声明式网络策略引擎,但可通过组合自定义网络、连接约束、宿主机防火墙(iptables/nftables)及运行时工具,实现等效的细粒度访问控制。
创建隔离型自定义网络并禁用跨网通信
Docker 默认 bridge 网络(docker0)允许所有接入容器无条件互访,这是最大风险点。必须弃用,改用用户定义桥接网络,并确保不同业务域容器处于不同网络中。
- 创建专用网络:使用
docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 frontend-net和backend-net分离前后端 - 禁止隐式连接:不使用
--link(已废弃),也不让容器同时加入多个网络;一个容器只属于一个业务网络 - 验证隔离效果:在 frontend 容器中执行
ping backend-container应失败;只有显式通过docker network connect backend-net frontend-container才能打通(且应仅用于调试)
限制容器对外暴露范围与绑定策略
端口映射是外部攻击入口,必须严格收敛暴露面。
- 禁止使用
-P(随机映射全部 EXPOSE 端口)和--net=host(完全共享宿主机网络栈) - 映射时绑定到内网 IP:如
-p 192.168.10.5:8080:80,而非-p 0.0.0.0:8080:80,避免暴露到公网或管理网段 - 对非 Web 类服务(如 Redis、PostgreSQL),不映射任何端口到宿主机;仅允许同网络内容器直连,例如后端容器用
redis://redis:6379访问
结合 iptables 实现容器级网络过滤
当需要协议级或 IP 段级控制(如只允许某子网调用 API),可在宿主机上为 Docker 网桥添加 iptables 规则:
- 定位 Docker 网桥接口:运行
ip link show | grep docker,常见为docker0或br-xxxx - 限制入向流量:例如只允许 10.10.20.0/24 访问后端容器的 3000 端口:
iptables -I DOCKER-USER -i eth0 -o br-abc123 -s 10.10.20.0/24 -p tcp --dport 3000 -j ACCEPTiptables -I DOCKER-USER -i eth0 -o br-abc123 -p tcp --dport 3000 -j DROP - 注意:规则必须插入
DOCKER-USER链(Docker 保留链,重启不丢失),而非FORWARD链
启用 TLS 加密关键容器间通信
即使网络隔离,明文传输仍可能被同网络内恶意容器嗅探。对数据库、API、消息队列等组件强制启用 TLS:
- PostgreSQL 容器启动时挂载证书并设置
ssl=on、ssl_cert_file、ssl_key_file - 应用容器连接时使用
postgres://user:pass@db:5432/db?sslmode=require - 内部 HTTPS 服务:Nginx 或 Envoy 作为反向代理终结 TLS,后端容器间走 HTTP(限于同一安全网络内)
- 跨主机场景下,优先选用 Docker Swarm overlay 网络(默认启用 VXLAN 加密)或 CNI 插件如 Calico(支持 IP-in-IP + IPsec)











