私は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(または同様の)仮想インターフェイスを作成する必要があります。