井上

UPnP NAT Traversal対応への道 part1

アリエルの若き魔法使いのS氏がUPnP NAT Traversalのクライアント側(コントロールポイント側)のコードを書いてくれました。

UPnP NAT Traversalとは:

たいていのNATルータには、「ポートフォワード」と呼ばれる機能があります(注1)。

「ポートフォワード機能」は、外部からNATルータのグローバルIPへ向けたパケットを、内部(LAN)のPCに転送できる機能(の一種)です。これにより、プライベートLANのPCが、外部から見ると、あたかもグローバルIPを持ったPCのように振る舞えます。

NATルータであらかじめ次の設定をする必要があります。

上の3値の組が1つの設定です。複数の組を設定できます。状態を持つので、設定が増えると、NATルータのリソースを消費します。

例えば、g-portを80に設定して、LAN内でapacheを動かしているPCのp-ipとp-portに転送する設定をしたとします。外部から、NATルータのグローバルIPとポート80にアクセスすると、LAN内のapacheが応えることになります。この変換は外部の人には透過です。

「ポートフォワード機能」はNATのアドレス変換機能を固定化させただけで、昔からある機能です。ただし、一般に、NATルータの設定画面で手動設定する必要がありました。
UPnP NAT Traversalは、この手動設定を、LAN内のPCから自動で行うという、凄いのか凄くないのか良く分からない機能です。

LAN内から、NATルータを見つけて(1)、NATルータに対して「こういう変換のポートフォワード設定をしろ」と命令を送り込みます(2)。この通信プロトコルにUPnPを使います。概念的には、(1)はサービス発見で、(2)はサービス呼び出しです。UPnP的な用語では、ネットワーク変換機能というサービスを実装した(NATルータ)デバイスを発見して制御します。発見して制御する側(一般的な感覚でのクライアント)をコントロールポイントと呼びます。

UPnP(Universal Plug and Play)は、近距離のサービス(デバイス)発見・呼び出しの通信プロトコル(アーキテクチャ)です。ちょうどSunのJiniが出た直後に発表されたので、Jini潰しとも言われましたが、はっきり言って、Jiniもろとも、あまりぱっとしません。

この文脈の「近距離」は、主にネットワーク対応した家電を念頭に置いています。この5年ぐらい、家電のネットワーク化に進展があった気がしないので、ぱっとしないのも仕方ないところです。Sunに比べると、さすがにMSはしたたかです。死んだように見せかけて、NATルータをPCから制御するという形でUPnPを使い、延命させています。


P2Pアプリの「NATのポートフォワード機能」対応

UPnP NAT Traversalは、結局、ポートフォワード機能を自動化しただけなので、P2PアプリがUPnP NAT Traversalに対応する第一歩は、NATのポートフォワード機能に対応することです。
クライアント・サーバの文脈で考えると、「ポートフォワードにアプリが対応とはどういう意味ですか?」となると思います。NATのアドレス変換はアプリ層からは透過なので、アプリが対応するような性質では無いからです(WebサーバやWebブラウザにNAT対応のためのコードが無いことからも分かります)。

P2Pアプリと言うよりは、正確には、「TCP/IPのペイロード部分にTCP/IPのアドレス情報(IPアドレス、ポート番号)を持たせたアプリ」に、NATポートフォワード対応が必要になります。NATポートフォワード対応をしていれば、LAN内のPCがTCPセッションを張られる時、外部からはグローバルIPでセッションを張れ、LAN内ではプライベートIPでセッションを張ることができます。P2Pの探索に絞った表現をすると、lookupに対するhitのパケットの(TCP/IPの)ペイロードに適切なアドレス情報を返すことが、NATポートフォワード対応です。

アリエルフレームワークは、AirOne v1の頃から、NATポートフォワード機能に対応しています。
実装方法はふたつ考えられます。lookupを出したノードに応じて、グローバルIPのアドレス情報を含むhitを返すか、プライベートIPのアドレス情報を含むhitを返すか決める方法がひとつです。もうひとつは、両方のアドレス情報を含むhitを返して、hitを受けた側が選択する方法です。アリエルフレームワークは、後者の方法で実装しています。
余談ながら、IPv4/IPv6のデュアルスタック対応の実装は同じ枠組で行われています。

続く。

(注1)
知る限り、説明書に「ポートフォワード機能」と書かれることは少ないようです。また「ポートフォワード」という用語も、文脈によってはNATの機能以外を示すこともあるので、あまり良い用語では無いかもしれません。


posted at 052036腱 on 2004綛1214 by inoue - Category: General

TrackBack

DISALLOWED (TrackBack)

Comments

fukushima wrote:

UPnPを使って、ポートフォワードさせるのは、一番正攻法な気がします。

ただ、セキュリティ対策ということで、ルータのUPnP機能はオフにするようにということにならなければ良いですが。
2004綛1215 112141腱

inoue wrote:

> 一番正攻法な気がします。

NAT越え機能はどれもマッチポンプと言えなくもないですが。
2004綛1215 232435腱

Add Comments

このアイテムは閉鎖されました。このアイテムへのコメントの追加、投票はできません。