VMwareのIPv6 NATを使ってみたら、IPv4 onlyホストにつながらなくなる(from Windows 10 VM)


はじめに

VMware Fusion 8, Workstation 12, Player 12 には、IPv6 NAT (NAPT)機能が提供されている。NAT配下のVMにULAを配布して、ホストOS IPv6アドレスを1つだけ持っていれば、ポート変換まで通信する事ができる。

   |
   | 2001:db8::xxxx (GUA)
[VMware]
[ NAT  ] ↓↓↓↓↓ホストOS内の仮想ネットワークの世界
   | 
   | RA     fd01:2::/64 (IPv6 ULA)
   | DHCPv4 192.168.46.0/24 (IPv4プライベート)
---+-----------------------+---
                           |
                     [VM: Windows10]

NAT配下にWindows 10のVMをおいて、RAでULAを配布してみたら、IPv4 onlyのサイト(例えばgithub.com) につながらなくなってしまった。ULAの配布をやめれば問題なくつながる。

アプリケーションの動作

FireFoxとVisutal Studio 2015 にバンドルされる git for Windows の動作例。どちらも名前解決に失敗して動作が止まる。しかしIPv4インターネットにはつながっているし、DNSサーバはAクエリに対してA応答を返してくる。

名前解決API getaddrinfo() の動き

テスト

呼び出しの前提として、github.com に2つのAレコードがついているとする

github.com.  IN A 192.30.253.112
github.com.  IN A 192.30.253.113 

IPv6デュアルスタック、VMwareのDNSプロキシを使用、かつ下記の引数で github.com の名前解決を試みると

int getaddrinfo(hints, ai0, nodename, servname)

IN hints
     .ai_family = PF_UNSPEC;
     .ai_socktype = SOCK_STREAM;
     .ai_flags = 0;
OUT ai0
IN nodename = "github.com";
IN servname = "https";

呼び出し関数戻り値(結果)は

OS IPv6あり (デュアルスタック) IPv6なし (IPv4 only)
Windows 10 Pro 失敗(EAI_FAIL)※1 成功※2
Ubuntu 16.04 LTS 成功※3 成功※3
FreeBSD 11.0-RELEASE 成功※4 成功※4

分析&推測

ケース ※1 (Windows デュアルスタック)

getaddrinfo() 自身が失敗で終わるのでIPv4アドレスも取れない。CNAMEのループを処理できなくなりEAI_FAILが返すのではないかと思う。EAI_FAILのテキスト表現、gai_sterror() の出力は "non-recoverable failure in name resolution"

ケース ※2 (Windows IPv4 only)

Windows Vista以降では、IPv4 onlyの環境ではAAAAクエリの生成しないので、AAAAクエリの応答に対する回答を解釈しない。CNAMEのループを処理する必要がないため、成功を返すと推測している。

ケース ※3 (Linux glibc)

名前解決は成功するが同じアドレスが2つ重なったアドレスリストが得られる。

  1. 192.30.253.113
  2. 192.30.253.112
  3. 192.30.253.113

最初の一つ目は、AAAAクエリに対して得たA応答から作った要素、後者の2つがAクエリに対して得たA応答から要素を作り、全体のリストを作っていると推測する。

ケース ※4 (FreeBSD libc)

名前解決は成功して返却されるアドレスリストも

  1. 192.30.253.112
  2. 192.30.253.113

重複はない。ちなみに、syslogには gethostby*.getanswer: asked for "github.com IN AAAA", got type A と出力される。

原因

VMwareのDNS proxyがAAAAクエリを適切に処理できないため。動作の詳細を下記のノートのまとめてある。

workaround

VMware NATのDNSプロキシを使わない。