nftables 如何匹配的 TCP 中存在 Payload 数据包?

3 天前
 SunBK201

nftables 貌似不支持 ip length - ip hdrlength * 4 - tcp doff * 4 > 0 这种算术操作。

989 次点击
所在节点    宽带症候群
14 条回复
birdvdsk
3 天前
你的具体需求是什么
SunBK201
3 天前
@birdvdsk 我需要使用 nftables 把包含 payload 的 TCP 数据包 hook 到用户态的 nfqueue 进行处理,之前的做法是对全部的 TCP 数据包进行 hook ,但是性能损耗太大,所以想要加一层过滤。
birdvdsk
3 天前
可以利用 tcp 标志位,将 ACK ,PSH ,FIN 等可能携带数据的数据包使用 nftables 过滤。但是话说回来,经过 Linux 网络栈的情况下进行性能优化是比较困难的。
luojiyin87
3 天前
语法要换成“比较 + 加法/移位”,不必写减法链式公式。

nft add rule inet payload_queue pre ip protocol tcp \
ip length > (ip hdrlength << 2) + (tcp doff << 2) \
queue num 100 bypass
SunBK201
3 天前
@luojiyin87 似乎有语法错误? Error: syntax error, unexpected hdrlength, expecting ')'
SunBK201
3 天前
@birdvdsk 我也有想到,但是只用 flag 可能有漏报吧
unused
2 天前
试着读一下 payload 呢
@th,0,8 & 0 == 0
unused
2 天前
th -> ih
SunBK201
2 天前
@unused 这个方法刚刚我也发现了,但是 ih 似乎需要比较新的 nftables 版本,旧版本不支持🥲
xqzr
2 天前
TCP 头,长度不固定。没有 @ih 应该不好匹配...
这些规则,曾用于:将选项 MSS 替换为 NOP (相当于,删除 MSS )
tcp flags syn @th,160,8 set 1 continue
tcp flags syn @th,168,8 set 1 continue
tcp flags syn @th,176,8 set 1 continue
tcp flags syn @th,184,8 set 1
JoeSmith
2 天前
试试 eBPF 呗
ysc3839
2 天前
直接用 DPDK 吧?
v1
2 天前
eBPF 解万忧
maybeonly
2 天前
iptables 倒是有 -m bpf 可以做,不过 nft 说这个不优雅,不要了
要么就上 ebpf 吧,或者 nfqueue/rawsocket 用户态实现
顺便说。用命令行查看计数器这个操作也挺慢的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1178293

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX