スタティックNATの基本と設定方法
スタティックNATは、内部ネットワークで使われているプライベートIPアドレスを、固定的にグローバルIPアドレスへ変換する仕組みです。ここでは、その設定手順と動作の流れを整理して学んでいきましょう。
イメージとしては、社内の一人ひとりの社員に「外で使う専用の名刺」をあらかじめ割り当てておくようなものです。名刺(グローバルIP)が決まっているので、外部の人もその人に必ずアクセスできる、という安心感があります。
設定手順の流れ
スタティックNATを設定する際の手順は大きく2つに分かれます。
まずは「内部で使っているアドレス」と「外部に公開するアドレス」を1対1で結びつけます。次に、その変換を適用するインターフェースを「内部」か「外部」か指定します。
内部アドレスと外部アドレスの対応付け
内部のアドレスと外部のアドレスを結びつけるには、次のようなコマンドを入力します。
(config)# ip nat inside source static 内部ローカルIP 外部グローバルIP
例えば、PCのIPアドレスが192.168.0.1で、それを外部から100.1.1.1として見せたい場合は以下のようにします。
(config)# ip nat inside source static 192.168.0.1 100.1.1.1
この設定をすることで、192.168.0.1のPCが外に通信するときは、送信元が100.1.1.1に書き換えられて出ていきます。
内部と外部のインターフェース指定
どのインターフェースが内部用か、外部用かを指定するのも重要です。設定は以下のようになります。
(config-if)# ip nat inside
(config-if)# ip nat outside
社内LANにつながるインターフェースをinside、インターネット側に出ていくインターフェースをoutsideとして設定するのが基本です。
showコマンドで確認
設定ができると、show ip nat translationで変換状況を確認できます。スタティックNATの場合は、通信がなくてもテーブルに変換情報が表示されます。
例としては次のように表示されます。
Inside global Inside local Outside local Outside global
100.1.1.1 192.168.0.1 --- ---
ここで「Inside local」が内部の実アドレス、「Inside global」が外部に公開されるアドレスです。
ポート番号を含めたスタティック変換
スタティックNATでは、IPアドレスだけでなくポート番号まで指定して変換することもできます。これはサーバーの公開などに使われる大切な機能です。
例えば、内部PCのSSHサービス(192.168.0.1:22)を外部に公開したい場合、次のように設定します。
(config)# ip nat inside source static tcp 192.168.0.1 22 100.1.1.1 220 extendable
この設定をすると、外部からSSH接続したいときにはポート番号220を宛先に指定しなければなりません。内部の22番ポートと外部の220番ポートが結びつけられているためです。
NATテーブルを見ると、静的に登録された行と、実際に通信が始まって動的に作られる行の両方が確認できます。
Pro Inside global Inside local Outside local Outside global
tcp 100.1.1.1:220 192.168.0.1:22 --- ---
tcp 100.1.1.1:220 192.168.0.1:22 100.1.1.2:51180 100.1.1.2:51180
ダイナミックNATの基本と設定方法
ダイナミックNATは、スタティックNATのように「1対1で固定」するのではなく、あらかじめ用意しておいたアドレスプールの中から空いているグローバルアドレスを動的に割り当てる仕組みです。イメージとしては、会社に出社した社員が日替わりで空いている「共用デスク」に座るような感じです。誰がどのデスクを使うかは、その時々で変わります。
この仕組みにより、限られた数のグローバルアドレスを効率的に使うことができます。ただし、一度に同時接続できる数はアドレスプールの数に制限されます。
設定手順の流れ
ダイナミックNATを構築する際の流れは4ステップです。
- 内部グローバルアドレスのプールを作成する
- 変換対象となる内部ローカルアドレスをACLで定義する
- ACLとアドレスプールを関連付ける
- インターフェースにinside / outsideを指定する
アドレスプールの定義
まずは、外部に公開するためのグローバルアドレスをまとめた「アドレスプール」を作成します。
(config)# ip nat pool プール名 開始IP 終了IP netmask サブネットマスク
例えば、100.1.1.10~100.1.1.20の範囲をプールにするなら次のようになります。
(config)# ip nat pool POOL1 100.1.1.10 100.1.1.20 netmask 255.255.255.0
ここで作ったPOOL1の中から、空いているIPが内部端末に割り当てられるイメージです。
ACLで対象アドレスを指定
次に、どの内部アドレスをNAT変換するのかをACLで指定します。標準ACLを使うのが一般的です。
(config)# access-list 1 permit 192.168.0.0 0.0.0.255
この設定では、192.168.0.0/24のネットワークに属するPCが対象になります。
ACLとプールの関連付け
作成したACLとアドレスプールを結びつけるのが次のコマンドです。
(config)# ip nat inside source list 1 pool POOL1
この一文で「192.168.0.0/24のPCはPOOL1の中からグローバルアドレスを割り当てる」というルールが確立されます。
インターフェースの設定
最後に、ルータのどのインターフェースが内部(inside)で、どれが外部(outside)なのかを設定します。
(config-if)# ip nat inside
(config-if)# ip nat outside
LAN側をinside、インターネット側をoutsideにするのが基本です。
動作の違い(スタティックNATとの比較)
スタティックNATでは、設定した時点でNATテーブルに変換情報が載るため、外部からでも内部からでも通信を開始できます。
一方、ダイナミックNATでは内部から通信を始めたときに初めて変換テーブルが作られます。つまり、外部から直接アクセスを開始することはできません。
試験の観点では、この違いがよく問われます。「ダイナミックNATは内部からの通信でテーブルが生成される」という点は必ず押さえておきましょう。
PATの基本と設定方法
PAT(Port Address Translation)は、1つのグローバルIPアドレスを複数の端末で共有できる仕組みです。スタティックNATやダイナミックNATでは「アドレスの数=同時利用できる端末数」となってしまいますが、PATではポート番号を利用して区別するため、たくさんの内部端末が同じグローバルIPを使えるようになります。
イメージとしては、大きなオフィスビルにある「代表電話番号」を思い浮かべるとわかりやすいです。外部からは同じ電話番号(グローバルIP)にかかってきますが、実際には内線番号(ポート番号)を使って社員(内部端末)ごとに振り分けられます。
PATの設定には、大きく分けて2つの方法があります。1つ目は「外部インターフェースのアドレスを使う方法」、2つ目は「プールに定義したアドレスを使う方法」です。
PATの設定(外部インターフェースのアドレスを使用)
最も一般的な方法は、外部インターフェースに割り当てられているアドレスを使うPATです。
- 内部アドレスをACLで指定する
- ACLと外部インターフェースを関連付ける(overloadを必ずつける)
- インターフェースをinside / outsideに指定する
ACLの作成
(config)# access-list 1 permit 192.168.0.0 0.0.0.255
この例では、192.168.0.0/24の内部端末をPATの対象としています。
ACLと外部インターフェースの関連付け
(config)# ip nat inside source list 1 interface GigabitEthernet0/0 overload
ここでのポイントは overload というオプションです。これがついていることで、1つのグローバルIPをポート番号で使い分けて複数端末が利用できるようになります。
インターフェースの指定
(config-if)# ip nat inside
(config-if)# ip nat outside
LAN側をinside、インターネット側をoutsideにするのが基本です。
動作のイメージ
例えば、内部に3台のPC(192.168.0.1、192.168.0.2、192.168.0.3)がある場合、外に出るときはどれも「100.1.1.1」というアドレスに変換されます。ただし、送信元ポート番号はそれぞれ異なる値に変えられるため、戻ってきた応答パケットも正しく対応するPCに振り分けられます。
PATの設定(プールに定義したアドレスを使用)
もう1つの方法は、プールに定義したアドレスを使うやり方です。設定手順はダイナミックNATと似ていますが、ポイントは プールのアドレスを1つだけにする ことと、コマンドの最後に overload をつけることです。
- グローバルアドレスのプールを作成(1つのIPだけ)
- ACLで内部アドレスを定義
- ACLとプールを関連付け(overloadを忘れない)
- インターフェースをinside / outsideに指定
プールの作成例
(config)# ip nat pool POOL1 100.1.1.100 100.1.1.100 netmask 255.255.255.0
ACLの作成例
(config)# access-list 1 permit 192.168.0.0 0.0.0.255
ACLとプールの関連付け
(config)# ip nat inside source list 1 pool POOL1 overload
インターフェースの指定
(config-if)# ip nat inside
(config-if)# ip nat outside
NATテーブルと確認コマンド
NATを設定したら、正しく変換されているかを確認することが重要です。ここでは、スタティックNAT・ダイナミックNAT・PAT それぞれのテーブルの違いと、確認コマンドの使い方を整理して学んでいきます。
実際のCCNA試験でも「showコマンドの出力から、どのNAT方式が使われているかを判別する問題」が出題されやすいため、出力例と見方を理解しておくことが得点につながります。
スタティックNATのテーブル確認
スタティックNATは、1対1で固定的に変換する方式です。そのため、通信が発生していなくても、設定した時点でNATテーブルに変換情報が表示されます。
Cisco(config)# ip nat inside source static 192.168.0.1 100.1.1.1
Cisco(config)# interface GigabitEthernet0/1
Cisco(config-if)# ip nat inside
Cisco(config)# interface GigabitEthernet0/0
Cisco(config-if)# ip nat outside
この設定後に show ip nat translations を確認すると、以下のように表示されます。
Inside global Inside local Outside local Outside global
100.1.1.1 192.168.0.1 --- ---
「Inside global」が外部に見せるアドレス、「Inside local」が内部で使っている実アドレスです。
ダイナミックNATのテーブル確認
ダイナミックNATでは、アドレスプールから空きアドレスを動的に割り当てます。
Cisco(config)# ip nat pool TEST 100.1.1.1 100.1.1.6 netmask 255.255.255.248
Cisco(config)# access-list 1 permit 192.168.0.0 0.0.0.255
Cisco(config)# ip nat inside source list 1 pool TEST
この状態で show ip nat translations を実行しても、まだ何も表示されません。理由は「内部から通信を開始しないとテーブルが作られない」からです。
例えば、192.168.0.1 のPCから 200.1.1.2 のWebサーバにアクセスすると、次のようにテーブルが作成されます。
Pro Inside global Inside local Outside local Outside global
tcp 100.1.1.2:12345 192.168.0.1:12345 200.1.1.2:80 200.1.1.2:80
PATのテーブル確認
PATでは、1つのグローバルIPをポート番号を使って複数の内部端末で共有します。設定例は以下の通りです。
Cisco(config)# access-list 1 permit 192.168.0.0 0.0.0.255
Cisco(config)# ip nat inside source list 1 interface GigabitEthernet0/0 overload
この場合も、通信が発生するまではテーブルに何も表示されません。
内部端末(例:192.168.0.1)が200.1.1.2へアクセスすると、次のように表示されます。
Pro Inside global Inside local Outside local Outside global
tcp 100.1.1.1:40001 192.168.0.1:12345 200.1.1.2:80 200.1.1.2:80
このように、同じグローバルアドレス「100.1.1.1」が使われますが、ポート番号で複数の通信を区別しているのがわかります。
NATアドレス変換の統計情報
テーブルの詳細だけでなく、統計情報を確認できるのが show ip nat statistics です。
例:
Total active translations: 3 (1 static, 2 dynamic; 2 extended)
Outside interfaces: FastEthernet0
Inside interfaces: FastEthernet1
Hits: 559 Misses: 130
Expired translations: 45
ここでは以下の点が読み取れます。
- 現在アクティブな変換エントリは3つ
- そのうちスタティックが1つ、動的変換が2つ
- 559回変換が成功(Hits)、130回は変換できなかった(Misses)
- 45回の変換エントリがタイムアウトで削除された
NATのデバッグ
リアルタイムでNATの動きを確認するには debug ip nat を使います。
行きのパケットでは送信元アドレスが「192.168.0.1 → 100.1.1.1」に変換され、宛先「200.1.1.2」に送られていることが確認できます。
帰りのパケットでは、サーバ(200.1.1.2)から戻ってきた宛先「100.1.1.1」が「192.168.0.1」に変換され、内部PCに届くことが確認できます。
NATテーブルのエントリ管理
NATを利用すると、ルータ内部には「どの内部アドレスがどの外部アドレスに変換されているか」を記録したNATテーブルが作成されます。このテーブルは通信を正しく戻すための地図のような役割を持ちます。ここでは、そのエントリを手動でクリアする方法と、自動的に消えるタイムアウトの仕組みについて整理します。
変換エントリのクリア方法
スタティックNATでは、設定と同時にNATテーブルへ変換情報が静的に登録され、削除されることはありません。対して、ダイナミックNATやPATでは、通信が途絶えると一定時間でエントリが自動的に消えます。
しかし、管理者が任意のタイミングでエントリを消したい場合もあります。そのときに使うのが clear ip nat translations コマンドです。
すべての動的エントリをクリア
# clear ip nat translations *
動的に生成された全てのNAT変換エントリを削除します。試験や検証環境で「一度リセットしたい」ときに便利です。
特定の内部変換エントリをクリア
# clear ip nat translations inside global-ip local-ip
特定の内部グローバルアドレスと内部ローカルアドレスの対応関係だけを削除します。
内部・外部の両方を指定してクリア
# clear ip nat translations inside global-ip local-ip outside local-ip global-ip
内部と外部のアドレスを組み合わせて、さらに細かく対象を指定して削除することも可能です。
NAT変換エントリのタイムアウト
ダイナミックNATやPATでは、一定時間通信が行われなければ変換エントリは自動的に消えます。この「一定時間」がタイムアウトで、プロトコルごとに異なる値が設定されています。必要に応じて変更可能です。
ダイナミックNATのタイムアウト
(config)# ip nat translation timeout 秒数
デフォルトは 86400秒(24時間) です。
PATのタイムアウト(TCP)
(config)# ip nat translation tcp-timeout 秒数 [ never ]
デフォルトは 86400秒(24時間) です。never を指定すると消えなくなりますが、セキュリティやルータ負荷の観点から推奨されません。
PATのタイムアウト(UDP)
(config)# ip nat translation udp-timeout 秒数 [ never ]
デフォルトは 300秒 です。UDPは接続状態を持たないため、短めに設定されています。
PATのタイムアウト(DNS)
(config)# ip nat translation dns-timeout 秒数 [ never ]
デフォルトは 60秒 です。名前解決のクエリは瞬時に終わるため短い値が使われています。
PATのタイムアウト(ICMP)
(config)# ip nat translation icmp-timeout 秒数 [ never ]
デフォルトは 60秒 です。pingなどの疎通確認で使うため、短く設定されています。
双方向NAT(Twice NAT)の考え方
双方向NATは、同じNATルータが「内側の送信元変換」と「外側の送信元変換」を同時にこなす仕組みです。たとえば、社内PCは相手を“社内っぽいアドレス”だと信じて通信し、社外サーバは相手を“社外っぽいアドレス”だと信じて通信します。お互いの本当のIPを知らなくても会話できるため、相手の所在を隠したい場合やアドレス計画を崩したくない場面で便利です。身近な例に置き換えると、ルータが「内線番号」と「外線番号」を両方持つ交換手になり、どちらからかけても相手の“都合のいい番号”にすり替えてつないでくれるイメージです。
2本のコマンドで“内側用”と“外側用”を用意する
双方向NATは設定を2本セットで考えると理解しやすくなります。内側の実アドレスを外側に見せるアドレスへ固定変換するのが ip nat inside source static、外側の実アドレスを内側に見せるアドレスへ固定変換するのが ip nat outside source static です。どちらも“source”ですが、対象が内側か外側かで役割が異なります。下の表は、設定で登場する4つのアドレスの関係を一望できるように並べたものです。
| 観点 | 内側ホストの実体 | 内側に見せる“外側” | 外側ホストの実体 | 外側に見せる“内側” |
|---|---|---|---|---|
| 例で使う値 | 192.168.1.10 | 192.168.1.20 | 10.1.1.10 | 10.1.1.20 |
| 関与コマンド | ip nat inside source static 192.168.1.10 10.1.1.20 | なし(内側から見える外側側の仮想IPは別コマンドで用意) | ip nat outside source static 10.1.1.10 192.168.1.20 | なし(外側から見える内側側の仮想IPは別コマンドで用意) |
| だれがそのIPに応答するか | 192.168.1.10 は自機 | 10.1.1.20 はNATルータ | 10.1.1.10 は自機 | 192.168.1.20 はNATルータ |
コンフィグ例と通信の流れ
次の設定では、内側セグメントを 192.168.1.0/24、外側セグメントを 10.1.1.0/24 とし、内側の 192.168.1.10 が外側を 10.1.1.20 と見て通信し、外側の 10.1.1.10 が内側を 192.168.1.20 と見て通信します。
! 変換の定義(内→外、外→内)
ip nat inside source static 192.168.1.10 10.1.1.20
ip nat outside source static 10.1.1.10 192.168.1.20
! インターフェースの向き
interface GigabitEthernet0/1
ip address 192.168.1.254 255.255.255.0
ip nat inside
!
interface GigabitEthernet0/0
ip address 10.1.1.254 255.255.255.0
ip nat outside
! outside static用の到達性を確保(どちらか一方を採用)
ip route 192.168.1.20 255.255.255.255 GigabitEthernet0/0
! あるいは
! ip nat outside source static 10.1.1.10 192.168.1.20 add-route
動き方を具体的に追うと、内側PCが 192.168.1.20 へ送るとき、同一サブネット宛だと判断して ARP を出します。192.168.1.20 はNATルータが“持つ”仮想IPなので、ルータがARPに応答してフレームを受け取り、宛先を 10.1.1.10、送信元を 10.1.1.20 に書き替えて外側に転送します。外側サーバから見れば相手は 10.1.1.20 にしか見えないため、本物の 192.168.1.10 を知る必要がありません。外側サーバが 10.1.1.20 宛に返すと、今度はNATルータが受けて 192.168.1.20 宛に変換し、同じく自分の仮想IPとして受け取り、最終的に 192.168.1.10 へ届けます。どちらのホストも“同一セグメントの相手”に話している体裁のため、この例に限ってはデフォルトゲートウェイの設定がなくても往復できます(相手が仮想IP=ルータ直結に見えるためです)。
NATテーブルの読み方(静的に生成される)
双方向NATは静的変換なので、設定直後から show ip nat translations に行が現れます。代表的な表示は次の通りです。
Inside global Inside local Outside local Outside global
10.1.1.20 192.168.1.10 --- ---
--- --- 192.168.1.20 10.1.1.10
上段は「内側→外側」の写像で、192.168.1.10 を 10.1.1.20 として扱うことを示します。下段は「外側→内側」の写像で、10.1.1.10 を 192.168.1.20 として扱うことを示します。どちらもポート番号を伴わない“IPのみの静的変換”である点が、PATの出力と大きく異なります。
なぜスタティックルートや add-route が必要なのか
ip nat outside source static を入れると、内側に見せる仮想IP(ここでは 192.168.1.20)はNATルータが“所有している体”で動作します。ルータがそのIP宛のフレームを確実に自分宛てとしてさばけるよう、/32 の到達性を外側インターフェース側に明示する必要があります。方法は2通りで、固定ルートを置くか、コマンド末尾に add-route を付けて自動生成させます。どちらでも目的は同じで、「その仮想IPはルータが握る特別な終端」であることをルーティングに反映させるためです。ここは試験でこう問われやすい。ip nat outside source static ... add-route を見たら「仮想IPへの到達性を自動で作るため」と説明できるようにします。
検証のコツと確認コマンド
動作確認は、NATとARPを組み合わせて見ると理解が早まります。show ip nat translations で静的エントリが載っているかを確かめ、show ip arp で 192.168.1.20 と 10.1.1.20 に対してNATルータ自身のMACが応答していることを確認します。パケットの経路を追いたいときは debug ip nat を使うと、送信元・宛先が仮想IPへ置き換わる様子がその場で見えます。もし通信できない場合は、inside/outside の向き、add-route もしくは/32ルートの有無、そして他機器に 192.168.1.20 や 10.1.1.20 を実IPとして割り当てていないかを順に点検すると、解決に直結します。
つまずきやすい落とし穴
内外どちらか一方の static しか入っていないと“半分だけ”のNATになり、期待どおりの対向認識になりません。また、仮想IPとして使う 192.168.1.20 や 10.1.1.20 を、実ホストに配ってしまうとARPの所有権が競合して不安定になります。仮想IPは“ルータ専用の看板”だと考え、ほかの機器に重ねないことが大切です。もう一点、Twice NATは“同一リンク内で相手がローカルに見える”前提で話しましたが、実環境ではセグメントやVLAN設計、セキュリティポリシーを踏まえ、必要なら通常どおりデフォルトゲートウェイも正しく設定しておくと、トラブル時の切り分けが容易になります。