UDPホールパンチング

UDPホールパンチング（英: UDP hole punching）とは、典型的な NAT traversal 技術の1つ。

概要 
UDPホールパンチングによる NAT traversal とは、NAT を使ったプライベートネットワーク内にあるホスト同士がインターネット経由で双方向のUDPコネクションを確立する手法である。NAT には様々なものがあって動作仕様が標準化されていないため、あらゆる NAT で機能するわけではない。

NATの背後にある各ホストは、典型的には STUN や ICE を用いて通信相手との間に存在するNATの公開アドレスを取得する。この過程では、公開のアドレス空間にある第3の既知のサーバに一旦接続することでUDPポートマッピングと相手方のUDP状態を確立し、以後はパケットが違うホストから来ていても NATデバイスが状態を維持するだろうと期待して、直接的な通信に切り換える。通常、UDP状態は数十秒～数分以内に失効してクローズされてしまうので、UDPホールパンチングでは定期的な keep-alive パケットの送出が併用され、これによってNATが持つUDP状態マシンの寿命を延長する。

大企業内でよく使われている対称型NAT（双方向NAT）では、UDPホールパンチングは機能しない。対称型NATでは、既知のSTUNサーバに対するコネクションに関連するNATマッピングは、既知のサーバからの受信にしか使えないよう制限されているので、既知のサーバ側から見えるNATマッピングはエンドポイントにとって役に立たないからである。

より精巧な方法として、双方のホストが互いに複数回ずつ送信を試みる方法がある。制限付きコーンNATでは、他のホストからの最初のパケットはブロックされる。しかしこれによって相手マシンにパケットを送ったという記録がNATデバイスに残り、以後その相手方IPアドレスとポート番号からのパケットはNATを通されるようになる。この技法はP2PソフトウェアやVoIP通話で広く使われており、UDP 上でVPN接続を確立する際にも応用できる。同様の技法をTCPコネクションにも適用する場合があるが、成功率は遥かに低くなる。何故なら、TCPではコネクションのストリームは応用プログラムではなくホスト OS が制御しており、順序番号がランダムに生成されるので、順序番号を検査するような NAT デバイスは、パケットを既存のコネクションに結び付けることが出来ずに破棄してしまうからである。

アルゴリズム 
AとBというホストが、それぞれのプライベートネットワークにあるとする。N1とN2はそれぞれのNATデバイスである。SはグローバルIPアドレスを持つパブリックサーバである。

 A と B は S との UDP 通信を開始する。NATデバイス N1 と N2 は UDP 変換状態を作成し、一時的な外部ポート番号を割り当てる。
 S はそれらのポート番号を A と B にリレーして通知する。
 A と B は相手のNATデバイスと通知されたポート番号で直接通信する。NAT デバイスはそれ以前に生成されていた変換状態を使い、A および B の間でパケットの送受信が可能になる。

関連項目 
 STUN
 Hamachi
 Freenet
 Real Time Media Flow Protocol

外部リンク 
 Peer-to-Peer Communication Across Network Address Translators, PDF版
 STUNT
 Network Address Translation and Peer-to-Peer Applications (NATP2P)
 How Skype & Co. get round firewalls - SkypeでのUDPホールパンチングの使い方の簡単な説明
 通信網を脅かすSkypeの仕組み、わかりやすく解剖! アットマーク・アイティ（江原顕雄 2006年10月19日）
 NAT support for peer-to-peer games: a proposal

インターネットのプロトコル