2

Boost.Asio エクステンションを使用してブリッジ (レイヤー 2 スイッチ) を作成しました。タイプ要件を満たす追加のソケット、エンドポイント、およびプロトコルを簡単に作成できます。そして、私の拡張機能はAF_PACKETSOCK_RAWおよびで Linux パケット ソケットを使用しますhtons(ETH_P_ALL)(パケット ソケットの詳細については、を参照man 7 packetしてください)。

私のブリッジがどのように機能するかを説明する例を次に示します。

[PC1] <----> IF1[PC2]IF2 <----> [PC3]

ブリッジは、ネットワーク インターフェイス (例: eth0) IF1 と IF2 を接続し、PC1 が PC2 で実行されているブリッジを介して PC3 と通信できるようにします。インターフェイスを接続する方法は、受信したパケットを IF1 から IF2 に送信することです (逆も同様です)。

私のブリッジは、有線接続では期待どおりに動作しますが、無線接続では動作しません。そこで、この問題の原因を突き止めようとしたところ、ARP 要求がまったく成功しなかったことがわかりました。

この問題を引き起こす実際の環境は次のとおりです。

[PC1] <--wired--> eth0[PC2]wlan0 <--wireless(802.11g)--> [router1]

上記の環境下で、例えば今、PC1 は ping(ICMP) パケットを router1 に送信しようとします。PC3に送信するには、PC1はrouter1のMACアドレスを知っている必要があるため、PC1はARP要求を送信FF:FF:FF:FF:FF:FFし、PC2で実行されているブリッジはeth0から受信してwlan0に送信しますが、router1はarp応答をPC1に送信しません.

注: SOCK_RAW パケットは、パケット データを変更せずにデバイス ドライバーとの間でやり取りされます。(パケットのマニュアルページから引用)

PC1 が router1 と通信できるようにするにはどうすればよいですか?
ありがとうございました。

編集:
これが私の Boost.Asio 拡張機能です。
github: pfpacket/libarex
そして、これは上記を使用した私のブリッジです。
libarex/example/layer2_switch/interface_bridge.cpp

4

2 に答える 2

1

コメントで議論したことを書き留めています。

ワイヤレス ブリッジングに問題があるのはよくある問題です (少なくとも Linux では、他の人にはわかりません)。調査の結果、ブリッジとして使用されているハードウェアのワイヤレス ドライバまたはチップセットが、ブリッジ操作を実行できない可能性が高いことが示されました (brctl障害はこの仮定を裏付けています)。

上記のリンクで説明されているように、他の考えられる理由として、AP が関連付けられていない MAC アドレスなどを含むパケットをドロップしている可能性があります。

さらに、コードは有線インターフェイスで正常に動作するため、一部のレイヤーのハードウェアの問題です。それについては、これ以上言うことはありません。

于 2012-10-26T19:12:09.553 に答える
0

bridge-utils次のようなものを使用して、インターフェイスをブリッジする必要があります。

# brctl addbr mybridge0
# brctl addif mybridge0 eth0
# brctl addif mybridge0 wlan0

(PC2上;)

于 2012-10-26T07:40:29.043 に答える