パケット観察、いいですよね。パケット系男子なら一度は使ってみるであろう生ソケットですが、ご無沙汰なのでここらで久しぶりに使ってみたくなりました。

何を作ろう

生ソケット使って何を作るかというと、いまいち思いつきません。仕方ないのでパケットでも眺めて楽しむことにしました。TCP とか UDP とかの IP なパケットなんて生ソケットで眺める意味は無いので、お手頃感のある ARP パケットを眺めてみることにしました。LAN 内のマシンの MAC アドレスを把握することができるのは嬉しいことです。

さて作ろう

作り方は簡単です。socket システムコールを適切に呼べそうな言語でソケットを開いてパケットを読めばよいのです。はじめは Go 言語で書こうと思ったのですが、標準モジュールでは IP ソケットしか開けないので諦めました。次に Node.js で書こうと思ったのですが、C++ でアドオン書くのに libuv のスレッド周りと格闘するのも気が狂いそうなのでやめました。最後に Ruby で書こうと思ったのですが、パケットの構造体を自分で書かないといけないので面倒になってやめました。ということで愚直に C 言語で書きました。芸がないですね。

ARP Capture

久しぶりに C 言語を書いたので命名とかいろいろ怪しいことになってますが、とりあえず動くので眺めるだけのインテリアとしては及第点でしょう。

ビルド

なにはともあれビルドです。1ファイルしかないので気楽に。

$ gcc arp.c

眺める

さて次は実行ですが、生ソケットを開くので実行するときには root 権限が必要です(CAP_NET_RAW を与えてやれば要りませんが)。場合によって須藤さん sudo とかを呼び出す必要があると思います。

また、引数にバインドするネットワークインターフェースの名前を与えてやります。

以上のことを踏まえると以下の様なコマンドを打ち込むことになります。

$ sudo ./a.out eth0

しばらく待つと流れているパケットがポツポツと表示されると思います。

まとめ

ARP はキャッシュされてしまうので、暇を持て余した休日の午後に紅茶片手に眺めるにはあまり面白いパケットだとはいえません。今回は生ソケットの意義を活かすがゆえに ARP パケットのキャプチャをしてみましたが、満足できない結果です。かといって激流でやかましいだけの IP パケットの流れを眺めるだけでは面白くありませんので、次回(いつになるんだろう)はルーターを実装してみたいと思います。