Фильтр TC с маркировкой пакетов BPF и NFTables

Фильтр TC с маркировкой пакетов BPF и NFTables

Я сделал программу входа 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 с ядром 5.6.1-050601-generic.

Я новичок в TC filter. Поэтому прошу прощения, если я упускаю что-то очевидное.

Любая помощь будет высоко оценена, и спасибо за ваше время!

Связанный контент