UDPホールパンチング(ユーディーピーホールパンチング)とは | 意味や読み方など丁寧でわかりやすい用語解説
UDPホールパンチング(ユーディーピーホールパンチング)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
UDPホールパンチング (ユーディーピーホールパンチング)
英語表記
UDP hole punching (ユーディーピーホールパンチング)
用語解説
UDPホールパンチングは、ネットワークアドレス変換(NAT)装置の背後にある二つのクライアントが、互いに直接UDP通信を開始できるようにするための技術である。通常、NAT装置はプライベートネットワーク内の機器が外部のインターネットと通信する際に、プライベートIPアドレスとポート番号をグローバルIPアドレスとポート番号に変換する。この変換により、外部からの不許可な接続をブロックし、セキュリティを高める役割を果たす一方で、内部のクライアントが外部から直接接続されることを困難にする。特に、VoIPやオンラインゲーム、P2Pファイル共有などのアプリケーションで、クライアント同士が直接通信する必要がある場合に問題となる。UDPホールパンチングは、このNATによる制約を克服し、クライアント間の直接通信を確立することを目的とする。
詳細に説明すると、まずネットワークアドレス変換(NAT)の動作原理を理解する必要がある。NATは、プライベートIPアドレスを持つ複数のデバイスが、単一のグローバルIPアドレスを共有してインターネットにアクセスすることを可能にする技術だ。デバイスが外部にパケットを送信する際、NATルーターはそのパケットの送信元IPアドレスとポート番号を、自身のグローバルIPアドレスと空いているポート番号に変換し、自身のマッピングテーブルに記録する。外部からの応答パケットがルーターに到着すると、ルーターはマッピングテーブルを参照して、どの内部デバイスに転送すべきかを判断する。この仕組みは、内部から開始された通信に対してはスムーズに機能するが、外部から内部への新規接続は通常、ブロックされる。これがP2P通信において課題となる点だ。
UDPホールパンチングのプロセスは、一般的に「STUN(Session Traversal Utilities for NAT)」サーバーのような、インターネット上に存在する第三者のサーバーを介して開始される。プロセスは以下のステップで進行する。
まず、通信を開始したい二つのクライアントAとクライアントBがそれぞれ、インターネット上の既知のSTUNサーバーに対してUDPパケットを送信する。例えば、クライアントAがSTUNサーバーにパケットを送信すると、クライアントAのNATルーターはそのパケットの送信元IPアドレスとポートを、ルーターのグローバルIPアドレスと一時的な外部ポートに変換する。この変換情報(クライアントAのプライベートIP:ポート ⇔ グローバルIP:外部ポート)は、ルーターのNATテーブルに一時的に記録される。クライアントBも同様にSTUNサーバーにパケットを送信し、自身のNATルーターによって同様のポートマッピングが作成される。
次に、STUNサーバーはクライアントAから受け取ったパケットから、クライアントAのNATルーターによって割り当てられたグローバルIPアドレスと外部ポート番号を把握する。同様に、クライアントBのグローバルIPアドレスと外部ポート番号も把握する。STUNサーバーはこれらの情報、つまりクライアントAの外部アドレスとクライアントBの外部アドレスを、互いのクライアントに通知する。
この情報を受け取ったクライアントAとクライアントBは、STUNサーバーから教えられた相手のグローバルIPアドレスと外部ポート番号宛に、直接UDPパケットを送信し始める。例えば、クライアントAはクライアントBの外部アドレスに向けてUDPパケットを送信し、クライアントBもクライアントAの外部アドレスに向けてUDPパケットを送信する。
ここで重要なのは、それぞれのクライアントのNATルーターには、STUNサーバーとの通信のために「穴」が開いている点だ。クライアントAのNATルーターには、クライアントAがSTUNサーバーに送信した際にできた、クライアントAから外部へのUDPトラフィックを許可するマッピングが存在する。クライアントBのNATルーターにも同様のマッピングが存在する。
クライアントAがクライアントBの外部アドレスにパケットを送信すると、クライアントAのNATルーターは、STUNサーバーとの通信で作成されたマッピングを利用してこのパケットを送信する。同時に、この送信によって、クライアントAのNATルーターにはクライアントAからクライアントBの外部アドレスへの送信を許可する新たなマッピング、または既存のマッピングの更新が生成される場合がある。
そして、クライアントBのNATルーターにクライアントAからのパケットが到着したとき、クライアントBのNATルーターは既にクライアントBがSTUNサーバーに送信した際に作成されたマッピングを持っているため、クライアントBのプライベートIPアドレスとポート宛にこのパケットを転送する。つまり、クライアントBがSTUNサーバーにパケットを送信したことで、クライアントBのNATルーターには「クライアントBから外部への通信」を許可するマッピングが作成されており、多くの場合、同じ外部IPアドレスとポートから来るパケットであれば、その「穴」を通して内部のクライアントBに到達できるのだ。
このプロセスが双方向で行われることで、最終的にクライアントAとクライアントBのNATルーターそれぞれに、互いのグローバルIPアドレスとポート番号からのUDPパケットを内部のクライアントに転送するための「穴」が開き、両者間の直接通信が可能になる。この「穴」は、正確にはNATテーブルにエントリが作成されることを指し、外部から内部への一見不許可な接続が、内部からの通信履歴をきっかけとして許可される点がホールパンチングと呼ばれる所以である。
ただし、UDPホールパンチングは全てのNAT環境で成功するわけではない。特に、「シンメトリックNAT」と呼ばれる種類のNATは、発信する接続ごとに異なる外部ポートを割り当てるため、この技術での直接通信が困難になる場合がある。シンメトリックNATでは、クライアントがSTUNサーバーにパケットを送信した際に使用される外部ポートと、その後クライアントが別のピアにパケットを送信する際に使用される外部ポートが異なる場合があるため、ピアが正しい外部ポートを知ることができない。このような場合は、TCPリレーやUDPリレーなど、第三者のサーバーを介したデータ転送が必要となる。
UDPホールパンチングは、UDPのステートレスで高速な特性を活かし、VoIPやリアルタイムゲームなど、低遅延が求められるP2Pアプリケーションにおいて広く利用されている。これにより、サーバーの負荷を軽減し、より効率的な通信を実現できるが、一方で、NATデバイスの設定や種類に依存するという制約も持つ。セキュリティ面では、NAT越えを可能にするため、不必要なポート開放がないか、通信の健全性が確保されているかなど、適切な対策を講じることが重要である。