4. ACL基础:访问控制列表
访问控制列表(ACL)是防火墙实现包过滤的核心机制。在DPDK防火墙场景中,ACL规则引擎负责高速匹配每一个数据包,决定其“通过”或“丢弃”。本章从ACL的定义、规则格式和匹配流程三个层面,建立DPDK ACL规则引擎的理论基础。
4.1 ACL定义与作用
ACL(Access Control List)是一组有序的规则集合,每条规则定义了匹配条件和对应的动作。防火墙依据ACL对进出网络的数据包进行逐条匹配,一旦命中则执行预设动作(允许/拒绝),不再继续匹配后续规则。
ACL核心特性:
- 有序性:规则按优先级从高到低排列,匹配即停止。
- 方向性:区分入方向(Ingress)和出方向(Egress)。
- 无状态性:传统ACL不记录连接状态,每个包独立匹配。
- 默认拒绝:末尾隐含一条拒绝所有规则(Deny All)。
DPDK场景提示:DPDK ACL库使用SSE/AVX向量指令实现多规则并行匹配,单核吞吐可达数百万条规则/秒,远超传统内核态iptables。
4.2 ACL规则格式
一条完整的ACL规则由五元组匹配条件 + 动作组成。在DPDK ACL库中,规则字段被编码为固定长度的位向量,便于硬件级并行比较。
| 字段 | 长度 | 说明 | 示例值 |
|---|---|---|---|
| 源IP地址 | 32位 | 支持单IP或CIDR前缀匹配 | 192.168.1.0/24 |
| 目的IP地址 | 32位 | 支持单IP或CIDR前缀匹配 | 10.0.0.1/32 |
| 源端口 | 16位 | 支持范围匹配(如 1024-65535) | 0-65535 |
| 目的端口 | 16位 | 支持范围匹配 | 80 |
| 协议号 | 8位 | TCP(6)、UDP(17)、ICMP(1)等 | 6 |
| 动作 | — | 允许(Allow) / 拒绝(Deny) | Allow |
规则编写注意事项:
- 端口范围匹配在DPDK ACL中需转换为“最小值-最大值”区间,不能使用“不等于”逻辑。
- 协议字段若为0,表示匹配所有协议。
- 规则顺序至关重要:先写精确匹配,后写范围匹配,避免范围规则误拦截。
4.2.1 规则示例
// 规则1:允许内网192.168.1.0/24访问外网Web服务
SrcIP: 192.168.1.0/24
DstIP: 0.0.0.0/0
SrcPort: 0-65535
DstPort: 80
Proto: 6 (TCP)
Action: Allow
// 规则2:拒绝所有来自10.0.0.0/8的SSH访问
SrcIP: 10.0.0.0/8
DstIP: 0.0.0.0/0
SrcPort: 0-65535
DstPort: 22
Proto: 6 (TCP)
Action: Deny
// 规则3:默认拒绝所有(隐含规则)
SrcIP: 0.0.0.0/0
DstIP: 0.0.0.0/0
SrcPort: 0-65535
DstPort: 0-65535
Proto: 0
Action: Deny
4.3 ACL匹配流程
ACL匹配流程遵循“顺序匹配,首次命中”原则。DPDK ACL库通过构建多比特Trie树(Multi-bit Trie)将规则集编译为查找表,实现O(1)时间复杂度的分类查找。
4.3.1 匹配步骤详解
- 包解析:从数据包头部提取源IP、目的IP、源端口、目的端口、协议号。
- 规则编码:将五元组转换为ACL库内部使用的位向量格式。
- Trie查找:以位向量为输入,在多比特Trie树中执行一次查找,直接定位到规则节点。
- 动作执行:根据节点存储的动作(Allow/Deny)决定数据包命运。
- 默认处理:若未命中任何规则,执行默认拒绝(Deny All)。
性能关键点:
- DPDK ACL库使用SSE4.2/AVX2向量指令,一次比较可处理8-16个规则。
- 规则编译阶段将ACL转换为分类器(Classifier),查找阶段无分支预测失败。
- 实测单核可处理1000万+条规则匹配/秒(64字节小包)。
4.4 ACL规则优先级与冲突处理
当多条规则可能匹配同一数据包时,优先级由规则在列表中的序号决定(序号越小优先级越高)。DPDK ACL库在规则编译阶段会检测并报告冲突规则。
| 场景 | 规则A | 规则B | 匹配结果 |
|---|---|---|---|
| 精确匹配优先 | 192.168.1.1 → Allow | 192.168.1.0/24 → Deny | 规则A命中(Allow) |
| 范围重叠 | 端口80-90 → Deny | 端口85-95 → Allow | 规则A命中(Deny) |
| 完全冲突 | 0.0.0.0/0 → Allow | 0.0.0.0/0 → Deny | 规则A命中(Allow) |
冲突规则检测:DPDK ACL库在
rte_acl_build()阶段会输出警告日志,提示存在不可达规则。建议在规则部署前使用rte_acl_classify()进行验证测试。
4.5 本章小结
- ACL是防火墙包过滤的基础,规则由五元组+动作构成。
- DPDK ACL库使用多比特Trie实现O(1)匹配,性能远超传统实现。
- 规则顺序决定优先级,默认拒绝是安全基线。
- 规则冲突应在编译阶段解决,避免运行时逻辑错误。