拒绝“容器间串门”,打造严密的零信任网络!
在生产环境中,网络安全往往是最容易被忽略的部分。很多企业上线容器集群后,并未对容器之间的通信做任何限制,默认处于全通状态。
这就好比你把多个租户安置在同一栋公寓楼,却不设门禁,任何租户都能随意进出其他房间。这样一来,只要一个容器被攻破,攻击者就可以横向移动,入侵整个网络空间!
本讲将系统介绍如何隔离容器间的网络通信,从底层网络模型、Kubernetes 网络策略,到服务网格的流量管理,构建一道“看不见的防火墙”。
一、容器网络通信的默认状态
大部分 CNI(如 Flannel、Calico)部署后,Pod 默认可以跨命名空间通信。这种全互通的设计虽然简化开发调试,但也极大地降低了安全性。
⚠️ 默认无 ACL、无认证、无隔离!
示例:未隔离的 Pod 网络
这种“裸奔”的网络状态对于敏感业务是不允许的。
二、网络隔离的三大防线
容器网络隔离并非单点施策,而应从以下三层联动发力:
| 层级 | 防御机制 | 核心工具 |
|---|---|---|
| 容器网络层 | namespace 隔离 | iptables / bridge rules |
| Pod 层 | 网络策略控制 | Kubernetes NetworkPolicy |
| 应用服务层 | 服务身份验证与控制 | Istio / Linkerd 等 Service Mesh |
三、使用 Kubernetes NetworkPolicy 进行隔离
3.1 什么是 NetworkPolicy?
Kubernetes 提供的 NetworkPolicy 是一种声明式网络访问控制规则,可以限制哪些 Pod 可以通信、允许哪些端口、协议。
3.2 一个简单示例:只允许 frontend 访问 backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: demo
spec:
podSelector:
matchLabels:
role: backend
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
图示说明:
四、NetworkPolicy 的进阶用法
4.1 限制出站访问(egress)
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
4.2 按命名空间隔离
from:
- namespaceSelector:
matchLabels:
team: frontend
这允许只来自某个命名空间的流量通过,是团队间隔离的常用方法。
五、容器网络隔离中的常见问题
| 问题 | 说明 | 建议 |
|---|---|---|
| NetworkPolicy 不生效 | CNI 插件不支持 | 推荐使用 Calico/Cilium 等支持策略的插件 |
| DNS 不通 | 忘记允许 kube-dns | 手动加入 DNS 白名单规则 |
| 新加容器默认无访问权限 | Policy 默认拒绝所有通信 | 添加默认允许策略或设置 fallback 策略 |
六、服务网格下的流量隔离:Istio 实战
除了传统的 L3/L4 网络控制,服务网格(如 Istio) 提供更高阶的 L7 流量控制,支持:
- 请求认证与授权
- mTLS 加密通信
- 流量细粒度控制(按 Header、路径、用户)
示例:拒绝未认证的服务访问 payment 服务
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: payment-authz
spec:
selector:
matchLabels:
app: payment
rules:
- from:
- source:
requestPrincipals: ["cluster.local/ns/prod/sa/frontend"]
七、完整隔离模型图示
八、网络隔离的最佳实践清单 ✅
- ✅ 使用支持 NetworkPolicy 的 CNI,如 Calico、Cilium
- ✅ 默认创建“Deny All”策略,按需开放
- ✅ 启用 Namespace Selector 做多团队隔离
- ✅ DNS 等基础服务单独白名单放行
- ✅ 配合 Istio 实现 L7 级别的服务身份认证和授权
- ✅ 加入容器创建 Pipeline 的 CI/CD 校验中
九、小结
容器的网络隔离不能靠“规则约定”,而是要靠“技术手段硬控”。Kubernetes 提供的 NetworkPolicy 是第一道防线,而 Istio 的服务网格功能则为我们在应用层构建了更强大的零信任网络边界。
记住一句话:不要让任意容器可以访问任意目标!