是否可以编写一个 nftables 规则,以 UDP 有效负载中偏移量的字节值进行过滤?我可以使用用户空间中的 netfilter 队列来执行此操作,但想知道是否有可以在实际规则中使用的表达式。
答案1
是的,你可以使用nftables 原始负载,只要它在固定位置(你不会得到 iptables 的可变位置特性'细绳匹配,也不是所有的 iptables'u32匹配功能,但也不匹配其复杂性,尤其是对于具有 TCP 选项的 TCP 数据包来说更容易)。实际上你甚至可以改变它使用足够新的内核(>= 4.10)。当然大小不能改变。
例如:当接收 UDP 目标端口 5555 数据包时,如果在数据偏移量 3-5 中找到 3 个字节 0x66 0x6F 0x6F(“foo”),则将其替换为同一数据包中数据偏移量 0-2 中的 3 个字节。值以位而不是字节为单位,UDP 数据在之后为 64 位UDP 报头(@th),因此位置 64+3*8=88,大小 3*8=24 用位置 64 大小 24 替换:
# nft add table inet myfilter
# nft add chain inet myfilter myinputmangle '{ type filter hook input priority 0; policy accept; }'
# nft add rule inet myfilter myinputmangle udp dport 5555 @th,88,24 0x666f6f @th,88,24 set @th,64,24