分散システム特論レポート RFC1631: The IP Network Address Translator 知能システム専攻 修士1年 長谷川・査研究室所属 生田 真 1. 導入 近年、インターネットが研究者のみならず一般の人にも爆発的に普及しつつ ある。それにつれ、ネットワーク上のノード識別子、つまりIPアドレスの不足 が深刻化しており、なんらかの対応策が必要とされている。 長期的な解決としては、IPv6という規格があげられる。現在のスタンダード であるIPv4は、32bitのアドレス空間しか持たないが、IPv6では、それを 128bitまで広げることで、現時点でのアドレス不足を一挙に解決する。しかし、 IPv6導入には、ルータやゲートウエイに大幅な変更が必要だという問題がある。 そこで、IPv6が普及するまでの短期的な解決策として、CIDRやDHCPなどの様々 な方法が開発されてきた。ここでは、それらの中でも有効であると思われる Network Address Translators (NAT)について、紹介する。 2. プライベートアドレス空間とNAT ホスト同士で通信を行うためには、ネットワークの中で各ホストを区別する ユニークな識別子、IPアドレスが必要である。しかし、インターネット上の全 てのホスト同士が通信を行う必要性が有るわけではなく、例えばある研究室や 企業の中だけの通信で事足りるホストも存在する。限られたアドレス空間を有 効活用するためには、それらのインターネット(外部)と通信しないホストに 対して、各ドメイン内でのみユニークなアドレスを使い回すことが考えられる。 Internet Assigned Numbers Authority (IANA)は次の三つのIPアドレス空間ブ ロックをプライベートアドレスとして予約している(RFC1918)。 10.0.0.0 - 10.255.255.255 (10/8 prefix) 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) NATは、IPアドレス不足を解消するために、これらのプライベートアドレス を積極的に活用するための方法の一つである。つまり、NATはプライベートア ドレスを持つホストからもインターネット上のホストと通信できるようにする ことで、IPアドレス空間を有効活用するものである。 3. NATの概観 NATが行う仕事は、その名の通りホスト間でやり取りされるパケットの始点、 終点アドレスを書き換えることである。 このアドレス書き換えは、NAT上で完 全に透過的に行われ、ユーザはその存在を意識する必要がない。また、NATを 導入する際に、ホストやルータへの(特殊な)変更が必要ないという利点もあ る。 GLOBAL --------+--------‥‥------------+---- {始=11.22.33.44} | | {終=66.77.88.99} |11.22.33.44 | +----------------+-+ +--+ |ルータR with NAT | |B| +------+-----------+ /____\ | 66.77.88.99 | LAN ------+---+-- | {始=192.168.1.1} | {終=66.77.88.99} +--+ |A| /____\ 192.168.1.1 図 1: 基本的な NAT 動作 図1に沿ってNATの動作を説明する。 プライベートアドレスを持つホストA が、NAT機能を持つルータRを通じて、グローバルアドレスを持つホストBと 通信する場合は次のような手順を踏む。 1) ホストAから、始点192.168.1.1、終点66.77.88.99のパケットが送信され る。 2) 終点がグローバルアドレスなので、パケットはルータRを通過する。その 際、NATによりパケットの始点がルータRが持つグローバルアドレス 11.22.33.44に書き換えられ、アドレス192.168.1.1と、66.77.88.99の対 応テーブルがR内に保持される。 3) Rより送りだされたパケットがBに到達する。 4) Bから始点66.77.88.99、終点11.22.33.44のパケットが返信される。 5) Rに到達したパケットは、NATにより 2)で保持したテーブルから、終点を 192.168.1.1に書き換えられる。 6) 始点66.77.88.99、終点192.168.1.1のパケットが、Aに到着する。 手順2)、3)では、アドレスの書き換えをおこなっているが、その際にNAT はパケットの整合性をとるため、以下の操作を行うことが必要だと考えられる。 * IP/UDP/TCP のチェックサムの再計算 * FTP の PORT コマンドの引数、および PASV コマンドの戻り値の変換 * エラー通知のための ICMP パケットに含まれる、エラーの対象となった パケットの先頭部分の始点/終点アドレスの変換 * SNMP パケットに含まれるアドレス情報の変換 * その他、アドレス情報を含むプロトコルがあれば、そのアドレス情報の 変換 ただし、以上のうちチェックサムの再計算は必須であるが、ICMP/SNMPに関 しては、RFC1631ではその必要性を疑問視している。 4. NATの拡張 -- IP Masquerade -- 前節の手順2)で、NATはプライベートアドレスと、グローバルアドレスの対 応テーブルを持つと説明した。だが、ここには大きな問題点が存在する。それ は、アドレス同士の対応表では、1度にローカルネット中の1台しかグローバ ルと通信できないということである。もしローカルネット中の複数のホストが 外部と通信をするならば、その台数分のグローバルアドレスが必要となり、 アドレス空間の有効活用という当初の目的が達成されない。 そこで、ルータのグローバル側のUDP/TCPポートとアドレスの組(ソケット) を、ローカルネットのホストと対応づけることにより、一つのグローバルアド レスで同時の複数台のローカルホストが外部と通信できるような方法が考えら れた。その内の一つが Linux上に実装されているIP Masqueradeである。 IP Masqueradeは、IP層のプログラムで、上記で述べた以外にもセキュリティ ポリシィを比較的自由に設定できるなどの拡張が加えられている。IP Masquerade で使用できるプロトコル(アプリケーション)には次のようなも のがある。 o HTTP / HTTPS o auth o FTP o NTP o SMTP o daytime o POP3 o ping o finger o traceroute o irc (DCC もOK) o CUSeeMe o VDOLive o RealAudio o ssh 但し、IP Masqueradeはポート番号を変換することから、NATでは問題となら なかった、あるいは回避できる問題であった以下のような事柄が回避できない 問題として浮上してくる。 *ICMP IP MasqueradeはUDP/TCPのポート番号の変換を行うことを前提にしてい る。そのため、ポート番号の概念がないICMPは取り扱えない。ただ、 ICMP Echo/Echo Replyだけは扱えるようにしているので、上記のように pingは通る。 *グローバル側からのアクセス グローバル側からアクセスされる場合、最初のパケットは当然 グローバ ル側からやってくる。グローバルアドレスとプライベートアドレスが 1 対1対応のNATであれば、そのような場合でもパケットの配送先が分かる が、IP Masqueradeの場合は1対1対応ではないため、どのホストにパケッ トを送るべきかの判断がつかない。 *rsh系のコマンド(rsh、rlogin、rcpなど)やlprなど rsh系のコマンドで使われるプロトコルやlprで使われる LPRプロトコル では、クライアント側のポート番号が WELL KNOWNポートの範囲内にある ことが要求される。そのため、ポート番号を変換してしまうIP Masquerade越しには使えない。 5.まとめ 以上で述べてきたように、NAT及びその拡張は、限られたグローバルIPアド レスを有効利用するための方法の一つである。ルータやホストに大きな変更が 必要ないということから導入が簡単であり、短期的な解決法としてはよい選択 となり得る。ただ、長期的な解決策にふさわしくない理由として、 * NATテーブルが小さければアドレス節約の効果が小さいし、大きければパフォー マンスが低下するというジレンマ。 * アドレス誤りの確率が増える。 * ある種のアプリケーション(特殊なネットワークゲーム等)に使えない場 合がある。 * ローカルホストの身元を隠してしまう。 といった理由がRFC1631で挙げられている。 だが、完全にIPv6へ移行するにはまだ時間がかかるのも事実である。今しば らくは、特に小規模のローカルネットを構成する場合には、これらの問題を把 握した上でならば、有効な解決法であり続けると予想される。