MacによるDNS64/NAT64WiFiアクセスポイントの動作を確認してみました
1 はじめに
2016年6月1日から、iOS9ではIPv6環境で動作することを審査でチェックされます。
Supporting IPv6-only Networks
そして、OS X 10.11以降で、DNS64/NAT64のWiFiアクセスポイントを構築し、IPv6環境だけでアプリが動作できるかどうかを確認する方法が提供されています。
Supporting IPv6 DNS64/NAT64 Networks
今回は、このDNS64/NAT64の動作を確認してみました。 なお、パケットのモニターには、Wiresharkを使用させて頂きました。
2 DNS64/NAT64の環境構築
共有ネットワークの構成では、Wi-Fiを有線LANにバインドする設定を行いますが、この時、チャンネルの競合に注意が必要です。 設定しても、iPhoneで発見できない場合は、チェンネルを変更してみることをお勧めします。
準備したNAT64のWi−Fiに接続が完了すると、iPhone側の表示は次のようになります。
DNSには、IPv6のアドレスが表示されますが、IPアドレスのところは何も表示されませんでした。
※このネットワークに接続できるのは、iOS9以降なので注意してください。
3 動作確認
まず、次のようなテストアプリを作成し、最初に通常のNAT環境で動作確認をしました。
(1) テストアプリ
テスト用アプリは、ボタンをタップすると指定したサーバ(www.sapporoworks.ne.jp)からHTTPでテキストを取得するだけのものです。
- (IBAction)tapButton:(id)sender { NSURL *URL = [NSURL URLWithString:@"http://www.sapporoworks.ne.jp/sample.txt"]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; [manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { NSString* str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@", str); } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }]; }
(2) 通常のNATネットワーク
まだ、「NAT64ネットワークを作成」のチェックは入れていません。
この状態で無線LAN側のパケットモニターすると次のようになっています。
最初の2つが、アドレス解決のためのDNSパケットで、その後がHTTPのシーケンスになっています。
Wi-Fiを介したネットワークは、192.168.2.0/24のネットワークになっており、Macがゲートウエイ(192.168.2.1)になっています。
1つ目のiPhoneからのパケットは、www.sapporoworks.ne.jpのAレコードを問い合わせるDNSパケットです。
Macからは、その応答として、59.106.27.208が返されています。
そして、このアドレスは、インタネット上の実際のアドレスです。
$ nslookup www.sapporoworks.ne.jp Server: 10.63.200.10 Address: 10.63.200.10#53 Non-authoritative answer: www.sapporoworks.ne.jp canonical name = spw02.sakura.ne.jp. Name: spw02.sakura.ne.jp Address: 59.106.27.208
(3) NAT64ネットワーク
次に「NAT64ネットワークの作成」にチェックを入れて、NAT64を構成してみます。
無線LAN側のパケットをモニターすると、今度は、こんな感じです。
やはり、最初の2つは、アドレス解決のためのDNSパケットで、その後がHTTPのシーケンスですが、全部IPv6パケットになっています。
NAT64のネットワークでは、iPhoneは、2001:2:0:aab1:83b:9450:c687:db82や2001:2:0:aab1:10b5:2f94:b7dd:9d0dなどのアドレスが割り振られており、Macは、2001:2:0:aab1::1のDNSサーバとしてアクセスされています。
1つ目のiPhoneからのDNSパケットは、www.sapporoworks.ne.jpのAAAAレコードの問い合わせになっています。
応答として、64:ff9b::3b6a:1bd0が返されています。
そのあと、iPhoneは、64:ff9b::3b6a:1bd0との間にIPv6でHTTPのシーケスを構成しています。
ちなみに、www.sapporoworks.ne.jpには、実際にAAAAレコードはないため、返された、64:ff9b::3b6a:1bd0は、NAT64で擬似的に生成したものと考えられます。
また、この時、Macと実際の外部サーバとの間は、通常のIPv4で通信されていることも確認できました。
4 テスト環境についての考察
DNS64サーバは、クライアントから来た問い合わせを、通常利用しているDNSに問い合わせ、IPv6アドレスが解決できた場合は、そのまま、解決できなかった場合は、IPv4アドレスを引いて、その変換を行うようになっています。
参考:Supporting IPv6 DNS64/NAT64 Networks
開発の場面では、テスト用のモックサーバを設置することがあると思いますが、ここのでサーバの名前解決を設定しないで、http://192.168.0.100/ のようなコードがあると、このIPv6ネットワーク中では、iPhoneからのDNSリクエスト自体が出ないことを確認しました。
したがって、ネットワーク接続先への名前解決は必須であると言えます。
また、IPv4とIPv6のブリッジのあたりにも幾つかの制約あり、例えば、NAT64になっているMac自身のアドレスや、同じくMacに立ち上げたViertualBoxなどの仮想サーバのルーティングは、私が試した限りできませんでした。
NAT64になっているMac自身へのアクセスは、DNSで名前解決しなくても「コンピュータ名」を指定することでアクセス可能であると教えて頂きました。 下記の設定の場合は、「PC1.local」でアクセスできます。
5 最後に
今回は、Macの「IPv6 DNS64/NAT64ネットワーク」について、いろいろと動作を確認してみました。 IPv6オンリーで動作できるかどうかの試験をしてみて、まったく問題が出なければそれでいいのですが、 もし、うまく動作しなかった場合、何が問題なのかを調べるためには、パケットモニターは必須のような気もしました。
6 参考資料
Supporting IPv6 DNS64/NAT64 Networks
iOS9 で必要な IPv6 only Network への対応
iOS9対応のために、IPv6 only NetworkでのiOSアプリの動作テスト方法を調べてみた