21. NAT トラバーサル

NAT トラバーサルとは、NAT(Netowork Address Translation)を使用している環境下において、P2P 通信を確立するための機能です。

NAT トラバーサル機能の利用方法については、 4.20. をご覧ください。

NEX ではほとんどの一般的な環境下での NAT トラバーサルに対応していますが、特定のネットワーク構成下での NAT トラバーサルをサポートしていません。 アプリケーション開発者がこれらを意識して実装する必要はありませんが、開発・デバッグ中の問題切り分けのために必要な点について解説します。

21.1. NAT タイプの分類

NEX では NAT タイプを2種類のマッピングタイプと 2 種類のフィルタリングタイプによって分類します。 マッピングタイプとフィルタリングタイプの組み合わせで合計 4 種類の NAT タイプが存在します。 クライアントの IP アドレスを192.168.0.1、NAT のグローバル側に割り当てられたIP アドレスを 10.10.10.1、 通信相手のアドレスを[10.10.10.10:10000]、[10.10.10.11:10000] の 2 台と仮定して説明します。

  • マッピングタイプ

    マッピングタイプは2つのアドレスに順番にパケットを送信した場合のグローバル側ソースポート割り当ての変化から判定します。

    • EIM(Endpoint Independent Mapping)

      同一のローカルソースポートから別々の宛先に対してパケットを送信した場合に、書き換え後のグローバルソースポートが同一になるようなマッピングです。

      [192.168.0.1:10000:10.10.10.10:10000]→[10.10.10.1:10000:10.10.10.10:10000]

      [192.168.0.1:10000:10.10.10.11:10000]→[10.10.10.1:10000:10.10.10.11:10000]

    • EDM(Endpoint Dependent Mapping)

      同一のローカルソースポートから別々の宛先に対してパケットを送信した場合に、書き換え後のグローバルソースポートが異なるマッピングです。

      [192.168.0.1:10000:10.10.10.10:10000]→[10.10.10.1:10000:10.10.10.10:10000]

      [192.168.0.1:10000:10.10.10.11:10000]→[10.10.10.1:10001:10.10.10.11:10000]

  • フィルタリングタイプ

    フィルタリングタイプはあるアドレスにパケットを送った後、そのアドレスの別ポートから送られてきたパケットがNAT でフィルタされるかどうかで判定します。 ここでは[10.10.10.10:10000]にある種のサーバープログラムが稼働していて、 パケットを受信するとその送信元アドレスに対して10000, 10100の2つのポートからレスポンスを返すと仮定します。 この状態で端末が[10.10.10.10:10000]に対してパケットを送信した場合、端末のLAN側ではそれぞれ次のようなパケットが観測できます。

    • PIF(Port Independent Filtering)

      [192.168.0.1:10000:10.10.10.10:10000] //端末からの送信

      [10.10.10.10:10000:192.168.0.1:10000] //サーバーからの1つ目のレスポンス

      [10.10.10.10:10100:192.168.0.1:10000] //サーバーからの2つ目のレスポンス

    • PDF(Port Dependent Filtering)

      [192.168.0.1:10000:10.10.10.10:10000] //端末からの送信

      [10.10.10.10:10000:192.168.0.1:10000] //サーバーからの1つ目のレスポンス

      //サーバーからの2つ目のレスポンスは届かない

一般的に EDM よりも EIM、PDF よりも PIF の方が NAT トラバーサルの成功率が高くなりますが、 NEX ではすべての NAT タイプの組み合わせをサポートしています。

21.2. NAT タイプの確認方法

3DS の本体設定からインターネット設定の接続テストを実行することで接続中のネットワークの NAT タイプを取得できます。 接続テストで取得できるサポートコード(上画面の右下に表示される値)の上位 2 桁が NAT タイプ対応付けられています。 対応関係は Figure 21.1 に示す通りです。例えばサポートコードが 110 の場合は EIM-PIF となります。

../_images/Fig_NATType_CTR.png

Figure 21.1 サポートコードとNATタイプの対応関係

また、CTR の接続テストは NAT タイプ判定を2回行い、EDM の場合にポートの予測が可能かどうかを判定しています。 サポートコードの下位の2桁は以下の意味を持ちます。

  • 00 : NAT種別の判定処理が正常に完了した。EDMの場合には外側ポートは規則的に割り当てられる。ただし、インクリメンタルに割り当てられるかまでは判定できません
  • 01 : EDMの場合に外側ポートがランダムに割り当てられる。
  • 02 : :判定を行うごとにNAT種別が異なる。上位2桁は1回目の結果を表示します。
  • 99 : NAT種別判定サーバーとの通信に失敗し、NAT 種別を判定できなかった。この場合、サポートコードの上位2桁は通常00となります。

21.3. NEX でサポートしないネットワーク構成

以下のネットワーク構成は NEX ではサポートしていません。 これらのネットワーク構成下にあるクライアントでもゲームサーバーにログインすることはできますが、 P2P 通信に失敗することがあります。

  • ポートの割り当てルールがランダムな EDM : ポートの割り当てルールがランダムであるため、将来のパケットがどのようなポートにマッピングされるか予測する事ができません。
  • ポートの割り当てルールがデクリメンタルな EDM : パケットの入れ替わりによってデクリメンタルEDMと誤判定される事を防ぐため、また、デクリメンタルEDMの数がインクリメンタルEDMと比べて圧倒的に少ないため、NEXではサポートしていません。
  • EDMの配下に複数台の端末 : パケットの送信タイミングが一致するとポート予測に失敗するため、サポートしません。同じ EDM ルータの配下に 2 台以上のクライアントが同じセッションに参加している場合などに問題が発生しやすくなります。
  • 3 段以上の多段 NAT : 接続先のクライアント側が 3 段以上の多段NAT構成になっている場合、接続先のクライアントが最初に送信する TTL 値 3 のパケットが、最も外側の NAT に届きません。そのため、接続元のクライアントから来たパケットを最も外側のルータが弾いてしまうため、通信に失敗します。
  • SPI 機能を持ったルータへの NAT トラバーサル(近接している場合のみ): NEX ではSPI (Stateful Packet Inspection) 対策として、接続先のクライアントが最初にTTL値 3 に設定したパケットを送信します。このパケットは接続先のクライアント側の NAT テーブルを更新するためだけに送信しています。このパケットが届いてしまうような距離で、接続元のクライアント側が SPI 機能を持ったルータであった場合に通信に失敗する事があります。なお、 SPI 機能はルータの機種により振る舞いがが異なります。SPI 機能を有しているルータであっても、ネットワーク的に近接しているルータ間の通信で問題が発生するとは限りません。

アプリケーションの実装によってこれらの振る舞いが変わることはないため、開発者がこれらを意識して実装する必要はありません。 ただし、開発中に少数のルータ配下に多数のクライアントを接続させてデバッグする場合などで問題が顕在化することがあります。 P2P セッションに参加できないなど、P2P 通信に問題があると思われる場合にはネットワークの構成をご確認ください。