一、 UDF 核心机制
UDF 允许用户从报文的任意位置提取连续的2 个字节(16 bit)作为 ACL 匹配字段。它由三个关键参数控制:
1.Offset Type(基准点类型):定义从哪里开始算偏移。如 IPv4 (从IPv4头起)、IPv6、TCP、UDP、L4 等。
2.Offset Value(偏移值):极其重要!工具中的单位是“2字节”(Word),而非1字节。实际字节偏移量 = 填入的值 × 2。例如 Offset: 50 意味着实际偏移100 字节;Offset: 2 意味着实际偏移4 字节。
3.Offset Valid(有效性标志):用于防止报文长度不足(畸形包)导致越界提取出垃圾数据而产生“假命中”。
二、 结合示例 3.3.5 详细解释
example 3.3.5 展示了配置 DSCP 重标记和任意偏移设置:
- UDF 槽位定义:Index: 8,Type: IPv4,Offset: 50。
- 实际取数位置为:IPv4 头起点 + (50 × 2) 字节 =第 100 字节(取第 100 和 101 字节)。
- ACL 模板引用:在上方的 Template 中选择 OFFSET8(对应 UDF 索引 8),Data 填入 8899,Mask 为 FFFF。
- 含义:提取出的数据必须严格等于 0x8899。
- 为什么要加 OFFSET[0:15] 且设为 0100?
- 此字段是 UDF 的 Offset Valid(有效性标志,0x0100对应OFFSET8)。它确保提取动作合法完成,防止短包因长度不够导致提取出乱码从而误匹配。
三、 结合 ComboIndex 详细解析
ComboIndex “44” 配置
这条规则是结合 UDF 实现精准定位的典型:
核心原理(内层标签定位):
- Field 7:报文最外层的 TPID 直接写在了 Ethernet 帧头的 Ether Type 字段中,所以直接匹配。
- Field 10:该字段使用了底层 EntryAclUdfList 中 Index: 0, Type: L3, Offset: 2 的配置。
- Type: L3的基准点通常为 MAC 头结束(即外层标签起始处)。
- Offset: 2表示偏移 2 × 2 = 4 字节。
- 外层标签固定占用 4 字节(2字节TPID + 2字节TCI),偏移 4 字节后正好落在内层标签的 TPID 字段上。从而实现了 0x8100 的精确匹配。
- Field 11:0001/0001 确保提取有效,即报文长度足够。
四、 总结与易错点(重点笔记)
1.混淆的单位:OFFSET 值是 “字(Word)” 而非“字节”。一定要乘以 2才是实际字节数。这也是为什么匹配目的端口要填 1(跳过2字节),匹配内层标签要填 2(跳过外层4字节)。
2.槽位号 vs 偏移量:OFFSET8 中的 8 不是偏移量,而是底层 UDF 的Index(槽位编号)。若底层的 Index 填 8,ACL 中必须引用 OFFSET8;底层没配置的 Index,ACL 中引用也是无效的。
3.内/外标签区分:
- SPID(外层)直接看Ether Type字段。
- TPID(内层)必须通过UDF穿越外层标签(偏移4字节)才能提取。
4.安全前提:在所有涉及 UDF 精确匹配的规则中,务必设置 Offset Valid(如 OFFSET[0:15] 设为 0001/0001),这是防止畸形短包误入规则的最佳实践。