LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-19

はじめに

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

スクリーンショット 2016-12-19 15.38.33.png

   |
   | 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応答を返してくる。

スクリーンショット 2016-12-19 15.50.48(2).png

名前解決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プロキシを使わない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0