具有 BPF 和 NFTables 数据包标记的 TC 过滤器

具有 BPF 和 NFTables 数据包标记的 TC 过滤器

我制作了一个 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 过滤器还不太熟悉。因此,如果我遗漏了一些显而易见的内容,我深表歉意。

非常感谢您的帮助,并感谢您的时间!

相关内容