commentIPv6シリーズ第2弾(第3弾があるかどうかは未定)。TUN/TAPを使って、IPv6の仮想デバイスを作ってそこでIPv6のパケットをキャプチャするサンプルを作ってみました。ちなみに、単純にパケットの内容を見たい場合は、tcpdumpなどをご利用ください。プログラムにIPv6パケットを取り込んでなんとかしたい人は参考にしてください。簡単な解説はそのあとに書きました。ipv6dump.cとかでできます。tap%dなどとスーパーユーザで実行してください。引数は仮想デバイスの名前。%dとかprintfライクな書式を指定してあげるとOSで勝手に番号を振ってくれます。(他の書式がどれくらい使えるのかは知りません。2001:db8:1::10などIPv6のパケットが発生するコマンドを別のコンソールから入力するとそのパケット(というか近隣探索のICMPv6パケット)が見られます。仮想デバイスをIPv6パケットのデフォルトルートにしてしまって、そこに流れ込んできたIPv6パケットのヘッダ部分(オプション含まず)とペイロードを表示するというものです。(他のノードと通信中のパケットをキャプチャする機能はありません。)他にIPv6なネットワークデバイスがある場合、そちらのネットワーク向けのパケットはそちらのデバイスに行くので表示されません。別にデフォルトルートが存在するときの動作は未確認です。コンソール上でq[Enter]を入力すると終了します。ソースの説明22行目~TAPデバイスを作る処理です。参考URLに記載したサイトにあるものを参考にさせていただきました。TUNデバイスで生のIPv6パケットをとれれば楽だったのですが、うまくいかなかったのでTAPデバイスにてetherヘッダから解析しています。IPv6パケットを解析する処理です。linux/ipv6.hにもipv6_hdrというIPv6パケットの構造体の定義があったのですが、netinet/in.hをincludeすると定義が重複してコンパイルエラーになります。コンパイルエラーは回避できるのですが、RFC3542ではnetinet/ip6.hに定義が書いてあることになっているので、今回はそちらの方に合わせました。オプションヘッダは解析していません。(ちゃんと書くと大変そうだったのでやめました。)144行目~IPv6のソケットでifupすると、リンクローカルアドレスが(OSによって)割り当てられるようです。いちいち外部コマンドでupするのもあれなので、プログラムの中に書きました。168行目~作ったデバイスをIPv6のデフォルトルートにする処理です。これもいちいち外部コマンドで設定するのがあれだったので、プログラムの中に書きました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。