NAT越えの方法

我が家の自宅HTTPサーバー公開で何度も苦労の種になっているNAT超えであるが、ナンセンスな静的NAT/NAPT変換だけではなく、もっとスマートな方法が色々考えられているようだ。

1. UPnP (Universal Plug&Play)
Microsoftを含むグループが提唱した方式で、LAN内の接続先機器がブロードキャストすることにより、UPnP対応ルーターが外部からのアクセスの適切な転送先を把握する方式。Windows XPはUPnPに対応しているらしい。UPnP対応ルーターが必要だが、既に多くのUPnP対応ルーターが出ており、現時点でのデファクトスタンダードか。

2. STUN (Simple Traversal of UDP through NATs)
IETFによる、RFC3489として公開されているプロトコルを使う方法で、LAN内の接続先機器からインターネット上のSTUNサーバーにUDPでアクセスして、インターネットから見た接続先のアドレスとポート(外側のアドレスとポート)を取得する方式。外側のアドレスとポートが接続毎に変わることがない、「完全Corn型」のNATでしか使えない。ポピュラーな方式であり、現時点ではよく使われているような気がする。

3. 拡張STUN
「Corn型」でなく「Symmetric型」のNATでも使えるとされるSTUN。実際に出回っているSymmetric NATは外側のアドレスとポートに規則性がある場合が多いらしく、その規則性を調べることにより外側のアドレスとポートを知るという、強引かつ奇妙な方式。

4. B2BUA(Back-To-Back User Agent)
やはりSymmetric NAT越えのために考えられている方式。B2BUAとはある種のSIPプロトコルの転送サーバーの一般名称であり、具体的にどういうB2BUAを用意してどうやるとNAT越えが実現するのかは調べ切れなかった。参考ページから推測すると、LAN内の接続先からインターネット上のB2BUAにSIP接続しておき、接続元からB2BUAにSIP接続することにより、接続先の、外側のアドレスとポートを知るということだろうか。

5. TURN (Traversal Using Relay NAT)
IETFによる方式で、インターネット上にTURNサーバーを設置し、LAN内の接続先からTURNサーバーにアクセスして接続を確保し、LAN内の接続先へのアクセス(データ送受信含む)は全てTURNサーバーを介するという方式。LAN内のサーバーから見ると接続元が同じなので、Symmetric NATでも使用可能だと思われる。NAT越えTCP接続も可能。但し、全ての通信がTURNサーバーを介するので、遅延が大きくなる。

6. ICE (Interactive Connectivity Establishment)
IETFによる方式で、STUN、TURNを含む多くのプロトコルを使う、SIPベースの複雑な方式。インターネット上のSIPサーバーを使用してNAT越しにセッションを確立し、LAN内のサーバーへの接続は確立したセッション上で行う。データ送受信はそのセッション上で行う。SIP的には美しいが、えらく複雑だ。

7. IPv6
NAT越えの話題には、NAT不要論というのが常に伴うらしい。確かに、そこまで面倒な話なら、IPv4+NATを諦めて、必要な所だけIPv6にすればいいという気がする。


スマートな方法は色々あるようだが、当分、ナンセンスでもシンプルな静的NAPT変換でいいや。