IPv6 – ICMPv6とは
ICMPv6(Internet Control Message Protocol for IPv6)は、IPv6で利用される制御用のプロトコルです。IPv4で利用されていたICMPに加えて、IPv6ではさらに多くの機能を担っています。具体的にはエラー通知やネットワーク情報収集だけでなく、ARPに相当するアドレス解決、アドレス重複検出、マルチキャスト制御といった機能も含まれます。IPプロトコル番号は58であり、RFC4443で定義されています。基本的なパケットフォーマットはIPv4のICMPと類似しています。
ICMPv6メッセージの分類
ICMPv6のメッセージは大きく二つに分かれます。タイプ0~127はエラーメッセージ、128~255は情報メッセージです。さらにIPv6固有の近隣探索メッセージも用意されています。
| カテゴリ | タイプ | メッセージ |
|---|---|---|
| エラー | 1 | Destination Unreachable(宛先到達不能) |
| 2 | Packet too Big(パケット過大) | |
| 3 | Time Exceeded(時間切れ) | |
| 4 | Parameter Problem(パラメータ異常) | |
| 情報 | 128 | Echo Request(エコー要求、ping) |
| 129 | Echo Reply(エコー応答) | |
| 130 | Multicast Listener Query | |
| 131 | Multicast Listener Report | |
| 132 | Multicast Listener Done | |
| 近隣探索 | 133 | Router Solicitation(ルータ要請) |
| 134 | Router Advertisement(ルータ広告) | |
| 135 | Neighbor Solicitation(近隣要請) | |
| 136 | Neighbor Advertisement(近隣広告) | |
| 137 | Redirect(リダイレクト) |
Router Solicitation / Router Advertisement
これらはノードとルータの間でやり取りされ、IPv6の自動設定に不可欠です。
- ノードにIPv6アドレスを自動的に割り当てる
- 接続リンクのプレフィックスを通知して、直接通信可能なアドレス範囲を識別
- パケットのネクストホップを決定
- MTUなどのパラメータを伝達
- 接続可能なルータの存在を検出
Neighbor Solicitation / Neighbor Advertisement
隣接ノード間でのアドレス解決や状態確認に利用されます。
- IPv4のARPに相当し、IPv6アドレスとMACアドレスを関連付ける
- 自身が利用しようとするIPv6アドレスが他ノードと重複していないか検出(DAD: Duplicate Address Detection)
- 通信相手ノードが応答しなくなった場合に到達不能を検出
Redirect
ルータが、より適切な転送先が存在することをノードに知らせる仕組みです。IPv4のICMPリダイレクトと同じ役割を持ちます。
IPv6 – Neighbor Discoveryとは
IPv4では宛先のMACアドレスを知るためにARPを利用し、ブロードキャストで問い合わせを行います。一方IPv6ではブロードキャストが存在しないため、代わりに Neighbor Discovery(ND、近隣探索) を用いてMACアドレスを解決します。この仕組みは ICMPv6のNeighbor Solicitation(NS)メッセージ と 要請ノードマルチキャストアドレス を利用する点が特徴です。
| バージョン | 説明 |
|---|---|
| IPv4 | ARPブロードキャストで宛先MACを取得 |
| IPv6 | ICMPv6 NSメッセージと要請ノードマルチキャストで宛先MACを取得 |
データリンク層アドレス解決の流れ
IPv6ノードはインターフェースにIPv6アドレスを持つと、そのアドレスから導出される 要請ノードマルチキャストアドレス に自動的に参加します。
通信の流れは次の通りです。
- 送信元ノードは宛先のMACアドレスを知るため、宛先の要請ノードマルチキャストアドレス宛に NSメッセージ を送信する
- 宛先ノードは自身のMACアドレスを含む NAメッセージ を返信する
- これにより送信元ノードは宛先ノードのMACアドレスを学習し、IPv6通信が可能となる
この関係をIPv4に当てはめると NS = ARPリクエスト、NA = ARPリプライ に相当します。
通信例
| 項目 | ノードA | ノードB |
|---|---|---|
| グローバルユニキャストアドレス | 2001:1:1:1::1111:1111 | 2001:1:1:1::2222:2222 |
| 要請ノードマルチキャスト | FF02::1:FF11:1111 | FF02::1:FF22:2222 |
| IPv6マルチキャストMAC | 33:33:FF:11:11:11 | 33:33:FF:22:22:22 |
| MACアドレス | 1111:1111:1111 | 2222:2222:2222 |
Neighbor Discoveryキャッシュの確認方法
IPv4のARPキャッシュに相当するものがIPv6にも存在し、Cisco IOSでは以下のコマンドで確認できます。
| バージョン | コマンド | 説明 |
|---|---|---|
| IPv4 | show ip arp | ARPキャッシュを確認 |
| IPv6 | show ipv6 neighbors | Neighbor Discoveryキャッシュを確認 |
IPv6 の PINGコマンド
IPv4では1つのインターフェースに通常1つのIPアドレスを設定しますが、IPv6では複数のアドレスを持つことができます。特にリンクローカルアドレスとグローバルユニキャストアドレスの2種類は必ずといっていいほど利用されます。疎通確認を行う場合は、まず隣接ルータのリンクローカルアドレス宛てにPINGを実行して、同じセグメント内での通信が成立するか確認します。
リンクローカルアドレス宛てにPINGを送る場合は、必ず送信元インターフェースを明示する必要があります。なぜならリンクローカルアドレスはセグメント内でしか有効でなく、複数のインターフェースに同じリンクローカルアドレス範囲が存在し得るからです。
例として、隣接ルータにリンクローカルアドレス FE80::1 でPINGする場合は次のように実行します。
Router# ping ipv6 FE80::1 source FastEthernet0/0
一方、グローバルユニキャストアドレス宛てにPINGする場合はルーティングが働くため、送信元インターフェースを指定する必要はありません。
隣接機器のIPv6アドレスを確認したい場合には次のコマンドが有効です。
Router# show cdp neighbors detail
IPv6 のネイバーテーブル
IPv4ではARPキャッシュを show ip arp で確認できますが、IPv6ではNeighbor Discoveryによって学習した情報をネイバーテーブルとして保持します。確認コマンドは以下の通りです。
Router# show ipv6 neighbors
ネイバーテーブルに表示される内容は以下の通りです。
| 項目 | 説明 |
|---|---|
| ① | 検出されたネイバーのIPv6アドレス |
| ② | ネイバー情報の有効期限(minutes単位) |
| ③ | ネイバーのMACアドレス |
| ④ | 到達状態(STALE=最近通信なし、REACH=到達確認あり など) |
| ⑤ | ネイバーを検出した自機のインターフェース |