Linux の promiscuos mode でパケットをつくって通信をこころみると,いろいろ予期しないトラブルがおこる. きょう経験したのは,ずっと一様にパケットを送信し,通過させているにもかかわらず,間欠的にパケットがとおらなくなるという問題だ.
3 台のマシンを用意してから実験にとりかかれば,あるいは問題はおこらなかったのかもしれない. しかし,とりあえず最初は 1 台,つぎに 2 台のマシンでやろうとしたのが,そもそものまちがあなのかもしれない. 1 台のマシンに 4 個のネットワーク・インタフェースをとりつける. 全部 PCI にするとたりないので,一部は USB-Ether インタフェースにする. そのマシンから promiscuous mode のひとつのプログラムで送出した Ethernet パケットを,LAN ケーブルをループさせてそのマシンの第 2 のインタフェースにもどす. (勝手につくったへんなプロトコルではなくて,Wireshark がちゃんと認識できる Ethernet のパケットなのだ.) IP だとこんなことをすると通信できないが,non IP ならこれで (LAN カードのドライバなどがちゃんとできていれば) 通信できる.
もどってきたパケットをべつの promiscuous mode のプログラムで第 3 のインタフェースにそのまま転送する. それをふたたびループさせて第 4 のインタフェースにもどす. これで,第 1 と第 4 のインタフェース間でちゃんと通信できるかどうかをみる (各プログラムをテストする). これがうまくいかない.
しかたがないから第 4 のインタフェースにもどすかわりに他のマシンをつないでみる. しかし,それでもうまくいかない. なにがおこったかというと,一方向はちゃんとパケットがながれるのだが,反対方向はときどき数 10 秒間くらい通信がとまる. しばらくすると通信は再開する. そのとき,どこかにたまっていたパケットが最初は 10 個くらいつづけざまにながれる. そのあとしばらくはもっともらしく通信して,またとまる. これをずっとくりかえすのだ. よくみるとパケットのペイロードの内容もかわっている. もしかすると Ethernet フレームに指定した type 0x88b5 がいけないのかもしれない. そうでなければペイロードがかきかえられるなんてかんがえられない.
いろいろしらべてみると,Realtek の RTL8169 という石をのせたギガビット・イーサのカードがわるいらしい. ほかのインタフェースはちゃんとパケットをとおしてくれる. 0x88b5 というタイプは IEEE 802.1 Local Experimentl Ethertype 1 ということになっているので,つかってもよさそうなのだが,すくなくともこのカードではつかえないらしい. それが真の原因かどうかはまたいろいろしらべまわらなければならないので,とりあえずこのカードが原因だとわかったところで調査をとめた. とりあえず,ほかのカードをつかうことにする. ギガビットである必要はないのだ.
関連項目 (2012-9-22 追記):