みなさんこんにちは。技術部ネットワーク課の岩元です。 資格の勉強中にふと「NAT」という言葉を目にしました。何となく概要だけは存じておりましたが、実際にどのコマンドを設定して、どういう処理がなされているのかについてはよく知りませんでしたので、NATの設定や処理について検証してみました。
※今回の検証には、Cisco Packet Tracer という検証ソフトを使用しています。
NATの技術の種類
NATには大きく分けて、NATと、NAPT(別称でPAT)があります。 簡単にご説明いたします。
NATとは
NAT(Network Address Translation)はIPアドレスを変換する技術で、もともとはIPv4アドレスの枯渇問題の回避策として考えられました。 主にインターネット接続で利用され、LAN内で使用する「プライベートIPアドレス (ローカルアドレス)」とインターネットのようなパブリックネットワークで使用する 「グローバルIPアドレス」を互いに変換させます。1つのグローバルIPアドレスを、1つのローカルアドレスに対して割り当てができることが特徴です。(1対1の変換)
NAPT(PAT)とは
NAPT(Network Address Port Translation)は1つのグローバルIPアドレスを、複数のローカルアドレスに割り当てることができます。 (1対多の変換) NATは、IPアドレスのみの変換を行いますが、 NAPTではIPアドレスの他にTCP/UDPのポート番号も動的に変換してNATテーブルに登録します。 同一のIPアドレスでもポート番号の違いをみて、変換先を識別することができます。現在のインターネットではNAPTが主流です。
アドレスの種類
以下はCisco のNAT設定で定義されているアドレスについて説明したものです。
アドレス | 用語 | 意味 |
---|---|---|
内部ローカルアドレス | Inside local | LAN内のネットワークに割り当てられているプライベートIPアドレス |
内部グローバルアドレス | Inside global | NATによって変換されたグローバルIPアドレス |
外部ローカルアドレス | Outside local | 内部ネットワークから見た外部のIPアドレス |
外部グローバルアドレス | Outside global | 外部ネットワークから見た外部のIPアドレス(外部ローカルと同じになる) |
NATの概要について軽く説明させていただきました。次は実際にNATの設定を入れて、アドレス変換の処理について検証していきます。
スタティックNATの検証
スタティックNATは、ローカルアドレスと、グローバルアドレスを1対1で手動で設定します。以下の環境にて検証します。
- InsidePC(192.168.1.1)をNATで 192.0.2.2 に変換
- OutsidePC(192.0.2.1)をNATで 192.168.1.2 に変換
- 図のInsidePCからOutsidePC に向けて疎通がとれるか検証
○内部に接続しているインターフェースには「inside」。外部に接続しているインターフェースには「outside」を設定します。
Router(config)#interface GigabitEthernet 0/0 Router(config-if)#ip address 192.168.1.10 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#ip nat inside Router(config)#interface GigabitEthernet 0/1 Router(config-if)#ip address 192.0.2.10 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#ip nat outside
○ローカルアドレスとグローバルアドレスの対を設定します。
Router(config)#ip nat outside source static 192.0.2.1 192.168.1.2 Router(config)#ip nat inside source static 192.168.1.1 192.0.2.2
○NATテーブルを確認します
Router#show ip nat translation Pro Inside global Inside local Outside local Outside global --- 192.0.2.2 192.168.1.1 --- --- --- --- --- 192.168.1.2 192.0.2.1
ローカルアドレスとグローバルアドレスの組み合わせが、設定されていることが確認できますが、この時点ではまだ、InsidePCからOutsidePCへ、パケットを送信することが出来ません。
これは、パケット送信時に「In → Out」と「Out → In」の各方向で、ルーティングとNATの順番が異なるためです。
Inside → Outside へパケットを送信する際は、あらかじめルーティング情報を知っている必要があるのです。 スタティックルートで、外部ローカルアドレス(192.168.1.2)宛のルーティングを設定しておきます。
Router(config)#ip route 192.168.1.2 255.255.255.255 GigabitEthernet 0/1
Routerでデバッグログを表示させ、InsidePCからOutsidePCへpingを送った際の、アドレス変換ログの一部を確認してみます。
・Router でデバッグログを表示 Router#debug ip nat IP NAT debugging is on
・InsidePC のコマンドプロンプトで「192.168.1.2」にPing送信 Cisco Packet Tracer PC Command Line 1.0 C:\>ping 192.168.1.2
Router のログを確認(一部抜粋) NAT: s=192.168.1.1->192.0.2.2, d=192.168.1.2 [21] NAT: s=192.0.2.2, d=192.168.1.2->192.0.2.1 [21] NAT*: s=192.0.2.1->192.168.1.2, d=192.0.2.2 [15] NAT*: s=192.168.1.2, d=192.0.2.2->192.168.1.1 [15]
192.168.1.1->192.0.2.2
(内部ローカル→内部グローバル)192.168.1.2->192.0.2.1
(外部ローカル→外部グローバル)192.0.2.1->192.168.1.2
(外部グローバル→外部ローカル)192.0.2.2->192.168.1.1
(内部グローバル→内部ローカル)
上述の結果から、うまくアドレス変換できていることが検証できました。
ダイナミックNATの検証
ダイナミックNATとは、変換で使用するグローバアドレスのプール(アドレスの範囲)を指定し、パケット送信時にローカルアドレスと、プール内からアドレス1つを使用して変換させます。 スタティックNATのように個別で設定する必要はなく、動的に変換先のアドレスが割り当てられます。ただし、Inside から Outside への一方向変換の処理に対応しております。以下の環境でダイナミックNATを検証します。
- 変換する前のローカルアドレスは、192.168.1.0/24 内の範囲を指定
- 変換で使用するグローバルアドレスは、192.0.2.11 ~ 192.0.2.13 までを指定
- PC(3台)から Server へWebアクセスできるか検証
○スタティックNATと同様に、各インターフェースに「inside」/「outside」を設定します
Router(config)#interface gigabitEthernet 0/0 Router(config-if)#ip address 192.168.1.10 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#ip nat inside Router(config)#interface gigabitEthernet 0/1 Router(config-if)#ip address 192.0.2.10 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#ip nat outside
○変換元のローカルアドレスを、ACL形式で定義します(192.168.1.0 / 24 内のアドレスをpermitで登録します)
Router(config)#access-list 10 permit 192.168.1.0 0.0.0.255
○グローバルアドレスのプールを定義します(192.0.2.11 ~ 192.0.2.13までを使用するアドレスプールを作成します)
Router(config)#ip nat pool TEST01 192.0.2.11 192.0.2.13 netmask 255.255.255.0
○ローカルアドレスを定義したACLと、グローバルアドレスのプールを紐づけします
Router(config)#ip nat inside source list 10 pool TEST01
※この時点では、NATテーブルに何も登録されません。ダイナミックNATはパケットを送信することで動的に変換の組み合わせが登録されるためです。
Router#show ip nat translations Router#
PC1~PC3の3台から同時に Server へWebアクセスします。
※Cisco Packet Tracer の「Web Browser」ツールを使用してアクセスしております。
○Webアクセス直後のNATテーブル確認してみます
Router#show ip nat translations Pro Inside global Inside local Outside local Outside global tcp 192.0.2.11:1026 192.168.1.3:1026 192.0.2.1:80 192.0.2.1:80 tcp 192.0.2.12:1026 192.168.1.1:1026 192.0.2.1:80 192.0.2.1:80 tcp 192.0.2.13:1026 192.168.1.2:1026 192.0.2.1:80 192.0.2.1:80
- 一方向変換のため「Outside local」と「Outside global」は変わりません。
- 「Inside global」を確認すると、設定したアドレスプール(192.0.2.11~192.0.2.13)から1つずつ割り当てられていることが分かります。各「Inside local」と「Inside global」がNATテーブルに登録されており、ダイナミックNATでアドレス変換できていることが検証できました。
NAPT(PAT)の検証
以下の環境にてNAPT(別称:PAT)によるアドレスとポート番号の変換を検証します。
- 変換する前のローカルアドレスは、192.168.1.0/24 内の範囲を指定
- PC(3台)から Server へ同時にWebアクセス。
- 今回、変換で使用するグローバルアドレスは、外部インターフェースを指定。
- プールアドレスも指定できます。グローバルアドレスは1つで動作できるため、ルータの外部インターフェースを直接指定することもできます
○各インターフェースに「inside」/「outside」を設定します
Router(config)#interface gigabitEthernet 0/0 Router(config-if)#ip address 192.168.1.10 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#ip nat inside Router(config)#interface gigabitEthernet 0/1 Router(config-if)#ip address 192.0.2.10 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#ip nat outside
○変換元のローカルアドレスを、ACL形式で定義します
Router(config)#access-list 10 permit 192.168.1.0 0.0.0.255
○送信元のアクセスリストと、外部インターフェース(Gi0/1)を紐づけます。また、NAPTを適用させるために末尾に「overload」を設定します。
Router(config)#ip nat inside source list 10 interface GigabitEthernet 0/1 overload
○Server に対して同時にWebアクセスし、直後のNATテーブルを確認してみます。
Router#show ip nat translations Pro Inside global Inside local Outside local Outside global tcp 192.0.2.10:1028 192.168.1.2:1028 192.0.2.1:80 192.0.2.1:80 tcp 192.0.2.10:1029 192.168.1.3:1029 192.0.2.1:80 192.0.2.1:80 tcp 192.0.2.10:1031 192.168.1.1:1031 192.0.2.1:80 192.0.2.1:80
アドレスとポート番号の組み合わせをみてみると「Inside global」のIPアドレスは全て「192.0.2.10」で同一ですが、 割り当てられているポート番号が"1028"、"1029"、"1031"と異なっていることが確認できます。 PCそれぞれが、別の宛先で識別されているため、同時にwebアクセスできていることが検証できました。
最後に
今回はNATについての一般的な技術について触れてみました。NATは非常に奥が深く、今度は実機に設定を入れて、 もう少し深い技術について検証を進めることも面白そうと感じました。
NATに限った話ではございませんが、普段私たちがインターネットを利用する上で、その裏側には数多くの重要な技術が存在しています。 そういった1つ1つの技術について、手を動かしながら、日々理解を深めていくことがとても大事なのだと感じました。