我正在尝试使用 nftables [v1.0.2 (Lester Gooch)] 删除包含社区字符串“pawan”的 SNMP 数据包。我正在尝试使用 nftables 有效负载表达式 - 原始有效负载表达式来匹配包含社区字符串 public 的 SNMP 数据包,如下所示:
- nft 添加表 ip 过滤器
- nft'添加链 ip 过滤器输入 { 类型过滤器钩子输入优先级 0;策略接受;}'
- nft 添加规则 ip 过滤器输入 udp dport 161 @th,48,40 0x7077616e 丢弃
这里@th(传输头)需要偏移量和长度(以位为单位)https://www.mankier.com/8/nft#Payload_Expressions-Raw_Payload_Expression)
数据包中的 SNMP 社区字符串“pawan”由十六进制字符串 0x707177616e 表示。
要找到此十六进制字符串 0x707177616e 与 UDP 有效负载起始位置的偏移量,需要知道 UDP 有效负载的起始位置。在典型的 IP 数据包中:
以太网报头为 14 个字节。IP 报头通常为 20 个字节,但如果使用选项,则可能会更长。UDP 报头为 8 个字节。因此,UDP 有效负载通常从数据包的第 42 个字节(14 + 20 + 8)开始。
SNMP 社区字符串“pawan”从数据包的第 48 个字节(“\x70\x61\x77\x61\x6e”)开始,因此它与 UDP 有效负载开头的偏移量为 48 - 42 = 6 个字节。偏移量(以位为单位)为 6 * 8 = 48 位
字符串“pawan”的长度为 5 个字节,因此位长度为 5 * 8 = 40 位。
因此,我使用偏移量 48 和长度 40 来匹配 UDP 有效负载中的这个社区字符串。
但是,此规则并未按预期应用。nftables 内部将其视为:
nft 列出规则集表 ip 过滤器 { 链输入 { 类型过滤器钩子输入优先级过滤器;策略接受;udp dport 161 udp 校验和 112 @th,64,24 0x77616e 丢弃 } }
注意我将其配置为@th,48,40,但内核似乎将其误解为udp checksum 112 @th,64,24。所以这个nft规则不起作用。
我需要帮助来了解我是否应该做些不同的事情。任何帮助都将不胜感激。谢谢。
答案1
@th
不是 UDP 有效负载的开始——那是@ih
,而@th
实际上是吨运输Header(本例中为UDP头)。
使用 8 字节 UDP 标头,UDP 有效负载从 开始@th,64
,因此您的 SNMP 社区字符串字段位于@th,112
(如果您的 nftables 版本太旧@ih
)。同时,您的 6 字节偏移量仍在 UDP 标头内 - 并且确实是校验和字段。