Назад | Перейти на главную страницу

Фильтр 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. Поэтому прошу прощения, если я упускаю что-то очевидное.

Любая помощь приветствуется и спасибо за ваше время!