rfc4787概要

RFC4787は、”Network Address Translation (NAT) Behavioral Requirements for Unicast UDP” 日本語だと「ユニキャストUDPのためのネットワークアドレス変換(NAT)の挙動要求」 ということだそうで、ユニキャストUDPでNAT越えをするためにはどういう実装にしないといけないかの整理が行われている。

STUN(rfc3489)なんかのRFCでは、 ・Full Cone ・Restricted Cone ・Port Restricted Cone ・Symmetric の4つにざっくり分類して、これらを越えるための工夫について述べていたが、 こっちはNATの実装側に向けたrfcなので、もっと具体的に分類している。

そもそもNATの前提知識として、内側のセグメントのアドレスを、NATの外側のインタフェースで保持しているアドレスプールのなかのいずれかに変換して外側のマシンと通信し、 戻ってきた際に内側のセグメントのアドレスに付け替える。 充分な数の外側のIPアドレスがない場合、ポート番号を駆使して通信を行うしかない。 192.168.1.1の通信は1.1.1.1:1000 192.168.1.2の通信は1.1.1.1:2000という風に区別すれば、 一つのグローバルアドレスでも複数の通信を行う事ができる。 このようなポート番号処理を含めて処理するNATをNAPTと呼ぶ。 家庭用のルータなんかだとそもそもグローバルIPが一つしか無いのでNAPTが前提である。

以上の通り、NAPTは結局はアドレスとポートの変換を行うものなので、その変換の仕方で整理することになる。 4.1. Address and Port Mapping で述べられているのがその分類である。 rfcから図を引用する。

rfc4787

NATの内側のマシンXが、NATの外側の複数のマシンY1と通信するとき IP: X1’ Port: x1’ Y2と通信するときX2’:x2’に変換されるものとしたときに、 X, X1’, X2’及びx, x1’, x2’の関係を整理すればNATの挙動が分類できる。 (変数としては自分のIPアドレスとポート番号,相手のIPアドレスとポート番号で4つ存在し、 考慮するのは同じかどうかだけなので、理論上組み合わせとしては2^4パターン存在するが、 ポート番号はIPアドレスよりも弱い位置づけであるため、 以下では異なるIPアドレスで同じIPアドレスという組み合わせは検討しない。)

Xが同じIPアドレス、ポート番号で通信する限り、通信相手に関わらず同じアドレスに変換されるのが Endpoint-Independent Mappingである。 要は、X:xから通信を行う限り、X1’ = X2’かつx1’ = x2’である。

Xが同じIPアドレス、ポート番号であり、かつ通信相手が同じIPアドレスである場合、 通信相手のポート番号が異なっても同じNATの外側アドレス,ポートにマッピングするのが Address-Dependent Mappingである。 つまり、 X:xからY1に送信する限り、どのポートを利用したとしてもX1’:x1’の組み合わせを利用する。 X:xからY2に送信する場合は、どのポートを利用したとしてもX2’:x2’の組み合わせを利用する。 X1’:x1’とX2’:x2’は異なる組み合わせとなる。

Address and Port-Dependent Mappingは一番制約が厳しく、 送信元および宛先のアドレスとポート番号が同じ組み合わせで無い限り、別々のNAT外側アドレスとポート番号を使う。 X:xからY1:y1へ送信した場合と、X:xからY1:y2へ送信した場合では、別々の組み合わせが利用される。

・Requirement-1

NAT実装者は、Endpoint-Independent Mappingを選択しなければならない。 何故ならば、RTPで通信を行う場合RTPとそのセッション管理のRTCPでは利用するポートが異なる。 この場合、RTPではY1:y1, RTCPではY1:y2に通信を行う事になる。 それぞれへの送信元であるX1’:x1’とX2’:x2’とすると、 まずAddress and Port-Dependent Mappingでは、X1’とX2’が同じであることが保証されない。 異なってしまった場合、RTPとRTCPが別々の端末からの送信されてきていると認識されるので、 Y1の側で関連づけることができず、正常動作させることができない。

–ちょっと理解が曖昧な部分。セキュリティの話が突然出てきていてちょっと混乱。理解したら反映する

Address-Dependent Mappingの場合、相手側のNATで、同じマシンに対して複数の外側アドレスをマッピングすることがあるので(例えば大企業のセキュリティポリシーでは、同一マシンからの一連の通信を推測されないように別の外側アドレスを割りあてることがある)、 こちら側の送信元IPアドレスが異なってしまうことがある。 双方向でEndpoint-Independent Mappingを利用する事で、同一IPアドレスから出る全ての通信を、同一のNAT外側IPアドレスとして利用して通信させることができる。

Requirement-2以降はまた別途。

Written on August 8, 2013