Windows 7/8.1/10 IPv6 と名前解決
謎事象でハマった
あるリモートのサーバーがIPv4とIPv6(ULA)の両方のIPアドレスを持っているとする。
hoge.dom.labnet
IPv4 Address (Private): 10.10.0.1
IPv6 Address (ULA): fdaa:abcd:aaaa:bbbb:cccc:dddd:eeee:0001
またプライベートIPv4アドレスとIPv6 ULAを持つWindows機があり、
このOSからリモートサーバーに対する ping コマンドは正しく応答が返る状態になっている
ping -4 10.10.0.1
ping -6 fdaa:abcd:aaaa:bbbb:cccc:dddd:eeee:0001
Windows機の%windir%\system32\drivers\etc\hostsに以下のようにIPv4アドレスとホスト名を登録している 。(** IPv6アドレスについては書いてない **)
10.10.0.1 hoge.dom.labnet
さらにWindowsOSが参照しているDNSではdom.labnetゾーンに以下のようなAとQuad Aレコードを持っている。
hoge IN A 10.10.0.1
hoge IN AAAA fdaa:abcd:aaaa:bbbb:cccc:dddd:eeee:0001
そのため このWindows機から
nslookup -type=A hoge.dom.labnet では 10.10.0.1が得られる
nslookup -type=AAAA hoge.dom.labnet では fdaa:abcd:aaaa:bbbb:cccc:dddd:eeee:0001が得られる
ここまでは想定通り。
この時
ping -4 hoge.dom.labnet は(おそらくhostsによる)名前解決されて正しく応答を得られる
ping -6 hoge.dom.labnet は ホスト名が見つかりません。といわれて失敗する
WindowsOSにおける名前解決の順序としては 1) DNS resolver cache, 2)hosts, 3) DNS, 4) NetBIOS となるはず。
Windows 名前解決の順序
1)は無いものとしても、v6アドレスのhoge.dom.labnetの解決については、hosts見に行って なければ DNS探してくればいいじゃんくらいの気持ちでいたが上記の挙動からはちょっと違うらしい。
リゾルバキャッシュがきいているのかと思ったけどipconfig /flushdnsしても変わらないのであまり関係なさそう。
この場合の解決方法は2とおり見つかっていて、
A) hostsファイルから hoge.dom.labnetのエントリを削除
10.10.0.1 hoge.dom.labnet をコメントにするか削除したら
ping -6 hoge.dom.labnetはDNSが教えてくれたアドレスに通信できた
B) hostsファイルに hoge.dom.labnetのIPv6アドレスの行を追記
10.10.0.1 hoge.dom.labnet
fdaa:abcd:aaaa:bbbb:cccc:dddd:eeee:0001 hoge.dom.labnet
としてやると
ping -6 hoge.dom.labnetはhostsをつかってv6アドレスを解決して通信できる。
同じホスト名に対してIPv4,IPv6片方しか記述されていないとうまく行きませんというのが何か理由はあるのだろうけど。
hostsにとあるホストについての行をIPv4, IPv6どちらかしか書いてはならないならB案での解決策は効果がないことになるのでそんなことはないだろうしよくわからない。
あとLLAとGUAでは試してない
コメント
コメントを投稿
「コメントを投稿できるユーザー」の範囲は変更される可能性があります。