是否可以使用 丢弃所有带有负载的 TCP SYN 数据包nftables
?
手册页提到了各种length
选项,但没有一个是我可以在没有语法错误的情况下处理 TCP 数据包的。
我正在使用内核 v6.2.10 和 nftables v1.0.7。
是否可以使用 丢弃所有带有负载的 TCP SYN 数据包nftables
?
手册页提到了各种length
选项,但没有一个是我可以在没有语法错误的情况下处理 TCP 数据包的。
我正在使用内核 v6.2.10 和 nftables v1.0.7。
今天nftables不存在针对此的直接功能。nftables的原始有效负载功能对此来说太有限了。TCP 段没有数据长度的直接标头信息。它的标头长度为 as并且对于到达数据部分没有用。iptables的匹配可以做得更好但仍然不够:它可以链接计算并获得指向 TCP 数据有效负载开始的指针并匹配它们的内容(好吧nftables最近
@th,96,4 << 2
u32
@ih
可能会做同样的事情)。尽管如此,由于它既不能做减法也不够灵活,它不能用于计算数据有效载荷长度但可能已经足够好了(“[skb->data,skb-> 之外的任何内存访问end] 导致匹配失败。”:对于 1 到 3 之间的数据大小,行为可能未定义)。对于它的价值,tcpdump的 BPF可以为 IPv4 做这样的计算,因为它知道如何做减法:
在 IPv4 案例中使用查找表
无法在运行时计算的内容有时可以预先计算并放入查找表中。对于 IPv4 和nftables ,可以构建一个查找表,其中包含三元组(IP Total Length、IHL、Data Offset )的所有有效值,其中 TCP 数据大小将为零,并匹配(或不匹配)该查找表。
11x11=121 种可能性,其中 IP 长度(总长度)= IHLx4 + DOx4
注意:对于 IPv6 及其在固定标头和最终协议 (TCP) 标头之间可变数量的额外标头,无法使用这种方法,因为查找表可能有非常大的尺寸,而不仅仅是 121 个元素.
tcpsynzero.nft
:首先加载
nft -f tcpsynzero.nft
(表已加载但处于休眠状态,因此未启用,因为如果没有加载集,它将丢弃所有 SYN)。generatetriplets.bash
用于生成nftables命令以填充集合的Bash 脚本:填充集:
最后启用表(重新声明表几乎是一个空操作,除了它删除休眠标志):
测试
在 Linux 6.1.x 和 nftables 1.0.7 上测试,并通过(ab)使用TCP 快速打开和一些强制模式:
位于 192.0.2.2 的 Linux 服务器安装了nftables规则集。
和
Linux 客户端
和
立即工作:
第一个 SYN 被阻止(并在 1 秒后使用正常 SYN 重试):
注意:在客户端而不是服务器上使用nftables规则集进行测试没有延迟,因为drop的输出判定会立即触发套接字错误,但内核会立即使用正常 SYN 重试。丢弃规则中的计数器当然仍然递增,因为数据包仍然被丢弃。
在其他nftables案例中使用了类似的解决方法:Nftables timestamp map