検証
ネットワーク管理者のためのSkype入門 第2回

コラム: NATルータとUDP

デジタルアドバンテージ+海津 智宏
2005/07/15

 インターネットとの接続部分にNATルータが存在すると、どうしてVoIPクライアントが接続困難になるのかを考えるため、NATの仕組みについてみてみよう。ただし話を簡単にするため、ここではUDPパケットについてのみ解説しておく。

UDPとは?

基礎から学ぶWindowsネットワーク(UDPプロトコル)

 UDPは、TCP/IPにおける基幹プロトコルの1つであり、データグラム型の通信を行うために利用される。データグラム型の通信とは、TCPのような事前のセッション確立なしに、データを送信するためのプロトコルである。UDPでは「信頼性はない」ながらも、軽量で高速なプロトコルを目指して設計されている。実際には、下位のIPプロトコルの機能をほぼそのまま利用するためのプロトコルである。

UDPパケットの構造
UDPパケットには送信元とあて先のIPアドレス、ポート番号の情報が含まれている。送信されたパケットは、あて先IPアドレスに基づいてルーティングされ、相手ノードまで届いた後は、あて先ポート番号に基づいて、そのポートをリッスンしているアプリケーショにまで届けられる。なお実際には、IPアドレス情報はIPパケットに含まれており、その上位プロトコルであるUDPにはポート番号しか含まれていないが、ここでは分かりやすく配置し直している。

UDPによる双方向通信とファイアウォール

 UDPを使った通信には、片方向通信と双方向通信の2種類がある。データを送信するだけで、それに対する応答を必要としない用途では(例えばエラーやイベントなどの通知やマルチキャスト送信など)、データを一方的に送信するだけで構わない。

 だが一般的なアプリケーションでは、UDPパケットを送信すると、それに対する応答パケットを受信するようになっている。この場合、送信パケットと受信パケットでは、あて先ポートと送信ポート番号(およびあて先と送信元のIPアドレス)が入れ替わった状態で戻ってくるのが一般的である。

UDPの送受信
UDPで送信したパケットに対する応答は、一般的には、ポート番号を入れ替えた形で戻ってくる。例えばノードBBBBのポート2345番にUDPパケットを送信すると、返信パケットの送信元ポート番号は2345番になる。

 ファイアウォールやNATルータでUDPパケットを通過させる場合は、送信したUDPパケットの情報(送信元や送信先のIPアドレスとポート番号の対)を覚えておき、それに対する応答パケットだけを通すように、フィルタを一時的にオープンする。こうしないと、まったく無関係なUDPパケットを通過させてしまい、システムが外部から攻撃される危険性がある。

NATルータでUDPパケットを通過させる

 NATルータは、アドレス変換(NAT:Network Address Translation)機能を持たせたルータであり、一般的にはプライベートIPアドレスを使って構築されたネットワークをインターネットに接続する際に利用する。ローカルのコンピュータから送信されたパケットをNATルータでグローバルIPアドレスを持つパケットに変換し、インターネット上のコンピュータへと送信する。インターネットではプライベートIPアドレスは利用できないからだ。

 このNATルータとUDPパケットを組み合わせた場合の通信は、次のようになる。

NATルータを使ったUDP通信
インターネットではローカルIPアドレスを使うことはできないため、そのようなIPアドレスを持つパケットを送信する場合は、グローバルIPアドレスに書き換えてから送信しなければならない。一般的には、内部ネットワーク上のIPアドレスは、すべてルータに与えられたグローバルIPアドレス(図中のCCCC)に変換してから送信する。また、送信したUDPへの返信に備えて、どのIPアドレス(およびポート番号)を何に変換したかをNATテーブルに記録しておく。そして返信パケットを受け取った場合、NATテーブルに一致するエントリがあれば、元のIPアドレスとポート番号に戻して、内部ネットワーク上のノードへ届ける。
  内部ネットワーク上のノードAAAA:1234から、インターネット上のノードBBBB:2345にむけて、UDPパケットを送信する。
  AAAAはローカルIPアドレスなので、ルータに割り当てられたグローバルIPアドレスCCCCに変換しなければならない。それをNATテーブルに記録しておく。
  送信元のIPアドレスを変換して(AAAA:1234→CCCC:1234)、パケットをBBBBに向けて送信する。変換するのは送信元の情報だけであり、あて先の情報は変換しないことに注意。これを変換してしまうと、正しくあて先へ届けることができなくなる。
  相手側のノードが、応答UDPパケットを送信する。一般的には、受け取ったUDPパケットの送信元IPアドレス:ポート番号に対して送信するが、この場合はNATルータから送信されているので、CCCC:1234に向けてUDPパケットを送信する。
  NATテーブルを参照し、それが正当な応答であると確認されると、元のIPアドレス:ポート番号に戻して、内部ネットワーク上のノードへ送信する。NATテーブルにエントリがない場合は、不正なパケットとしてブロック(破棄)する。

 この図のNATルータでは、内部ネットワークからインターネットへ送信するときに、UDPパケット中の送信元のIPアドレス部分を書き換えている(AAAA→CCCC)。これにより、ノードBBBBに送信されるUDPパケットには、グローバルIPアドレスしか含まれず、インターネット上で正しくルーティングすることができる。

 逆にインターネットから戻ってくるUDPパケットについては、NATテーブルのエントリに存在していることを確認後、あて先のIPアドレスを内部ネットワーク上のプライベートIPアドレスに書き換えて(CCCC→AAAA)、元のノードAAAAへ転送している。

■NATタイプとポート番号変換
 以上がNATの簡単な動作原理であるが、ここでは、ポート番号についてはそのまま通過するものとしていた(図中の1234や2345のこと)。だが、NATのアルゴリズムによっては、NATルータの通過時に(送信元の)ポート番号の変換まで行うものがある。一般的には、送信元のポート番号はあて先ポート番号ほどには重要ではないからだ。また、複数のノードからの通信を同じあて先(IPアドレス:ポート番号)に送信する場合、通信元を区別するためには、異なる送信元ポート番号を使わなければならない。

 このようなタイプのNATルータを使っていると、あて先に届いたときのUDPパケットの状態が意図したものとは異なるため、2つのノード間でのUDP通信を行うことはできない。Skypeではこの場合、UDPではなく、スーパー・ノードを経由したTCP通信を利用する。End of Article

 

 INDEX
  [検証]ネットワーク管理者のためのSkype入門
  第2回 Skypeの通信メカニズム
    1.Skypeの通信開始処理
    2.Skypeの高い接続性の秘密
    コラム: NATルータとUDP
 
 「検証」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間