先週、C言語を用いて生ソケットを扱うことでARPパケットを眺めるなどしたわけですが、そのままC言語でルーターの実装を進めると心が折れそうだったのでスクリプト言語に頼ることにしました。(最初はGo言語でやるつもりだったのに挫けたというのは秘密です)

方針

C言語での実装ではネットワークインターフェースをプロミスキャス・モードにすることで、同じサブネット内を流れるすべてのARPパケットを盗み見るということをしていました。しかし、今回はRubyからioctlを叩くのは面倒な感じがしたので、自身を流れるパケットだけをながめることにしました。

また、自身を流れるパケットしか見えないという都合上、ARPパケットではあまりに流量が少ないので(プロミスキャス・モードでも少なかった)、IPヘッダを眺めることにしました。SSHでつないでいるリモートのマシンで動かすと、SSHが送受信するパケットで画面が埋め尽くされて大変つまらないことになりますから、注意が必要です。

コードをがりがり書く

というわけで、出来上がったものがこちらになります(手抜き)。お世辞にもよいコードではありませんので、あくまでRubyで生ソケットを使う時の小さなサンプルとして見てください。

packet.rb

ながめてみる

こちらのスクリプトをruby1.9.3あたりで動かしていただければ、騒がしいパケットの流れをご覧いただけるかと思います。

また、前回同様生ソケットを使っていますので、適切な実行権限を持っているかどうかに注意してください。

まとめ

さて、ルーターをRubyで実装ということで、多少実行速度に難ありな気もしないでもないのですが、パケットなんてロスしてなんぼ、TCPならきっと再送してくれると信じて怠惰な実装を進めて行きたいと思います(俺が飽きない限り)。