第10回 RFC2663で見るNAT
2002/11/02作成
2002/11/10更新
最近ADSLやらFTTHやらCATVやらでブロードバンド化が進み、かつ家庭でも複数台のPCを所有することが多くなってきました。
そうなると活躍するのがNATというテクノロジーです。本来IPv6が進むと必要なくなるはずのテクノロジーなのですが、今のところ古いOSやアプリケーションのほとんどがIPv6に対応しきれていないのでもうしばらくIPv4ベースのNATが活躍する場がありそうです。
調べてみるといろんなNATがあるんですよね。本とかを探してもなかなかヒットするものはなく、ようやくたどり着いたドキュメントは英語で書かれたRFCくらいでした。
TOEICの点数が半分も取れないような英語能力しか持ち合わせていない私が、無謀にもRFCを読解してみることにしました。
今回はRFCから文面を拾ってNATの紹介しつつ、実例なども交えつつ行ってみたいと思います。
また、今回は初のカラーの絵を入れてみました。
見づらいときは絵をクリックしてみてください。おっきくなります。
1.静的NATと動的NAT
NATの話をするとき、静的NATと動的NATという言葉を良く聞きます。
RFCではStatic Address asignmentとDynamic
Address asignmentと書いてあるようです。
静的NATというのはプライベートネットワークと外部ネットワークとでアドレスが1対1の対応付けされているNATです。
別名1対1NATとかスタティックNATとか言われます。
得意のFreeBSDのIPFilterについているipnatで書くとIこんな感じで、IPアドレスが1対1になっています。
fxp0はグローバルアドレス側のネットワークインタフェースになります。
map fxp0 192.168.1.1/32 -> 133.133.133.1/32
動的NATはそれに対してプライベートと外部でIPアドレスの対応が複数になっている場合です。プライベートの数とグローバルのアドレスの数が同じでもどっちかが少なくてもOKです。
ほとんどの場合プライベートアドレスの数が多い様ですが。
プライベートネットワーク内のある一つのIPアドレスからセッションが開始されたとき、グローバルアドレスを割り当てます。
セッションが終了したらグローバルアドレスも解放され、次のセッションに備えます。
IPマスカレードと似ていますが、実は違います。
動的NATでは1つのプライベートアドレスがセッションを保持している間は他のプライベートアドレスは利用することができません。
また、動的NATではプライベートアドレスとグローバルアドレスを複数設定することができます。
グローバルアドレスがいくつか確保されていればプライベートアドレスがそれらを順番に使うことができます。
電話回線と同じで、電話の加入者の数だけ電話線が用意されているのではなく、使うときだけ電話線を独占するというパターンに似ています。
いわゆる統計多重というやつです。
ipnatで書くと以下のものが該当します。3つ書きましたがどれも動的なNATになります。
アドレスの範囲が変わっていることに注目してください。
map fxp0 192.168.1.0/24 -> 133.133.133.0/24
map fxp0 192.168.1.0/24 -> 133.133.133.1/32
map fxp0 192.168.0.0/16 -> 133.133.133.0/24
2.NATの種類
静的NAT、動的NATという分類もあるのですが、NATを許可するセッションの方向による分類が可能です。
2.1.標準NAT(ベーシックNAT)
プライベートネットワークのホストからグローバルネットワークに対するセッションに対してアドレス変換を行います。
帰りのパケットはセッション情報に基づいてソースポート番号に帰ってきたものだけをプライベートに転送します。
グローバルネットワークからのセッションに対してはプライベートホストではなくNAT機器が答えます。
ipnatではmapを使って指定します。
map fxp0 192.168.1.1/32 -> 133.133.133.1/32
2.2.NAPT(ネットワークアドレスポート転送)
よくIPマスカレードといわれているやつです。
標準NATはプライベートホストからのソースアドレスとグローバルホストから帰ってきた宛先アドレスの変換を行いますが、NAPTはそれに加えてソースポート番号と帰りは宛先ポート番号も変換します。
なぜこんなことをするのかというと、プライベートネットワークに複数台のホストがあるとき、グローバルIPアドレスが1つしかない場合にソースポート番号が重複することが十分あり得ます。
NAT機器でポート番号を振り直すことで重複を避け、複数のプライベートホストが1つのIPアドレスをシェアすることができます。
これだけ見るとNAPTは動的NATのみのような気がしますが、ポートの再マッピングさえすれば静的NATでも可能です。
あまり意味がないですが・・
ipnatではportmapオプションを使います。NFSなどで使うRPC(リモートプロシジャコール)でもportmapと言う言葉を使うのでちょっと紛らわしいです。
これでソースポート番号を再マッピングして送ってくれます。
使うIPアドレスが1つの場合は下のルールがあれば間に合うのでこれも入れなければいけないようです。
map fxp0 192.168.1.0/24 -> 133.133.133.1/32 portmap tcp/udp 1025:65000
map fxp0 192.168.1.0/24 -> 133.133.133.1/32
2.3.双方向NAT(Bi-directional NAT/Two-Way NAT)
標準NATがプライベートからグローバルに対するセッションにのみNATしていたのに対して、双方向NATはグローバルからプライベートへのセッション開始にもNATします。
そのままだとNAT機器がグローバルからの通信にまったく答えることができなくなるので、実際にはグローバル側のインターフェースに複数のアドレスを割り当ててそのうちの1つをNATに割り当てるなどの方法をとるようです。
ipnatの設定はbimapを使います。
bimap fxp0 192.168.1.1/32 -> 133.133.133.1/32
双方向NATとは微妙に違う気がしますが、webサーバなら80番のみなどとポート番号を指定してそのポートに来たパケットのみをプライベートに変換してやる方法もあります。ポートフォワーディングやポートリダイレクト、静的IPマスカレードなどと言われます。
ipnatではrdrを使います。下記は、グローバルアドレスのtcp/80に来たパケットをローカルのアドレスに転送しています。
mapと違い、アドレスの書く順番が違うので気を付けてください。
rdr fxp0 133.133.133.1/32 port 80 -> 192.168.1.1 port 80 tcp
双方向NATでは技術的にプライベート側から開始されるセッションによるアドレスのマッピングとグローバルから開始されるセッションによってマッピングされるアドレスを変えることができます。また、それぞれのマッピング方式も静的にも動的にもできますし、標準NATでもNAPTでも可能です。
でも、そういう場合でも双方向NATと言っていいのかは不明です。
ipnatではグローバルから開始されるセッションについてはbimapかrdrで許可することができます。
bimapは双方向で同じアドレスを使う仕様になっているのでできません。
rdrはグローバルからのセッションについてのみアドレス変換しますが、ポート番号と一緒じゃないと変換できず、またポート番号をレンジで指定できないようなので、いちいち指定しないとダメなようです。
map fxp0 192.168.1.1/32 -> 133.133.133.1/32
rdr fxp0 133.133.133.2/32 port 80 -> 192.168.1.1 port 80 tcp
2.4.二重NAT(Twice NAT)
二重NATとはプライベートネットワークとグローバルネットワークでアドレスが重複してしまったときにいかなる場合でも無条件でソースアドレスと宛先アドレスを変換する方法です。
双方向NATをプライベートとグローバルの両方にかけるとこれが可能になります。
意外に企業などの中規模ネットワークなどでのNAT利用でアドレスが重複していないのに、設定を頓着してこの二重NATになっているNAT機器も多いのではないかと思います。そういう機器はもう一度構成とポリシーを見直して最低限の構成でやって欲しいものです。
ちなみに二重NATというのは私が訳したのでたぶん一般的ではないと思います。誰か一般的な言い方知ってたら教えてください。
ipnatの設定ではbimapを両側にかけます。
fxp1はプライベート側のネットワークインタフェースです。
bimap fxp0 200.200.200.101/32 -> 133.133.133.1/32
bimap fxp1 200.200.200.1/32 -> 192.168.1.254/32
2.5.マルチホームNAT
負荷分散やバックアップの目的でNAT装置が並列に複数台設置されている場合があります。
NAT機器が並列に設置されていると、セッション中のパケットが必ずいつも同じNAT機器を通るとは限らなくなります。
そうなると必要になってくるのが双方でのNATテーブルの交換になります。
NAT機器1で通したセッションをNAT機器2にも教えてあげて帰りのパケットを通過させなければなりません。
多重設置されたCheckPointのFirewall-1とかだったらこういう機能持っていそうです。
と、これがマルチホームNATなのだそうですが、あえて一例としてあげるほどのものではないような気がします。
3.IPマスカレード(IP Masquarade)
ダイヤルアップルータのころから良く聞いていましたが、ブロードバンドルータなどでも最近良く耳にするのがこのIPマスカレードです。
性能はNAPTとほとんど変わりません。
1つのグローバルIPアドレスを複数のプライベートアドレスで共有する仕組みです。
もともとIPマスカレードという言葉はLinuxではじまったと言われています。
なので、本当にLinuxに入っているやつ以外はIPマスカレードじゃないのですが、今では1対N
NATの代名詞としてIPマスカレードと言う言葉を使うのが一般的になっているようです。
厳密に言うと、IPマスカレードはNAPTの実装の一つということになります。
NAPTは目的で、IPマスカレードはその方法です。でも、その違いがわかる人はほとんどいないので混同しちゃっても害はないでしょう。
意外なのはIPマスカレードに関するRFCがまったく存在しないのです。
でも、よく考えるともともとはLinuxの方言なので無くて当たり前なのかもしれません。
4.NAT利用時の問題点
よく、NATを使っているとネットゲームができないとか、チャットツールが使えないという報告を聞きます。
これらは以下の3つの理由により利用できない場合がほとんどです。
1.サーバからクライアントに対してセッションが開始されるアプリケーションを使っているとき
2.クライアント側のソースポート番号が固定されているアプリケーションの場合
3.tcp/udp以外のIPプロトコルを利用している場合
1の問題は双方向NATをかければ問題解決です。
ですが、あまりきれいなソリューションじゃないので普通は使うポートのみを渡します。
双方向NATを気軽に設定してしまうと、それだけでセキュリティホールになってしまいますので、なるべくやめた方がいいのです。
*BSD関連のIPFilterだとipnatのrdrを使うといいです。
LinuxなどのIPマスカレードな環境の人は静的IPマスカレードと言われるものを設定してみてください。
2の問題はちょっと面倒です。
NAPTを使った場合のみ起きる現象なので、静的に1対1NATやっていたり、ポートを変更しない動的NATに変更するのが一番いいのですが、そうなるとNAPTのいいところが全然活きてこないし、影響範囲が大きいので他の方法が欲しいところです。
NAT Boxの中にはポート番号指定で再マッピングしないという機能が付いているものがあるかもしれません。それぞれのマニュアルを読んでみましょう。
でも、アプリケーションを作る側も、IPv4が枯渇していることは意識しているだろうから、そんなNATを意識しないアプリケーションはほとんど当たらないだろうから心配しなくてもいいと思います。
3は実際どんな動きをするのかはまったくわかりません。
ただ、NATに求められる要件として、tcp/udp,icmp以外のIPパケットについてはIPアドレスとIPプロトコル番号でセッション情報を保持すると書いてあったのでこのとおりに作ってあるNAT箱は問題が起きないと思います。
特にオンラインゲームなどではNATの影響が大きいので注意する必要があります。
代表的なオンラインゲームのNAT方法は別の機会に特集してみたいと思います。
参考文献
RFC2663
FreeBSD日本語マニュアル検索 ipnat(5)