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では試してない

コメント

このブログの人気の投稿

4.3.0 Temporary Lookup Failureでドツボってた話

tomcat起動時の環境変数でJRE_HOMEを指定するときに

何が得られて何処へ向かうかだけを問うべき