我制作了一个 TC BPF 入口程序,希望它只处理由 NFTables 标记的特定数据包。这是我标记特定数据包的 NFTables 表:
table ip compressor_tc {
chain prerouting {
type nat hook prerouting priority -99; policy accept;
ip daddr 10.50.0.3 tcp dport != ssh mark set 0x00000007
ip saddr 10.50.0.4 udp dport 1337 mark set 0x00000008
}
}
我创建了以下qdisc
方式:
tc qdisc add dev ens18 root handle 1: prio
现在,我尝试附加 TC BPF 程序并将其仅应用于标记的数据包(在本例中标记为7
):
tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1 bpf obj testBPF_Prog.o section test
但是,我收到以下信息:
root@test02:/home/dev/CompressorV2_TC/src# tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1 bpf obj testBPF_Prog.o section test
What is "bpf"?
Usage: ... fw [ classid CLASSID ] [ indev DEV ] [ action ACTION_SPEC ]
CLASSID := Push matching packets to the class identified by CLASSID with format X:Y
CLASSID is parsed as hexadecimal input.
DEV := specify device for incoming device classification.
ACTION_SPEC := Apply an action on matching packets.
NOTE: handle is represented as HANDLE[/FWMASK].
FWMASK is 0xffffffff by default.
如果我做:
tc filter add dev ens18 parent 1:0 bpf obj testBPF_Prog.o section test
TC BPF 程序连接正常,但它会扫描所有数据包。如果我这样做:
tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1
这不会输出任何错误,但是 BPF 程序未附加。
我觉得 TC 程序不知道参数何时fw
结束。因此,它认为该bpf
参数是参数的一部分fw
。
我想知道是否有可能将这些语句分开,如果可以,这能实现我想要的效果吗?我一直在网上查看文档,但没有找到任何方法可以做到这一点。
我在带有内核的 Ubuntu 18.04 LTS VM 上执行此操作5.6.1-050601-generic
。
我对 TC 过滤器还不太熟悉。因此,如果我遗漏了一些显而易见的内容,我深表歉意。
非常感谢您的帮助,并感谢您的时间!