iptablesでBPFマッチングが失敗します。

iptablesでBPFマッチングが失敗します。

私はPREROUTINGテーブルのMACアドレス範囲を一致させるためにiptablesルールを使用しています。私の実装では、iptables-extensionsのBPF一致オプションを使用します。以下は、aa:bb:cc:dd:ee:ffを破棄し、すべてのバイトに一致するMACアドレスと一致する必要がある式の例です。

((ether[6:4] & 0xffffffff) = (0xaabbccdd & 0xffffffff)) && ((ether[10:2] & 0xffff) = (0xeeff & 0xffff))

出力結果によると、tcpdump -nn式が正しいようです。

tcpdump -dddあるいは、ユーティリティを介して送信されると、nfbpf_compile結果のバイトコードはiptablesルールを生成するために使用されます。

iptables -t raw -A PREROUTING -i br0 -m bpf --bytecode "BYTECODE OUTPUT" -j DROP

私の問題は、PREROUTINGテーブルでこのルールを作成するときに(実行する必要がある)パケットがほとんど破棄されないことです。ほとんどのパケットはフィルタを通過します。 INPUTテーブルにルールが作成されると、パケットは正常にブロックされているように見えます。

なぜこれが起こるのですか?

ベストアンサー1

少なくともiptables内では、これにBPFマッチングを使用できないことがわかりました。

RAWリンクタイプ(TAPデバイスなど)を使用している場合にのみ、イーサネットヘッダにBPFマッチングを使用できます。 EN10MBのみをサポートする物理デバイスを使用している場合、Ethernetヘッダーは含まれません。

この機能を実装してiptablesを使用する必要がある場合は、ヘッダー情報を表示できるTAP(または同様の)仮想インターフェイスを作成する必要があります。

おすすめ記事