ほとんどの本では、ダイナミック NAT では ip nat translation timeout を使い、PAT では個別のプロトコルのタイマーを使うと書かれていて、でも実機でやっていると・・・おや、違う!・・・って感じだったので、ちょこっとやってみました。ちなみに古い IOS では ip nat translation timeout コマンドのものしかダイナミック NAT では効果がなかったので、本に書かれていることが古いのかな?
- RT-A をネットワーク構成図に示す通り設定し、RT-B へのデフォルトルートを構成します。
< RT-A >
Router# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)# host RT-A
RT-A(config)# int f0/0
RT-A(config-if)# ip add 192.168.1.1 255.255.255.0
RT-A(config-if)# no shut
RT-A(config-if)# int f0/1
RT-A(config-if)# ip add 10.10.10.1 255.255.255.0
RT-A(config-if)# no shut
RT-A(config-if)# ip route 0.0.0.0 0.0.0.0 10.10.10.2
RT-A(config)#
- RT-B をネットワーク構成図に示す通り設定し、200.10.10.8/29 のネットワークへ行くためのスタティックルートを構成します。
< RT-B >
Router# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)# host RT-B
RT-B(config)# int f0/0
RT-B(config-if)# ip address 10.10.10.2 255.255.255.0
RT-B(config-if)# no shut
RT-B(config-if)# int f0/1
RT-B(config-if)# ip add 161.14.1.2 255.255.255.0
RT-B(config-if)# no shut
RT-B(config-if)# ip route 200.10.10.8 255.255.255.248 10.10.10.1
RT-B(config)# ^Z
RT-B#
- 次の情報を基に RT-A でダイナミック NAT を設定します。
< RT-A >
RT-A(config)# access-list 1 permit 192.168.1.0 0.0.0.255 ← NAT 変換するアドレス範囲をアクセスリストにて設定
RT-A(config)# ip nat pool INET 200.10.10.9 200.10.10.9 netmask 255.255.255.248 ← ダイナミック NAT の設定
RT-A(config)# ip nat inside source list 1 pool INET ← ダイナミック NAT の設定
RT-A(config)# int f0/0
RT-A(config-if)# ip nat inside ← F0/0 側を内部ネットワークに指定
RT-A(config-if)# int f0/1
RT-A(config-if)# ip nat outside ← F0/1 側を外部ネットワークに指定
RT-A(config-if)# ^Z
RT-A#
今回は1つのグローバルアドレスを複数の PC で共用するように設定しました。
- PC-A、PC-B、PC-C をネットワーク構成図に示す通り設定します。
< PC-A >
C:\> netsh interface ipv4 set address "イーサネット" static 192.168.1.10 255.255.255.0 192.168.1.1
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.168.1.10
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.1.1
C:\>
< PC-B >
C:\> netsh interface ipv4 set address "イーサネット" static 192.168.1.11 255.255.255.0 192.168.1.1
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.168.1.11
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.1.1
C:\>
< PC-C >
C:\> netsh interface ipv4 set address "イーサネット" static 161.14.1.10 255.255.255.0 161.14.1.2
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 161.14.1.10
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 161.14.1.2
C:\>
各 PC から余計なパケットが出て行かないように、ネットワーク周りの設定には気を付けてください。
- PC-A から PC-C へ ping を実行します。
< PC-A >
C:\> ping 161.14.1.10
161.14.1.10 に ping を送信しています 32 バイトのデータ:
161.14.1.10 からの応答: バイト数 =32 時間 =1ms TTL=254
161.14.1.10 からの応答: バイト数 =32 時間 =1ms TTL=254
161.14.1.10 からの応答: バイト数 =32 時間 =1ms TTL=254
161.14.1.10 からの応答: バイト数 =32 時間 =1ms TTL=254
161.14.1.10 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 2ms、最大 = 4ms、平均 = 2ms
C:\>
- 60 秒後に RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
--- 200.10.10.9 192.168.1.10 --- ---
create 00:01:40, use 00:01:40 timeout:86400000, left 23:58:19, Map-Id(In): 1,
flags:
none, use_count: 0, entry-id: 1, lc_entries: 0
RT-A#
show ip nat translations verbose コマンドで、NAT によるアドレス変換エントリの作成時間 (create)、保持時間 (timeout)、残り時間 (left) などを確認できます。
保持時間 (timeout) は msec 表示なので、秒では 1/1000 に、分では 1/(60×1000) に、時間では 1/(60×60×1000) で計算します。したがって、86400000/(60×60×1000)=24 時間です。ですので、このエントリは 24 時間保持されます。
- RT-A で、clear ip nat translation * を実行します。
< RT-A >
RT-A# clear ip nat translation *
RT-A#
- NAT によるアドレス変換の timeout を 50 秒に設定します。
< RT-A >
RT-A# conf t
Enter configuration commands, one per line. End with CNTL/Z.
RT-A(config)# ip nat translation timeout 50
RT-A(config)# ^Z
RT-A#
- PC-C で Telnet サーバーを構成します。
Windows 8.1 の場合
[スタート] ボタンを右クリック → [コントロールパネル] → [プログラム] → [Windows の機能の有効化または無効化] の順にクリックし、[Windows の機能] ダイアログボックスで、[Telnet サーバー] のチェックボックスをオンにする。
次の5つのコマンドを実行する。
1) sc config tlntsvr start=demand
← Telnet サーバーサービスを手動で起動できるようにする
2) net user telnetuser cisco /add
← Telnet で使用するユーザアカウント telnetuser を作成する (パスワード cisco)
3) net localgroup telnetclients telnetuser /add
← telnetuser というユーザアカウントを telnetclients グループに所属させる
4) tlntadmn config maxconn=5
← Telnet セッションの同時接続数を最大 5 にする
5) net start telnet
← Telnet サーバーサービスを起動する
C:\> sc config tlntsvr start=demand
[SC] ChangeServiceConfig SUCCESS
C:\> net user telnetuser cisco /add
コマンドは正常に終了しました。
C:\> net localgroup telnetclients telnetuser /add
コマンドは正常に終了しました。
C:\> tlntadmn config maxconn=5
設定が正常に更新されました。
C:\> net start telnet
Telnet サービスを開始します.
Telnet サービスは正常に開始されました。
C:\>
- PC-A から PC-C に telnet セッションを開始します。ただし、ログインはまだしない。
< PC-A >
C:\> telnet -l telnetuser 161.14.1.10
Microsoft Telnet クライアントへようこそ
エスケープ文字は 'CTRL+]' です
パスワード情報を インターネット ゾーンのリモート コンピューターに送信しようとし
ていますが、この操作は安全でない可能性があります。送信しますか? (y/n): n ← ここは no
Welcome to Microsoft Telnet Service
password:
- 50 秒以内に RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49179 192.168.1.10:49179 161.14.1.10:23 161.14.1.10:23
create 00:00:06, use 00:00:06 timeout:86400000, left 23:59:54, Map-Id(In): 1,
flags:
extended, use_count: 0, entry-id: 31, lc_entries: 0
--- 200.10.10.9 192.168.1.10 --- ---
create 00:00:06, use 00:00:06 timeout:50000, left 00:00:43, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 30, lc_entries: 0
RT-A#
以下のエントリの残り時間が 43 秒であるのに対して、
--- 200.10.10.9 192.168.1.10 --- ---
以下のエントリの残り時間は約 24 時間になっています。
tcp 200.10.10.9:49179 192.168.1.10:49179 161.14.1.10:23 161.14.1.10:23
- telnet 接続がタイムアウトになる前に PC-A から PC-C にログインします。
< PC-A >
Welcome to Microsoft Telnet Service
password: cisco ← 実際には表示はされない
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser>
Windows 8.1 では、telnet 開始から1分40秒程度で Telnet サーバーとの接続が切断されましたので、それ以内の時間にログインしなくてはいけません。
- RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49179 192.168.1.10:49179 161.14.1.10:23 161.14.1.10:23
create 00:01:29, use 00:00:33 timeout:86400000, left 23:59:26, Map-Id(In): 1,
flags:
extended, use_count: 0, entry-id: 31, lc_entries: 0
--- 200.10.10.9 192.168.1.10 --- ---
create 00:01:29, use 00:01:29 timeout:50000, timing-out, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 30, lc_entries: 0
RT-A#
以下のエントリは既にタイムアウトしているにもかかわらず
--- 200.10.10.9 192.168.1.10 --- ---
以下のエントリの残り時間は約 24 時間になっています。
tcp 200.10.10.9:49179 192.168.1.10:49179 161.14.1.10:23 161.14.1.10:23
- PC-C からログアウトします。
< PC-A >
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser> exit
ホストとの接続が切断されました。
C:\>
- RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49179 192.168.1.10:49179 161.14.1.10:23 161.14.1.10:23
create 00:02:31, use 00:00:07 timeout:86400000, left 00:00:52, Map-Id(In): 1,
flags:
extended, timing-out, use_count: 0, entry-id: 31, lc_entries: 0
--- 200.10.10.9 192.168.1.10 --- ---
create 00:02:31, use 00:02:31 timeout:50000, timing-out, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 30, lc_entries: 0
RT-A#
以下のエントリの残り時間が 52 秒に変わっています。
tcp 200.10.10.9:49179 192.168.1.10:49179 161.14.1.10:23 161.14.1.10:23
これは以下のように書かれているからのようです。
------------------------------------------------------------------------
http://www.cisco.com/cisco/web/support/JP/100/1006/1006395_nat-faq-00-j.html
Q. TCP タイムアウトとは何ですか。また、NAT の TCP タイマーとはどのような関係にありますか。
A. スリーウェイ ハンドシェイクが完了していないときに、NAT がパケットを検出した場合は、60 秒のタイマーが開始されます。スリーウェイ ハンドシェイクが完了しているときは、NAT エントリには、24 時間のタイマーがデフォルトで使用されます。エンド ホストが RESET を送信した場合には、NAT はデフォルト タイマーを 24 時間から 60 秒に変更します。FIN の場合は、FIN および FIN-ACK を受信したときに、デフォルト タイマーを 24 時間から 60 秒に変更します。
------------------------------------------------------------------------
つまり、TCP セッションの終了時に TCP タイマーの値を 24 時間から 60 秒に変更するということのようですね。
NATでの各プロトコルの主なタイマー値のデフォルトは以下の通りです。
プロトコル | デフォルト値 | 設定コマンド |
tcp | 24時間 | ip nat translation tcp-timeout [秒] |
tcp (fin/rst) | 1分 | ip nat translation finrst-timeout [秒] |
udp | 5分 | ip nat translation udp-timeout [秒] |
icmp | 1分 | ip nat translation icmp-timeout [秒] |
ただし、タイマーはもっとあります。
RT-A(config)# ip nat translation ?
arp-ping-timeout Specify timeout for WLAN-NAT ARP-Ping
dns-timeout Specify timeout for NAT DNS flows
finrst-timeout Specify timeout for NAT TCP flows after a FIN or RST
icmp-timeout Specify timeout for NAT ICMP flows
max-entries Specify maximum number of NAT entries
port-timeout Specify timeout for NAT TCP/UDP port specific flows
pptp-timeout Specify timeout for NAT PPTP flows
routemap-entry-timeout Specify timeout for routemap created half entry
syn-timeout Specify timeout for NAT TCP flows after a SYN and no
further data
tcp-timeout Specify timeout for NAT TCP flows
timeout Specify timeout for dynamic NAT translations
udp-timeout Specify timeout for NAT UDP flows
RT-A(config)#
- 再度 PC-A から PC-C に telnet セッションを開始し、今度はログインします。
< PC-A >
C:\> telnet -l telnetuser 161.14.1.10
Microsoft Telnet クライアントへようこそ
エスケープ文字は 'CTRL+]' です
パスワード情報を インターネット ゾーンのリモート コンピューターに送信しようとし
ていますが、この操作は安全でない可能性があります。送信しますか? (y/n): n ← ここは no
Welcome to Microsoft Telnet Service
password: cisco ← 実際には表示はされない
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser>
- 50秒後に RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49180 192.168.1.10:49180 161.14.1.10:23 161.14.1.10:23
create 00:00:54, use 00:00:50 timeout:86400000, left 23:59:09, Map-Id(In): 1,
flags:
extended, use_count: 0, entry-id: 33, lc_entries: 0
--- 200.10.10.9 192.168.1.10 --- ---
create 00:00:54, use 00:00:54 timeout:50000, timing-out, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 32, lc_entries: 0
RT-A#
アドレス変換用のエントリは既にタイムアウトしています。
- RT-A で、sh ip nat translations を実行します。
< RT-A >
RT-A# sh ip nat translations
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49180 192.168.1.10:49180 161.14.1.10:23 161.14.1.10:23
--- 200.10.10.9 192.168.1.10 --- ---
RT-A#
しかし、sh ip nat translations コマンドでは、まだ NAT テーブルに残っています。
- PC-B から PC-C へ ping を実行します。
< PC-B >
C:\> ping 161.14.1.10
161.14.1.10 に ping を送信しています 32 バイトのデータ:
192.168.1.1 からの応答: 宛先ホストに到達できません。
192.168.1.1 からの応答: 宛先ホストに到達できません。
192.168.1.1 からの応答: 宛先ホストに到達できません。
192.168.1.1 からの応答: 宛先ホストに到達できません。
161.14.1.10 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
C:\>
PC-B からの ping は失敗しました。
つまり、NAT 変換用グローバルアドレスは PC-A が保持したままで、PC-B は使えなかったということです。
これは NAT テーブルのアドレス変換エントリがタイムアウトしても、tcp エントリが残っていれば、その変換エントリは健在だということで、ダイナミック NAT でも、個別のプロトコルのタイマーが影響するということになります。
- PC-A から PC-C への telnet セッションを終了します。
< PC-A >
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser> exit
ホストとの接続が切断されました。
C:\>
- RT-A で、NAT テーブルをクリアした後、TCP の timeout を 70 秒に変更してみます。
< RT-A >
RT-A# clear ip nat translation *
RT-A# conf t
Enter configuration commands, one per line. End with CNTL/Z.
RT-A(config)# ip nat translation tcp-timeout 70
RT-A(config)# ^Z
RT-A#
- 再度 PC-A から PC-C に telnet セッションを開始し、今度もログインします。
< PC-A >
C:\> telnet -l telnetuser 161.14.1.10
Microsoft Telnet クライアントへようこそ
エスケープ文字は 'CTRL+]' です
パスワード情報を インターネット ゾーンのリモート コンピューターに送信しようとし
ていますが、この操作は安全でない可能性があります。送信しますか? (y/n): n ← ここは no
Welcome to Microsoft Telnet Service
password: cisco ← 実際には表示はされない
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser>
- RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49181 192.168.1.10:49181 161.14.1.10:23 161.14.1.10:23
create 00:00:16, use 00:00:13 timeout:70000, left 00:00:56, Map-Id(In): 1,
flags:
extended, use_count: 0, entry-id: 35, lc_entries: 0
--- 200.10.10.9 192.168.1.10 --- ---
create 00:00:16, use 00:00:16 timeout:50000, left 00:00:33, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 34, lc_entries: 0
RT-A#
- 1分程度待って再度 RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
RT-A#
全ての NAT 変換エントリがなくなりました。
- PC-A の状態を確認します。Enter キーを押します。
< PC-A >
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser> < Enter >
C:\Users\telnetuser>
telnet セッションはまだ維持したままのようです。
- RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49181 192.168.1.10:49181 161.14.1.10:23 161.14.1.10:23
create 00:00:04, use 00:00:04 timeout:70000, left 00:01:05, Map-Id(In): 1,
flags:
extended, use_count: 0, entry-id: 48, lc_entries: 0
--- 200.10.10.9 192.168.1.10 --- ---
create 00:00:04, use 00:00:04 timeout:50000, left 00:00:45, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 47, lc_entries: 0
RT-A#
Telnet セッションを維持したまま、NAT で新たにアドレス変換 (ただし、グローバルアドレスは同じ) が行われました。
- 1分程度待って再度 RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
RT-A#
全ての NAT 変換エントリがなくなりました。
- PC-B から PC-C に telnet セッションを開始し、ログインします。
< PC-B >
C:\> telnet -l telnetuser 161.14.1.10
Microsoft Telnet クライアントへようこそ
エスケープ文字は 'CTRL+]' です
パスワード情報を インターネット ゾーンのリモート コンピューターに送信しようとし
ていますが、この操作は安全でない可能性があります。送信しますか? (y/n): n ← ここは no
Welcome to Microsoft Telnet Service
password: cisco ← 実際には表示はされない
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser>
telnet が成功しました。
- RT-A で、sh ip nat translations verbose を実行します。
< RT-A >
RT-A# sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 200.10.10.9:49199 192.168.1.11:49199 161.14.1.10:23 161.14.1.10:23
create 00:00:38, use 00:00:27 timeout:70000, left 00:00:42, Map-Id(In): 1,
flags:
extended, use_count: 0, entry-id: 50, lc_entries: 0
--- 200.10.10.9 192.168.1.11 --- ---
create 00:00:38, use 00:00:38 timeout:50000, left 00:00:11, Map-Id(In): 1,
flags:
none, use_count: 1, entry-id: 49, lc_entries: 0
RT-A#
192.168.1.11 が 200.10.10.9 に変換されて、PC-C への telnet が成功したようです。
では、先ほどまで 200.10.10.9 を使っていた PC-A から PC-C への telnet はどうなんたんでしょうか?
- PC-B から PC-C への telnet 接続を開始してから 70 秒以内に、PC-A で Enter キーを押します。
< PC-A >
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\telnetuser>
C:\Users\telnetuser> < Enter >
ホストとの接続が切断されました。
< Enter >
C:\>
Enter キーを押した後、かなり暫く経って「ホストとの接続が切断されました。」というメッセージが表示されました。
200.10.10.9 は PC-B が使用中なので、PC-A が NAT 変換できるグローバルアドレスがなく、PC-A から PC-C に送ったパケットが PC-C に届かず、PC-C からの返事がないためタイムアウトにより telnet 接続が終了しました。
もし debug ip nat を実行していれば、次のようなメッセージが表示され、パケットが捨てられていることがわかります。
RT-A# debug ip nat
*Nov 25 23:19:34.831: NAT: translation failed (A), dropping packet s=192.168.1.10 d=161.14.1.10
*Nov 25 23:19:40.811: NAT: translation failed (A), dropping packet s=192.168.1.10 d=161.14.1.10
このように、タイマー値を短くすれば、ダイナミック NAT でも、複数の PC が少ないグローバルアドレスを共用できるのですが、タイマー値を短くし過ぎると、使っていたグローバルアドレスを他の PC に取られて、途中で切断してしまうことがあるようです。
しかし、デフォルト値の 24 時間はちょっと長すぎのような・・・。
ちなみに、CCNA 試験には関係ありませんし、普通はダイナミック NAT を使わずに PAT を使いますので、ここまで気にする必要はないと思います。ということで、ちょこっとブレイクでした。