Filtro TC com marcação de pacote BPF e NFTables

Filtro TC com marcação de pacote BPF e NFTables

Fiz um programa de ingresso TC BPF e quero que ele processe pacotes específicos marcados apenas por NFTables. Aqui está minha tabela NFTables que marca os pacotes específicos:

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
        }
}

Eu criei a qdiscvia:

tc qdisc add dev ens18 root handle 1: prio 

Agora, estou tentando anexar o programa TC BPF e aplicá-lo apenas aos pacotes marcados (neste caso, marcados como 7):

tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1 bpf obj testBPF_Prog.o section test

No entanto, recebo o seguinte:

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.

Se eu fizer:

tc filter add dev ens18 parent 1:0 bpf obj testBPF_Prog.o section test

O programa TC BPF se conecta bem, mas verifica todos os pacotes. Se eu fizer:

tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1

Isso não gera nenhum erro, mas o programa BPF não está anexado.

Parece-me que o programa TC não sabe quando o fwparâmetro termina. Portanto, pensa que o bpfparâmetro faz parte do fwparâmetro.

Estou me perguntando se é possível separar essas declarações e, em caso afirmativo, isso alcançará o que estou tentando fazer? Estive pesquisando a documentação on-line, mas não encontrei nenhuma maneira de fazer isso.

Estou fazendo isso em uma VM Ubuntu 18.04 LTS com kernel 5.6.1-050601-generic.

Sou relativamente novo no filtro TC. Portanto, peço desculpas se estou perdendo algo óbvio.

Qualquer ajuda é muito apreciada e obrigado pelo seu tempo!

informação relacionada