「事件は枯れたシステムが稼働する現場で起こってるんだ」と現場ですぐに役立つ知識を欲するあなたへ贈る珠玉のTips集。今回は、IPv6アドレスの自動生成による不具合解消法だ。
社内で試験的にIPv6ネットワークを構築しています。IPv6対応ルーターでネットワーク1(1:1:1:1::/64)とネットワーク2(2:2:2:2::/64)をルーティングし、各ネットワーク上にSolaris 8のホストを数台配置しています。ルーターは、ネットワーク1とネットワーク2にRA*を配信し、各ホストはRAを受け取って動的にIPv6アドレスを生成しています。最近、ネットワーク1のホストを1台だけネットワーク2へ移動しました(図1)。ネットワーク2のRAを受け取って自動的にIPv6アドレスを生成し、ネットワーク2上のホストと通信できるようになったのですが、ネットワーク1のホストとは通信ができません。何が原因なのでしょうか?
IPv6では、1つのネットワークインタフェースに対して複数のIPアドレスを割り当てることが可能です。ここでは、複数のIPアドレスを自動生成してしまったことが、通信に失敗した原因だと思われます。
質問にあるネットワーク初めからネットワーク2に移動したホスト(以下ホストA)は、ネットワーク1に接続していた時点でRAを受信してネットワーク1のIPアドレスを生成しています。さらに、ネットワーク2に移ってからもRAを受信してネットワーク2のIPアドレスを生成したため、1つのネットワークインタフェースにネットワーク1とネットワーク2のIPアドレスを持っているわけです(実行例1)。
# ifconfig -a6
lo0: flags=2000849 mtu 8252 index 1
inet6 ::1/128
hme0: flags=2000841 mtu 1500 index 2
ether 8:0:20:a2:74:4
inet6 fe80::a00:20ff:fea2:7404/10
hme0:1: flags=2080841 mtu 1500 index 2
inet6 1:1:1:1:a00:20ff:fea2:7404/64
hme0:2: flags=2080841 mtu 1500 index 2
inet6 2:2:2:2:a00:20ff:fea2:7404/64
# netstat -nr -f inet6
Routing Table: IPv6
Destination/Mask Gateway Flags Ref Use If
--------------------------- --------------------------- ----- --- ------ -----
1:1:1:1::/64 1:1:1:1:a00:20ff:fea2:7404 U 1 2 hme0:1
2:2:2:2::/64 2:2:2:2:a00:20ff:fea2:7404 U 1 0 hme0:2
fe80::/10 fe80::a00:20ff:fea2:7404 U 1 3 hme0
ff00::/8 fe80::a00:20ff:fea2:7404 U 1 0 hme0
default fe80::2a0:deff:fe27:4574 UG 1 0 hme0
default fe80::2a0:deff:fe27:4577 UG 1 0 hme0
::1 ::1 UH 1 0 lo0
RAで動的にIPアドレスを生成する場合、そのホストのデフォルトゲートウェイはRAを配信したルーターになります。通常、ネットワーク2のホストは、ネットワーク1のホスト宛てのパケットをデフォルトゲートウェイであるルーターに送ります。しかしホストAは、ネットワーク1のIPアドレスを持っているのでネットワーク1をローカルネットワークと認識し、ネットワーク1宛てのパケットをルーターへ送りません。
ローカルネットワーク上にNS*を送信して、パケットのあて先であるネットワーク1のホストのMACアドレスを探し出そうとします。ローカルネットワーク上にネットワーク1のホストは存在しないため、パケットはあて先に到達せず、通信は失敗します。これが、ホストAがネットワーク1のホストと通信できない理由です。
ホストAがネットワーク1のホストと通信するためには、ホストA上にあるネットワーク1のIPアドレスを削除します。この結果、ネットワーク1をローカルネットワークと認識しなくなるため、ネットワーク1宛てのパケットをルーターに送るようになります。
ネットワーク1のIPアドレスを削除する手順は以下のとおりです。
まず、RAで取得したIPv6アドレス情報をすべて削除します。RAによって生成されたIPv6アドレス、更新時間、有効期間の情報は、/var/inet/ndpd_state.<interface>ファイルに保存されているので、これを削除(あるいはファイル名を変更)します(実行例2)。削除後、in.ndpdデーモンを再起動すると、RAによって生成されたIPv6アドレスは初期化されます(実行例3)。
# rm /var/inet/ndpd_state.hme0
あるいは
# mv /var/inet/ndpd_state.hme0 /var/inet/ndpd_state.hme0.org
# ps -ef | grep ndpd
root 615 1 0 14:29:37 ? 0:00 /usr/lib/inet/in.ndpd
root 709 697 0 14:48:22 pts/9 0:00 grep ndpd
# kill -HUP 615
# ifconfig -a6
lo0: flags=2000849 mtu 8252 index 1
inet6 ::1/128
hme0: flags=2000841 mtu 1500 index 2
ether 8:0:20:a2:74:4
inet6 fe80::a00:20ff:fea2:7404/10
これによって、ネットワーク1とネットワーク2のIPアドレスは両方とも削除されますが、ネットワーク2上では一定期間でRAが配信されています。ホストAがそのRAを受信すると、ネットワーク2のIPアドレスは再度生成されるので、最終的にはネットワーク1のアドレスだけが削除されることになります。
Router Advertisementの略。ネットワークのプレフィックス情報を通知するために、主にルーターから配信されるメッセージ。これを受け取ったホストは、プレフィックス情報と自身のMACアドレスを組み合わせて、IPアドレスを自動生成できる。
Neighbor Solicitationの略。MACアドレスの問い合わせを行うメッセージ。IPv4でのARPの役割に相当する。
Copyright © ITmedia, Inc. All Rights Reserved.