web-dev-qa-db-ja.com

ブリッジのスレーブインターフェイスでパケットを読み取ります

ブリッジ(br0)に接続された2つのインターフェイス(eth0、eth1)がある場合、特定のインターフェイスとそのインターフェイスでのみ受信されたパケットを受信できるように、各スレーブインターフェイスにソケットをバインドしたいと思います。 。説明されているように(スレーブインターフェイスをブリッジに追加する前または後に)ソケットをバインドできますが、ブリッジに追加されたパケットは受信されません。

または、ブリッジインターフェイスでリッスンし、recvfrom()を使用するなど、受信したパケットがどのスレーブを経由したかを検出する手段がありますが、struct sockaddr_ll.sll_ifindexがブリッジインターフェイスを示しているため失敗します。これは、ソケットがsll_ifindex=0(任意のインターフェイス)にバインドされていないか、バインドされていない場合にも当てはまります。

更新

ebtables BROUTING エントリは、ブリッジに転送される対象のパケットをブロックできる可能性があり、その結果、スレーブインターフェイスにバインドされたソケットを介して表示される可能性があります。私はまだこれを調査していません。

ブリッジ構成の場合、スレーブには通常IPアドレスが定義されていないため、それほど有用ではない場合があります。 ARPパケットの受信は問題になりませんが(PF_PACKET, SOCK_RAWソケット仕様のイーサネットタイプで指定できます)、DHCPパケットにはIPのイーサネットタイプとユーザースペースフィルタリングが必要です。おそらく、私の答えで提案されているlibpcapを介してカーネルフィルターを使用するよりも大幅に効率が低くなります。それはBROUTINGフィルターの効果によると思います。

バックグラウンド

わかりました、私は私が本当にやろうとしていることについて大騒ぎします。ステーションモード(一部のアクセスポイントに)で接続されたWLANインターフェイス(プライマリと呼びます)を使用し、そのインターフェイスを別のインターフェイス(セカンダリ)、イーサネットまたはアクセスポイントを実行している2番目のWLANインターフェイス(ホストパッドを使用)にブリッジしたい)。サブネットDHCPサービスは、プライマリインターフェイスを介して提供されます。こことオンの両方でたくさんの質問があります nix&Linux なぜそれが機能しないのかを説明する答えがあります: ワイヤレスネットワークをLANにブリッジするどのように設定しますかたとえば、WiFiからDebianを使用したイーサネットへのネットワークインターフェイスブリッジ?

NATまたは IPレベルのプロキシ などの他のソリューションタイプではなく、ブリッジを使用することに興味があります。ブリッジは、ブロードキャストおよびマルチキャストトラフィックもサポートする必要があります。ユニキャストとして。これがすぐに機能しない基本的な理由と、4addrモードとWDS(私の場合は適用されません)を使用する可能性と制限を理解しています。

実際、箱から出して動作させるにはそのような問題があるため、最近のLinuxカーネル 全面的に禁止されています ブリッジにステーションモードのWLANインターフェイスを追加することについて。その制限を元に戻すのは比較的単純なカーネルパッチです。

これで、 ネットワーク接続のブリッジング:ワイヤレスNICとのブリッジング で説明されている ebtables を使用する手順は、ほとんどの方法で実行できます。この例では、ebtablesエントリのペアを介して各ブリッジホストを手動で構成する必要があり、それらのホストの静的IPアドレス構成を意味します。セカンダリインターフェイスに接続されているホストのDHCP構成はサポートしていません。

BusyBox または dhcp-helper からのdhcprelayの使用は、トラフィックを確認したり、トラフィックがどのインターフェイスから来ているかを識別できないことを除いて、ストーリーの一部である可能性があります。インターフェイスがブリッジに追加されました。これは、それらの操作に不可欠であり、上部の私の質問のソースです。

DHCP要求を中継することに加えて、そのトラフィックとARPトラフィックを監視して、ebtablesエントリの自動追加と削除を管理し、キープアライブメカニズムとして合成ARPトラフィックを使用できるようにしたいと考えています。

2
awy

オプションとして、対象のインターフェースごとにインスタンスで libpcap を使用することもできます。 pcapは、ブリッジに追加されたインターフェイス上のパケットを確認できるようです。私は今のところこのアプローチを採用しています。パケットフィルターの費用が多額になるとは思えません。

しかし、libpcapがスレーブインターフェイスレベルでパケットをどのように見るかを理解していないことを認めます。また、私が理解している限り、AF_PACKET, SOCK_RAWを使用しています。 PACKET_MMAPの使用に関連する何かがあるかもしれません。私はどこにも行かずに、ソケットフィルタープログラムの存在や欠如などをいじってみました。

0
awy