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)时间复杂度的分类查找。

ACL匹配流程(DPDK多比特Trie实现) 接收数据包 提取五元组(SrcIP/DstIP/Port/Proto) 多比特Trie查找(O(1)) 匹配判断:是否命中规则? 否 是 未命中:执行默认拒绝 命中:执行规则动作(Allow/Deny) 说明:DPDK ACL使用多比特Trie将规则集编译为查找表,匹配过程无回溯,性能恒定

4.3.1 匹配步骤详解

  1. 包解析:从数据包头部提取源IP、目的IP、源端口、目的端口、协议号。
  2. 规则编码:将五元组转换为ACL库内部使用的位向量格式。
  3. Trie查找:以位向量为输入,在多比特Trie树中执行一次查找,直接定位到规则节点。
  4. 动作执行:根据节点存储的动作(Allow/Deny)决定数据包命运。
  5. 默认处理:若未命中任何规则,执行默认拒绝(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)匹配,性能远超传统实现。
  • 规则顺序决定优先级,默认拒绝是安全基线。
  • 规则冲突应在编译阶段解决,避免运行时逻辑错误。