2. 基础概念:什么是 NetPolicy、策略规则组成(源/目的/端口/动作)
在租户网络拓扑中,NetPolicy 是定义流量访问控制的核心抽象层。它不关心底层物理设备(交换机、路由器、防火墙),而是以 租户、命名空间、标签 为维度,描述“谁可以访问谁、通过哪个端口、做什么动作”。理解 NetPolicy 的构成是后续分析命中率与误报的前提。
2.1 什么是 NetPolicy
NetPolicy 是一种声明式网络策略模型,通常由云原生网络插件(如 Calico、Cilium、Antrea)或 SDN 控制器统一管理。它具备以下特征:
- 面向租户:策略作用域限定在特定租户或命名空间内,避免跨租户干扰。
- 基于标签选择:通过标签(Label)匹配源/目的端点,而非固定 IP 或 MAC。
- 策略组合:多条策略可叠加,最终生效规则由策略引擎合并计算。
- 可审计:每条策略都有明确的创建时间、版本、变更记录,便于回溯。
关键区别:传统 ACL 是“设备级+IP 五元组”,NetPolicy 是“租户级+标签+端口+动作”。前者在物理拓扑上配置,后者在逻辑拓扑上声明。
2.2 策略规则组成
一条完整的 NetPolicy 规则由四个核心要素构成,缺一不可。下表列出每个要素的定义、常见取值及示例:
| 要素 | 定义 | 常见取值 | 示例 |
|---|---|---|---|
| 源(Source) | 流量发起方,可以是命名空间、标签、IP 段或服务账号 | namespace: dev, app: frontend, 10.0.1.0/24 | source: { namespace: dev, selector: app=frontend } |
| 目的(Destination) | 流量接收方,同样支持命名空间、标签、IP 段或服务 | namespace: prod, app: backend, svc: api-svc | destination: { namespace: prod, selector: app=backend } |
| 端口(Port) | 目标端口号及传输层协议 | 80/tcp, 443/tcp, 53/udp, 3000-4000/tcp | ports: [ { port: 8080, protocol: TCP } ] |
| 动作(Action) | 匹配到规则后执行的操作 | Allow, Deny, Log, Redirect | action: Allow |
规则组合原则:在大多数实现中,Deny 规则优先级高于 Allow 规则。如果一条流量同时匹配 Allow 和 Deny,则最终动作为 Deny。建议在策略设计时明确“默认拒绝,显式放行”的基线。
2.3 策略规则匹配流程
当数据包到达网络策略执行点(如 eBPF 程序、iptables 规则链、OVS 流表)时,匹配流程如下:
- 提取元组:从数据包中提取源 IP、目的 IP、协议、端口。
- 标签解析:将 IP 映射为对应的 Pod/VM 标签及所属命名空间。
- 策略遍历:按优先级顺序遍历当前租户下所有 NetPolicy 规则。
- 条件匹配:检查源、目的、端口是否全部命中规则定义。
- 动作执行:匹配到第一条规则后,执行对应动作(Allow/Deny/Log)。
- 默认拒绝:若遍历完所有规则均未匹配,则执行默认动作(通常为 Deny)。
2.4 常见策略规则示例
以下展示三种典型场景的 NetPolicy 规则定义,帮助理解源/目的/端口/动作的实际组合:
注意:以下示例使用 YAML 格式,实际策略引擎可能使用 JSON 或 Protobuf。核心要素结构一致。
# 示例 1:允许 frontend 访问 backend 的 8080 端口
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: dev
spec:
selector: app == 'backend'
ingress:
- action: Allow
source:
selector: app == 'frontend'
destination:
ports:
- 8080
---
# 示例 2:拒绝所有跨命名空间访问(除监控系统)
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: deny-cross-ns
namespace: prod
spec:
selector: all()
ingress:
- action: Deny
source:
namespace: '*'
---
# 示例 3:允许监控系统访问所有 Pod 的 9100 端口
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-monitor
namespace: prod
spec:
selector: all()
ingress:
- action: Allow
source:
selector: app == 'prometheus'
destination:
ports:
- 9100
2.5 策略命中率与误报的关联
理解 NetPolicy 基础概念后,可以建立与课程核心目标的关联:
- 命中率:指实际流量中匹配到某条策略的比例。高命中率说明策略覆盖了真实通信需求;低命中率说明策略冗余或过时。
- 误报:指策略规则与预期行为不一致,导致合法流量被 Deny 或非法流量被 Allow。常见误报原因包括:标签选择器写错、端口范围过宽/过窄、命名空间作用域遗漏。
- 复核方法:通过流量日志 + 策略审计日志,逐条对比源/目的/端口/动作是否与实际通信矩阵一致。
实践建议:在编写 NetPolicy 时,尽量使用精确的标签选择器和端口范围,避免使用
all() 或 0-65535 通配。通配越少,策略命中率越高,误报风险越低。