はじめに
このドキュメントでは、NAT(STUN)サーバ用のセッショントラバーサルユーティリティの必要性、STUNサーバに関連するネットワークアドレス変換(NAT)設定のタイプ、NATがこの設定でどのように問題を引き起こすのか、およびソリューションについて説明します。
背景説明
NATデバイスの主な目的は、ローカルエリアネットワーク(LAN)内のプライベートIPアドレスを持つデバイスが、インターネットなどのパブリックアドレス空間内のデバイスと通信できるようにすることです。ただし、NATデバイスは内部ホストがパブリックスペースに接続することを許可することになっていますが、エンドユーザがクライアントとサーバの両方として動作して双方向のエンドツーエンド通信を維持する必要があるVoIP、ゲーム、WebRTC、ファイル共有などのポイントツーポイント(P2P)アプリケーションの場合、NATではこれらのUDP接続を確立することが困難になります。NATトラバーサル技術は、通常、これらのアプリケーションを動作させるために必要です。
NATトラバーサルの必要性
現在、インターネット上でのリアルタイムの音声およびビデオコミュニケーションは主流で、VoIPコールをサポートする複数の一般的なインスタントメッセンジャー(IM)があります。VoIPの初期導入における大きな課題は、ほとんどのPCやその他のデバイスがファイアウォールの背後に配置され、プライベートIPアドレスを使用していることです。NATを使用したファイアウォールによって、ネットワーク内の複数のプライベートアドレス(IPアドレスおよびポート)が1つのパブリックアドレスにマッピングされます。ただし、エンドデバイスはパブリックアドレスを認識していないため、VoIP通信でアドバタイズするプライベートアドレスでリモートパーティからの音声トラフィックを受信できません。
一方的なSelf-Address Fixing(UNSAF)プロセスは、発信側エンドポイントが、別のエンドポイントに対して既知のアドレス(およびポート)を決定または修正しようとするプロセスです。たとえば、プロトコル交換でアドレスデータを使用したり、接続を受け取るパブリックアドレスをアドバタイズしたりできるなどです。
したがって、検討中のP2P接続はUNSAFプロセスです。 P2Pアプリケーションがピアリングセッションを確立し、NATと相性を保つ一般的な方法の1つは、登録とピアディスカバリの目的で、公開アドレス指定可能なランデブーサーバを使用する場合です。
NAT用のセッショントラバーサルユーティリティ
RFC 5389に従って、STUNはNATを扱うツールを提供します。エンドポイントが、プライベートIPアドレスとポートに対応するNATデバイスによって割り当てられたIPアドレスとポートを判別する手段を提供します。また、エンドポイントがNATバインディングを有効に保つ方法も提供します。
NAT実装のタイプ
UDPのNAT処理は実装によって異なることが確認されています。実装で観察される4つの処理は次のとおりです。
フルコーン:フルコーンNATとは、同じ内部IPアドレスとポートからのすべての要求が同じ外部IPアドレスとポートにマッピングされるNATです。さらに、どの外部ホストも内部ホストにパケットを送信でき、マッピングされた外部アドレスにパケットを送信します。
制限付きコーン:制限付きコーンNATとは、同じ内部IPアドレスおよびポートからのすべての要求が同じ外部IPアドレスおよびポートにマッピングされるNATです。完全コーンNATとは異なり、外部ホスト(IPアドレスX)は、内部ホストが以前にIPアドレスXにパケットを送信した場合にのみ、内部ホストにパケットを送信できます。
ポート制限付きコーン:ポート制限付きコーンNATは制限付きコーンNATと似ていますが、ポート番号が制限に含まれます。具体的には、内部ホストが以前にIPアドレスXとポートPにパケットを送信していた場合にだけ、外部ホストは内部ホストに送信元IPアドレスXと送信元ポートPを含むパケットを送信できます。
対称:対称NATは、同じ内部IPアドレスおよびポートから特定の宛先IPアドレスおよびポートへのすべての要求が、同じ外部IPアドレスおよびポートにマッピングされるNATです。 同じホストが同じ送信元アドレスとポートを持つパケットを異なる宛先に送信する場合、異なるマッピングが使用されます。 さらに、パケットを受信する外部ホストだけが、UDPパケットを内部ホストに返信できます。
送信元(A、Pa)(AはIPアドレス、Paは送信元ポート)がNATデバイスを介して宛先(B、Pb)および宛先(C、PC)と通信するトポロジについて考えてみます。
NAT実装のタイプ |
(B、Pb)宛てのパブリックソース |
(C、Pc)宛てのパブリックソース |
宛先(例:(B、Pb))は(A、Pa)にトラフィックを送信できますか。 |
円錐全体 |
(X1、Px1) |
(X1、Px1) |
Yes |
制限付き円錐 |
(X1,Px1) |
(X1,Px1) |
(A、Pa)が最初にトラフィックをBに送信した場合のみ |
ポート制限付きコーン |
(X1,Px1) |
(X1,Px1) |
(A、Pa)が最初に(B、Pb)にトラフィックを送信した場合のみ |
対称 |
(X1,Px1) |
(X2、Px2) |
(A、Pa)が最初に(B、Pb)にトラフィックを送信した場合のみ |
NATトラバーサルおよび対称NATの問題
STUNサーバは、STUNクライアントから送信されたSTUNバインド要求に応答し、クライアントのパブリックIP/ポートを提供します。現在、このアドレスとポートの組み合わせは、ピアツーピア通信シグナリングでSTUNクライアントによって使用されます。ただし、エンドホストが同じプライベートアドレス/ポートを使用する(STUN応答で提供されるパブリックIP/ポートにバインドされていると仮定する)ようになったため、対称型NAT 実装が使用される場合、NATデバイスはそれを同じIPではなく別のポートに変換します。signalingが以前のポートに基づいて接続を確立しているため、これによってUDP通信が切断されます。
PATを実行するCisco IOS® ルータのNAT 実装は、デフォルトで対称になっています。したがって、NATを実行するこれらのルータでは、UDP接続の問題が発生することが予想されます。
ただし、Cisco IOS-XEルータのPAT実行時のNAT実装は対称的ではありません。同じ送信元IPとポートを持ち、宛先が異なる2つの異なるストリームを送信すると、送信元は同じ内部グローバルIPとポートにNAT変換されます。
問題の解決策
この説明から、エンドポイントに依存しないマッピングを実行すると問題を解決できることが明らかです。
RCFC 4787:With Endpoint-Independent Mapping(EIM)に従って、NATは同じ内部IPアドレスおよびポート(X:x)から任意の外部IPアドレスおよびポートに送信される後続のパケットのポートマッピングを再利用します。
エンドホストがクライアントから、2つの異なるターミナルウィンドウでコマンドnc -p 23456 10.0.0.4 40000およびnc -p 23456 10.0.0.5 50000を実行した場合のNAT変換の結果をEIMを使用する場合を次に示します。
Pro Inside global Inside local Outside local Outside global
tcp 10.0.0.1:23456 192.168.0.2:23456 10.0.0.4:40000 10.0.0.4:40000
tcp 10.0.0.1:23456 192.168.0.2:23456 10.0.0.5:50000 10.0.0.5:50000
ここでは、同じ送信元アドレスとポートを持つさまざまなトラフィックフローが、宛先ポートやアドレスに関係なく、同じアドレスやポートに変換されることが確認できます。
Cisco IOSルータでは、ip nat service enable-sym-portコマンドを使用して、エンドポイントに依存しないポート割り当てを有効にできます。
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipaddr_nat/configuration/15-mt/nat-15-mt-book/iadnat-fpg-port-alloc.html
要約
Cisco IOSのNAT実装は、ポートアドレス変換(PAT)の使用時にはデフォルトで対称になっており、NATトラバーサルにSTUNなどのサーバを必要とするP2P UDPトラフィックを通過する際に問題を引き起こす可能性があります。これを機能させるには、NATデバイスでEIMを明示的に設定する必要があります。