NAPT

ここまでNAT関連で以下のエントリを書きました。 - [NAT(Network Address Translation)の基本](https://windowsadmin.ebisuda.net/2011/01/12/natnetwork-address-translation%e3%81%ae%e5%9f%ba%e6%9c%ac/) - [1対1 NAT](https://windowsadmin.ebisuda.net/2011/01/19/1%e5%af%be1-nat/) 1対1NATではシンプルに2つのIPが相互に変換される動きをみました。シンプルですが、IPアドレスが沢山必要になってしまうという欠点もありました。今回はより「よく使われているNAT」であるNAPTを見ていこうと思います。 ### ブロードバンドルータ経由で複数のPCがインターネットに同時に接続する [![](https://windowsadmin.ebisuda.net/wp-content/uploads/2011/02/image_thumb6.png)](https://windowsadmin.ebisuda.net/wp-content/uploads/2011/02/image6.png) 上記のような環境を考えてみます。家庭内にPCが2台あって、同時にインターネットに出るようなイメージですね。PC1,PC2が同時にWeb Serverに対してWebサイトの閲覧を行おうとしたとします。 WEBサーバーへの通信を開始するので、以下のパケットを生成します。WEBサーバーを想定していますので宛先のポート番号は80番。送信元のポート番号はランダムなポートになりますがここでは1024番にしておきます。 PC1が生成したパケット PC2が生成したパケット 上記パケットがブロードバンドルーターまで届きました。ここでNATが行われます。まず、前回解説した通り宛先IPアドレスは変更されませんし、宛先のポート番号も変更されません(Web Serverの気持ちになってみれば、これは当然です)。送信元IPアドレスはブロードバンドルーターの持っているグローバルアドレスになります(ほかにグローバルIPアドレスはありませんので)。問題はこのときの送信元ポート番号を何番にするか、ということです。どのようにすべきかちょっと考えてみてください。複数のPCが存在していることを考慮してみてくださいね。 ・・・。 ・・・。 ・・・。 考えてもらえましたでしょうか。正解は1つではないです。結局送信元のポート番号はランダムに選ばれていますので、基本的には何番でもかまわないからです。ただ、以下のことは考慮しないといけません。 - 送られてきたパケットと同じ送信元ポート番号を使うことにした場合、他のPCからも同じ送信元ポート番号のパケットが送られてきたときの考慮が必要。(同じ送信元ポート番号を使うと、どちらのPCにひもづいた通信なのかわからなくなってしまう。) - ブロードバンドルーターからも通信を開始する可能性があり、そのときの通信とも重複しないようにする必要がある。 通信が混ざる、混ざらないということに関しては、TCPのコネクションの概念を理解していないと理解できないです。このあたりの理解が難しければ、以下のエントリを参照してもらえればと思います。 - [レイヤ4 -トランスポート層- ポート番号](https://windowsadmin.ebisuda.net/2009/10/06/%e3%83%ac%e3%82%a4%e3%83%a44-%e3%83%88%e3%83%a9%e3%83%b3%e3%82%b9%e3%83%9d%e3%83%bc%e3%83%88%e5%b1%a4-%e3%83%9d%e3%83%bc%e3%83%88%e7%95%aa%e5%8f%b7/) TCP/IPでは宛先IP、宛先ポート番号、送信元IP、送信元ポート番号の4つの要素の組み合わせで通信を区別します(ソケット)。今考えている環境ではブロードバンドルーター自体と複数のPCが(インターネットへの通信に関して)同じIPアドレスを共有しているのでポート番号でしか区別できなくなっています。なので、ポート番号は(インターネットに出るときには)かならず重複しないようにしなくてはいけないわけです。 このようにポート番号まで書き換えるNATのことをNAPTといいます。 ここまで理解できれば、ブロードバンドルーター上でNATを行ったときに管理表が必須になることがわかると思います。どのパケットをどのように変換すればいいのか、という管理表です。俗にNATテーブルと呼ばれます。 NATテーブルをまで意識しながら通信の流れを見てみましょう。 プライベートIPからグローバルIPへの変換 グローバルIPからプライベートIPへの変換(戻りパケット) どうでしょうか?このようにNATの変換表に、IPとポート番号の情報まで盛り込むことで、1つのグローバルIPのみを用いて複数の端末がプライベートLANからインターネットにまでアクセスできるようになりました。 この際、NATでポート番号まで管理、変換していますのでNAPT(Network Address Port Translation)と呼ばれます。ちなみに、「IPマスカレード」という単語で呼ばれることもありますが、これはLinuxにおけるNAPTの実装の名前が「IPマスカレード」であったために、このように呼ばれるそうです。Linux上の実装は今現在はiptablesに変わっていますので、技術の名称と実装の名称は区別して呼んだ方がよい個人的には思います。 さて、これで一応NAT関連の基礎的な部分は解説を終えたことになります。ここまで理解できればあとはバリエーションの問題ですので、考えれば思いつけるようになると思います。 NATの説明の中ではレイヤ3、レイヤ4にのみ注目しましたが、それぞれレイヤ2レベルでのやり取りも説明できる状態にしておくのが重要だと思います。上記の図にレイヤ2レベルの情報を書き込めるでしょうか?難しければ以下のエントリを再度読んでみてからトライしてみてください。 - [レイヤ2 –データリンク層- 宛先はMACアドレス](https://windowsadmin.ebisuda.net/2009/02/12/%e3%83%ac%e3%82%a4%e3%83%a42-%e3%83%87%e3%83%bc%e3%82%bf%e3%83%aa%e3%83%b3%e3%82%af%e5%b1%a4-%e5%ae%9b%e5%85%88%e3%81%afmac%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9/)

February 9, 2011 · 1 min · 胡田昌彦

1対1 NAT

今回は前回に引き続いてNATについての話です。前回の記事を読まれていない方は先によんでおいていただくことをお勧めします。 - [NAT(Network Address Translation)の基本 | WindowsServer管理者への道](https://windowsadmin.ebisuda.net/2011/01/12/natnetwork-address-translation%e3%81%ae%e5%9f%ba%e6%9c%ac/) ここまではTCPのポート番号には注目しませんでした。今回はTCPのポート番号まで意識して動きを見ていきます。 NAT 以下は前回のおさらいです。IPアドレスにだけ注目して以下のような変換が行われることを説明しました。 ここにポート番号も書き加えてみます。本当は様々なバリエーションがあるのですが、以下ではNATが書き換えるのはIPアドレスのみとします。 単純にTCPのポート番号を書き加えただけですが、大丈夫でしょうか。PC1から見た宛先サーバーのポート番号はWEBサーバーですので80番となり、ソースポートに関しては、ランダムに選ばれますが、ここでは1024番としてあります。WEBサーバーからの戻りのパケットはソースとデスティネーションのポート番号が入れ替わっています。 複数台のNAT それでは、ここでさらにPCがもう一台ある環境を考えてみましょう。 PC1とPC2が同じブロードバンドルーターの下にある状況です。 TCPでは送信元ポートはランダムに選ばれます。なので「PC1とPC2が同じサーバー(宛先IP)の同じサービス(宛先ポート番号)に同じ送信元番号をつかって接続する」ということは普通に起こりうることです。同一LAN内であればこれは以下のように区別することが可能です。 - 宛先IP:宛先ポート番号 - PC1のIP:送信元ポート番号 - 宛先IP:宛先ポート番号 - PC2のIP:送信元ポート番号 PC1のIPとPC2のIPが異なるので当たり前に区別できるのですが、これが上記の図の中で、同じWEBサーバーに対して接続をしようとし、その時の送信元ポート番号がたまたま同一で、さらにそのパケットがNATされた時にはどうなるでしょうか? 変換前パケットには送信元IPしか違いがなかったのに、それをどちらもGlobal IP Aに変換してしまっては区別がつかなくなってしまいます。これでは通信が混ざっていしまい、うまくいきません。 これを解決するにはどうしたらいいでしょうか。色々やり方はありますが、TCPポートは書き換えずに実現可能な方法を考えてみて下さい。 ・・・・・・。 ・・・・・・。 ・・・・・・。 思いついたでしょうか。正解は「ブロードバンドルータにPC1、PC2に対応するグローバルIPをそれぞれ割り当てる」ということです。以下のように、グローバルIPとプライベートIPの対応を作ってしまう訳です。 プライベートIP グローバルIP 192.168.1.1 Global IP A 192.168.1.2 Global IP C こうする事でインターネットとプライベートネットワークとで相互に通信出来ます。 1対1 NAT この様にグローバルとプライベートのIPを1対1で対応付けするNATを1対1NATと呼びます。 注目すべきは、プライベートネットワーク(PC1, PC2が存在するプライベートIPをつかった192.168.1.0/24のネットワーク)からインターネットへの通信のみならず、インターネットからプライベートネットワークへの通信もきちんと対応付ける事が可能な事です。(実際に通信させるかどうかは別問題ですが、「対応づけを矛盾なく行うことができる」ということです。) そして、グローバルIPアドレスが沢山必要になってしまう事も特徴です。 このNATはインターネット上に複数(WEB、MAIL等々)のサービスを提供するサーバーの公開の時に使われる事が多いです。グローバルIPアドレスが沢山必要になるので、一般家庭ではめったに使われない形態ではあります。 今回は1番シンプルなNATロジックである1対1NATを説明しました。次回以降はTCPのポート番号まで書き換える形態のNATを説明しようと思います。お楽しみに!

January 19, 2011 · 1 min · 胡田昌彦