BPF と NFTables パケット マーキングを備えた TC フィルター

BPF と NFTables パケット マーキングを備えた TC フィルター

TC BPF 入力プログラムを作成し、NFTables でマークされた特定のパケットのみを処理するようにしたいと考えています。特定のパケットをマークする NFPables テーブルは次のとおりです。

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 

7ここで、TC BPF プログラムをアタッチして、マークされたパケット (この場合は としてマークされている)にのみ適用しようとしています。

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 フィルターについてはまだあまり詳しくありません。そのため、明らかな点を見逃していたらお詫びします。

どのような助けでも大歓迎です。お時間を割いていただきありがとうございます。

関連情報