如何使用 tc 来匹配入口数据包的特定有效负载,例如,如果 IP/UDP 数据包的前 32 位有效负载等于某个常数$c
,则该值$c
应更改为$d
?这对于可变长度 IP 标头尤其有效。
看起来u32
过滤器应该能够执行匹配。以下尝试是否正确?我不太确定nexthdr
具体的部分。
tc filter add dev protocol ip parent ffff: u32 match $c 0xffffffff at nexthdr+8
现在pedit
可以用来更改数据包,但我没有找到一种方法来写入$d
具有可变长度 IP 标头的数据包的 UDP 有效负载。
任何帮助表示赞赏。
答案1
看起来我们可以使用IP地址表示法,即使事情实际上与IP地址无关。例如,这有效:
tc filter add dev eth0 parent 1: u32 match ip src 64.0.0.0/4 at 0 action pedit pedit munge offset 0 u8 set 0x10 retain 0xf0 continue
这指定源地址64.0.0.0/4
为 0,这实际上意味着0x40000000/0xf0000000
匹配任何 IPv4 数据包。然后它将版本号更改为1(自然将其视为无效而丢弃)。