ネットワークプログラミング NDP(近隣広告)編


IPv4とIPv6には互換性がなくパケットの構造も全く違っています。
そのためIPv4で実現していた技術もIPv6では違った方法で実装することになります。

アドレス解決もその一つです。

IPv4ではIPアドレスからリンク層アドレスをARPというプロトコルが使われていましたが、IPv6ではこれをICMPv6が担当し、IPv6でのアドレス解決は近隣探索と呼ばれています。

近隣探索の一つである「近隣広告」をうまい具合に使うと以下のようなことがIPv6ネットワークで実現できます。


そこで今回は同一セグメント内のマシンの近隣キャッシュを上書きしてルーターになりすましてみましょうか。

近隣広告のパケット構造


まずは近隣広告パケットについて見ていきましょう。

タイプ、コード、チェックサムがありICMPv6で共通のフィールドです。

  1. タイプ ICMPv6メッセージのタイプ 今回は136(近隣広告)
  2. コード ICMPv6メッセージのコード 今回は0
  3. チェックサム 擬似IPv6ヘッダーを含めた近隣広告パケット全体のチェックサム


IPv4の場合と違いIPv6ではICMPv6のチェックサムの計算対象に擬似IPv6ヘッダーを含める必要があります。
誤送信を防ぐためらしいです。
https://tools.ietf.org/html/rfc4443


近隣広告はそこから以下の値が続きます。

  1. フラグ(1byte) 
    近隣要請、ルーターからの送信、キャッシュ上書きなどを指定する
  2. IPv6アドレス(16byte) 
    広告したいHWアドレスに紐づくIPv6アドレス
  3. オプションタイプ(1byte) 
  4. オプション長(1byte) 
    オプションタイプ、オプション長、オプションデータを含めた8オクテット単位の長さ(この場合オプションタイプ+オプション長+Macアドレス=8のため1を指定)
  5. HWアドレス(6byte) 
    広告したいHWアドレス

検証に使うマシン


LinuxとWindowsを一台ずつ用意致しました。

Linux

Windows(ターゲット)

ルーター


今回Windowsの近隣キャッシュを上書きするパケットをLinuxから送信します。

そのためパケットのIPv6アドレスフィールドとHWアドレスフィールドに、
先述したLinuxマシンの値をそれぞれ指定します。

これでWindowsの近隣キャッシュの内容が指定した値で上書きされます。

検証


検証するためのソースコード


だらだらと長いソースコードですが、重要な部分はICMPv6パケットの作成部分かと思います。


まずターゲットの近隣情報を確認します。


プログラムを動かします。


以下のようなパケットがネットワークに蔓延します。


ターゲットの近隣キャッシュを再度確認します。


成功したようです。

たしかWindowsはpingなどのICMPメッセージは破棄していたような気がしましたが、ICMPv6は受け付けるようです。

ICMPv6には他にもさまざまな役割を持ったメッセージがあります。
IPv6ネットワークではそこそこ注目されるプロトコルなのではないでしょうか。

さようなら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です