MacによるDNS64/NAT64WiFiアクセスポイントの動作を確認してみました

ios

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で発見できない場合は、チェンネルを変更してみることをお勧めします。

015

準備したNAT64のWi−Fiに接続が完了すると、iPhone側の表示は次のようになります。

014 013

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ネットワークを作成」のチェックは入れていません。

001

この状態で無線LAN側のパケットモニターすると次のようになっています。

002

最初の2つが、アドレス解決のためのDNSパケットで、その後がHTTPのシーケンスになっています。

Wi-Fiを介したネットワークは、192.168.2.0/24のネットワークになっており、Macがゲートウエイ(192.168.2.1)になっています。

1つ目のiPhoneからのパケットは、www.sapporoworks.ne.jpのAレコードを問い合わせるDNSパケットです。

003

Macからは、その応答として、59.106.27.208が返されています。

004

そして、このアドレスは、インタネット上の実際のアドレスです。

$ 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を構成してみます。

005

無線LAN側のパケットをモニターすると、今度は、こんな感じです。

006

やはり、最初の2つは、アドレス解決のためのDNSパケットで、その後がHTTPのシーケンスですが、全部IPv6パケットになっています。

NAT64のネットワークでは、iPhoneは、2001:2:0:aab1:83b:9450:c687:db822001:2:0:aab1:10b5:2f94:b7dd:9d0dなどのアドレスが割り振られており、Macは、2001:2:0:aab1::1のDNSサーバとしてアクセスされています。

1つ目のiPhoneからのDNSパケットは、www.sapporoworks.ne.jpのAAAAレコードの問い合わせになっています。

007

応答として、64:ff9b::3b6a:1bd0が返されています。

008

そのあと、iPhoneは、64:ff9b::3b6a:1bd0との間にIPv6でHTTPのシーケスを構成しています。

ちなみに、www.sapporoworks.ne.jpには、実際にAAAAレコードはないため、返された、64:ff9b::3b6a:1bd0は、NAT64で擬似的に生成したものと考えられます。

また、この時、Macと実際の外部サーバとの間は、通常のIPv4で通信されていることも確認できました。

009

4 テスト環境についての考察

DNS64サーバは、クライアントから来た問い合わせを、通常利用しているDNSに問い合わせ、IPv6アドレスが解決できた場合は、そのまま、解決できなかった場合は、IPv4アドレスを引いて、その変換を行うようになっています。

010
参考:Supporting IPv6 DNS64/NAT64 Networks

開発の場面では、テスト用のモックサーバを設置することがあると思いますが、ここのでサーバの名前解決を設定しないで、http://192.168.0.100/ のようなコードがあると、このIPv6ネットワーク中では、iPhoneからのDNSリクエスト自体が出ないことを確認しました。

したがって、ネットワーク接続先への名前解決は必須であると言えます。

また、IPv4とIPv6のブリッジのあたりにも幾つかの制約あり、例えば、NAT64になっているMac自身のアドレスや、同じくMacに立ち上げたViertualBoxなどの仮想サーバのルーティングは、私が試した限りできませんでした。

[2016.06.13追記]
NAT64になっているMac自身へのアクセスは、DNSで名前解決しなくても「コンピュータ名」を指定することでアクセス可能であると教えて頂きました。 下記の設定の場合は、「PC1.local」でアクセスできます。

008

5 最後に

今回は、Macの「IPv6 DNS64/NAT64ネットワーク」について、いろいろと動作を確認してみました。 IPv6オンリーで動作できるかどうかの試験をしてみて、まったく問題が出なければそれでいいのですが、 もし、うまく動作しなかった場合、何が問題なのかを調べるためには、パケットモニターは必須のような気もしました。

6 参考資料


Supporting IPv6 DNS64/NAT64 Networks
iOS9 で必要な IPv6 only Network への対応
iOS9対応のために、IPv6 only NetworkでのiOSアプリの動作テスト方法を調べてみた