パスワードを忘れた? アカウント作成
509120 journal

Yoh2の日記: 似非ブリッジプログラミング

日記 by Yoh2

トピックはネットワークだけどプログラミングの話題。

興味本位で2つのネットワークインターフェイス間のブリッジ接続をユーザーランドで実現するプログラムを作ってみた。
とはいえ、大したことはやらずに、片方のインターフェイスで読み込んだEthernetフレームをそのままもう一方に流すだけ。
MACの書き換え、MTUの調整は全く行わず。
将来、ちょっとしたパケット遅延、損失、入れ替わり、増殖をエミュレートできたらいいな、とは思っているけど、今回は本当にこれでブリッジが実現できるかを見たいだけ。
ARPなんか本当にこれで通るのか? と疑問が残るし。

さて、プログラムを作ったはいいけど、物理的にネットワークを二つ用意するのはちと厳しい。というわけでVMwareの出番。
仮想PCを3つ作り、

PC1--vmnet1--PC2--vmnet2--PC3

PC1: 172.16.1.1/24
PC2: IPアドレスなし
PC3: 172.16.1.101/24

と接続。
さて、PC1->PC3にpingを打ってみた。が、反応なし。tcpdumpで様子を見てみると、

(1) PC1: ARPで172.16.1.101を持つMACアドレスの問い合わせ
(2) PC2: PC1側のIF、(1)のパケットを受信。
(3) PC2: (2)で受信したパケットをそのままPC3側のIFで送信。
(4) PC3: (3)のパケットを受信
(5) PC3: 自分のMACアドレスを載せてPC1のMACアドレス宛に返信。
(6) PC2: (5)のパケット、届かず。

もちろん、tcpdump起動時にはIFがpromiscuousモードになっている(実際には、PC2のIFはブリッジプログラム起動時にpromiscuousモードになっている)ので、届いてさえいれば見逃すことはないはず。
ということは本当に届いていない?

ここで仮説を3つ。

A) MACアドレスを書き換えずにARPをそのまま右から左といった方法が間違い。
B) 仮想スイッチvmnet2は、その性質上、実際に一度パケットを全てのポートに送信するような真似をしなくても接続されているインターフェイスのMACアドレスが分かるため、vmnet2に繋がっていないMACアドレス宛のEthernetフレームはすべて破棄する。
C) Bに似ているが、その現象は物理的なスイッチでも起こり得る。(どうしたらそんなことができるか見当が付きませんが)

うーん。どれだろ。
一応物理的な環境を用意することもできるから、(i)まずはクロスケーブル接続でテスト、(ii)成功したらスイッチ(安スイッチだけど)を介して接続の順に実験してみるべきか。
ケーブル足りないから用意しなきゃ。めんどいなぁ。
(i)、(ii)が成功しても原因がCである可能性も否定できないし……。
まあ、直結orリピータハブ接続限定として誤魔化せるか。
いや、リピータだと、PC2が送信→リピータがPC2へ反射→PC2が反対側のIFに送信→反対側のリピータがPC2へ反射……の無限コンボもあるのか?
とすると直結専用? うあ、微妙に使えねぇ。

つか、突貫で実験するより先にプロトコルやらハブの仕組みやら勉強し直した方がよさげ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...