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  # 预期失败
最佳实践:始终使用自定义bridge网络,并设置 --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;
}
安全警告:自签名证书无法防止中间人攻击。生产环境必须使用企业CA或公共CA签发的证书,并启用证书吊销列表(CRL)或OCSP Stapling。

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
关键配置:在Docker daemon启动参数中添加 --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'
合规提示:金融、医疗等受监管行业应选择支持FIPS 140-2验证的加密模块(如Calico的WireGuard模式),并启用审计日志记录所有网络策略变更。Cilium的Hubble组件可提供完整的L7流量审计,满足PCI DSS日志要求。

4.5 网络隔离与加密通信架构总览

下图展示了一个典型的多层安全网络架构,包含外部防火墙、Docker主机iptables规则、自定义bridge网络隔离、以及容器间的mTLS加密通信。

Docker网络安全隔离与加密通信架构 外部网络 宿主机防火墙 iptables DOCKER-USER链 自定义bridge ICC=false 容器组A app1:443 (TLS) app2:8080 容器组B backend:8080 cache:6379 容器组C db:5432 (仅内部) 容器间mTLS加密通信(Sidecar代理) Envoy / Linkerd / Istio 自动注入TLS证书 网络审计日志(Hubble / Flow日志) 记录所有连接、策略命中、拒绝事件

4.6 网络策略实施步骤清单

  1. 评估网络驱动:根据应用隔离需求选择bridge(单机)或overlay(集群),避免使用host驱动。
  2. 启用容器间隔离:自定义bridge网络设置 --icc=false,仅允许显式链接的容器通信。
  3. 配置防火墙白名单:在DOCKER-USER链中添加来源IP白名单,拒绝所有未授权访问。
  4. 启用传输加密:Swarm集群使用 --opt encrypted;独立容器部署Sidecar代理实现mTLS。
  5. 部署CNI网络策略:使用Calico或Cilium定义基于标签的入站/出站规则,最小权限原则。
  6. 开启审计日志:启用Hubble或Flow日志,记录所有网络连接和策略变更,保留至少90天。
  7. 定期渗透测试:使用工具如 kube-bench、trivy 扫描网络配置漏洞。
常见陷阱:Docker的 --link 参数已废弃,但仍被部分旧脚本使用。它会在容器间创建环境变量传递,可能导致敏感信息泄露。始终使用自定义网络 + DNS解析替代。