4. Docker网络安全:网络隔离策略、加密通信、防火墙规则、网络插件安全配置
Docker网络是容器间通信与对外暴露服务的核心通道,也是攻击面最广的环节之一。本章从网络隔离、加密通信、防火墙规则和网络插件安全配置四个维度,构建容器网络的纵深防御体系。
4.1 网络隔离策略
Docker默认提供bridge、host、none、overlay、macvlan等网络驱动,不同驱动对应不同的隔离级别。生产环境应遵循“最小连接”原则,仅允许必要的容器间通信。
4.1.1 网络驱动隔离能力对比
| 网络驱动 | 隔离级别 | 适用场景 | 安全风险 |
|---|---|---|---|
| bridge(默认) | 容器间默认互通,需手动限制 | 单机多容器应用 | 容器间无认证,易被横向移动 |
| host | 无隔离,共享宿主机网络栈 | 高性能网络服务 | 容器可监听宿主机所有端口,风险极高 |
| none | 完全隔离,无网络接口 | 离线计算、安全沙箱 | 无法对外通信,需额外配置 |
| overlay | 跨主机容器间加密通信 | Swarm/Kubernetes集群 | 需管理加密密钥与节点认证 |
| macvlan | 容器直接使用物理网络 | 遗留应用迁移、网络监控 | MAC地址欺骗、ARP攻击 |
4.1.2 自定义bridge网络与容器间隔离
使用自定义bridge网络替代默认bridge,可以实现DNS解析与自动隔离。默认bridge中所有容器可通过IP互通,而自定义bridge默认只允许同一网络内的容器通信。
# 创建自定义bridge网络,启用容器间隔离
docker network create --driver bridge \
--opt com.docker.network.bridge.name=demo_br \
--opt com.docker.network.bridge.enable_icc=false \
--subnet=172.20.0.0/16 \
secure_net
# 启动容器时指定网络
docker run -d --name app1 --network secure_net nginx:alpine
docker run -d --name app2 --network secure_net nginx:alpine
# 验证隔离:app1无法ping通app2(ICC=false)
docker exec app1 ping app2 # 预期失败
--icc=false(Inter-Container Communication)禁止容器间默认通信。仅通过显式链接或共享网络命名空间的方式开放必要端口。
4.2 加密通信
容器间通信默认以明文传输,在overlay网络或跨主机场景下,必须启用TLS/mTLS加密。Docker Swarm内置加密,独立容器可使用Sidecar代理或Service Mesh。
4.2.1 Docker Swarm overlay网络加密
Swarm模式下的overlay网络默认启用IPsec加密,数据平面和控制平面均受保护。加密由Docker内置的encrypted选项控制。
# 创建加密overlay网络(仅Swarm集群可用)
docker network create --driver overlay \
--opt encrypted \
--subnet=10.10.0.0/16 \
secure_overlay
# 验证加密状态
docker network inspect secure_overlay | grep -A5 "Encrypted"
4.2.2 独立容器的mTLS通信
对于非Swarm环境,推荐使用Envoy、Linkerd或Istio作为Sidecar代理,实现容器间的mTLS加密。以下示例使用Nginx作为反向代理,强制TLS握手。
# 生成自签名证书(生产环境应使用CA)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/certs/server.key \
-out /etc/nginx/certs/server.crt \
-subj "/CN=app1.secure.internal"
# Nginx配置强制TLS
server {
listen 443 ssl;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client on;
proxy_pass http://backend:8080;
}
4.3 防火墙规则
Docker操作iptables规则管理容器端口映射与网络流量。默认情况下,Docker会动态修改iptables,可能导致安全策略被覆盖。生产环境应锁定iptables规则,并配合Docker的--iptables=false选项。
4.3.1 Docker与iptables的交互
Docker在启动时创建DOCKER链,所有端口映射和网络转发均通过该链处理。若宿主机已有严格防火墙策略,Docker的自动规则可能绕过已有限制。
| iptables链 | Docker操作 | 安全影响 |
|---|---|---|
| FORWARD | 添加ACCEPT规则允许容器间转发 | 可能放宽默认DROP策略 |
| DOCKER | 管理端口映射DNAT规则 | 暴露端口到外部网络 |
| DOCKER-USER | 用户自定义规则(不会被Docker覆盖) | 推荐在此链添加白名单 |
4.3.2 使用DOCKER-USER链加固防火墙
DOCKER-USER链中的规则在Docker自动规则之前生效,可用于限制外部访问来源。
# 仅允许特定IP访问容器端口
iptables -I DOCKER-USER -i eth0 -p tcp --dport 443 \
-s 192.168.1.0/24 -j ACCEPT
iptables -I DOCKER-USER -i eth0 -p tcp --dport 443 \
-j DROP
# 限制容器对外访问(仅允许DNS和HTTPS)
iptables -I DOCKER-USER -o eth0 -p udp --dport 53 -j ACCEPT
iptables -I DOCKER-USER -o eth0 -p tcp --dport 443 -j ACCEPT
iptables -I DOCKER-USER -o eth0 -j DROP
--iptables=false 可完全禁用Docker自动管理iptables,但需手动配置所有转发规则。推荐在DOCKER-USER链中维护白名单,保留Docker自动管理能力的同时施加额外限制。
4.4 网络插件安全配置
第三方CNI(Container Network Interface)插件如Calico、Cilium、Weave提供更细粒度的网络策略和加密能力。选择插件时需评估其安全特性与合规要求。
4.4.1 主流CNI插件安全特性对比
| 插件 | 网络策略 | 加密方式 | 审计日志 | 合规认证 |
|---|---|---|---|---|
| Calico | Kubernetes NetworkPolicy + 全局策略 | WireGuard / IPsec | 支持Flow日志 | FIPS 140-2(部分版本) |
| Cilium | 基于eBPF的L3-L7策略 | WireGuard / IPsec / mTLS | Hubble可观测性 | CNCF认证 |
| Weave | 基于标签的简单策略 | NaCl加密(默认) | 基础日志 | 无独立认证 |
| Flannel | 无原生策略支持 | VXLAN无加密 | 无 | 不适用 |
4.4.2 Calico网络策略示例
Calico支持白名单/黑名单策略,可基于命名空间、Pod标签、IP段进行精细控制。
# 创建Calico网络策略:仅允许frontend访问backend的8080端口
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
selector: app == 'backend'
ingress:
- action: Allow
protocol: TCP
source:
selector: app == 'frontend'
destination:
ports:
- 8080
egress:
- action: Allow
protocol: UDP
destination:
ports:
- 53
selector: k8s-app == 'kube-dns'
4.5 网络隔离与加密通信架构总览
下图展示了一个典型的多层安全网络架构,包含外部防火墙、Docker主机iptables规则、自定义bridge网络隔离、以及容器间的mTLS加密通信。
4.6 网络策略实施步骤清单
- 评估网络驱动:根据应用隔离需求选择bridge(单机)或overlay(集群),避免使用host驱动。
- 启用容器间隔离:自定义bridge网络设置
--icc=false,仅允许显式链接的容器通信。 - 配置防火墙白名单:在DOCKER-USER链中添加来源IP白名单,拒绝所有未授权访问。
- 启用传输加密:Swarm集群使用
--opt encrypted;独立容器部署Sidecar代理实现mTLS。 - 部署CNI网络策略:使用Calico或Cilium定义基于标签的入站/出站规则,最小权限原则。
- 开启审计日志:启用Hubble或Flow日志,记录所有网络连接和策略变更,保留至少90天。
- 定期渗透测试:使用工具如
kube-bench、trivy扫描网络配置漏洞。
--link 参数已废弃,但仍被部分旧脚本使用。它会在容器间创建环境变量传递,可能导致敏感信息泄露。始终使用自定义网络 + DNS解析替代。