NAT テーブルのエントリーには、生存時間(タイムアウト)があります。通信がないまま時間がたつと、エントリーは NAT テーブルから消えます。タイムアウトの値は、ICMP や TCP などのプロトコルや、TCP の状態によって変わります。この記事では、Cisco ルータで、プロトコルごとにタイムアウトがどう変わるかを確認します。
- ICMP のエントリーのタイムアウトは 60 秒
- TCP のエントリーは、3 ウェイ ハンドシェイクが完了すると 24 時間、FIN や RST で残り 60 秒になること
show ip nat translations verboseでタイムアウトと残り時間を読む方法
検証構成
前回の スタティック NAT の構成をもとに検証します。R3 は、R2 の 192.168.23.2 を 192.168.34.3 に変換します。
ICMP 通信のタイムアウト
ICMP のエントリーのタイムアウトは 60 秒です。R2 から R4 へ ping を実行し、R3 の NAT テーブルを show ip nat translations で確認します。
R2
R2#ping 192.168.34.4 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 16/26/40 ms
R3
R3#sh ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 192.168.34.3:6 192.168.23.2:6 192.168.34.4:6 192.168.34.4:6
--- 192.168.34.3 192.168.23.2 --- —
プロトコルが icmp のエントリーが登録されました。show ip nat translations verbose で、このエントリーのタイムアウトを確認できます。
R3
R3#sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
icmp 192.168.34.3:6 192.168.23.2:6 192.168.34.4:6 192.168.34.4:6
create 00:00:08, use 00:00:00 timeout:60000, left 00:00:59,
flags:
extended, use_count: 0, entry-id: 10, lc_entries: 0
--- 192.168.34.3 192.168.23.2 --- ---
create 00:49:58, use 00:00:08 timeout:0,
flags:
static, use_count: 1, entry-id: 1, lc_entries: 0
| 表示 | 意味 |
|---|---|
| create 00:00:08 | エントリーが作られてからの時間 |
| use 00:00:00 | 最後に使われてからの時間 |
| timeout:60000 | タイムアウトの値。単位はミリ秒で、60000 = 60 秒 |
| left 00:00:59 | エントリーが消えるまでの残り時間(時:分:秒) |
| extended | プロトコルと番号まで含む、通信ごとのエントリー |
| static / timeout:0 | スタティック NAT の設定によるエントリー。タイムアウトせず、消えない |
このままこの通信がなければ、残り 59 秒でこのエントリーは削除されます。
TCP 通信のタイムアウト
TCP のエントリーは、状態によってタイムアウトが変わります。SYN を見て作られたばかりのエントリーは 60 秒で、3 ウェイ ハンドシェイクが完了すると 24 時間になります。その後、セッションが終了(FIN)したり、リセット(RST)されたりすると、残り時間が 60 秒になります。
3 ウェイ ハンドシェイクの完了
R2 から R4 へ Telnet してみます。
R2
R2#telnet 192.168.34.4
Trying 192.168.34.4 ... Open
User Access Verification
Password:
パスワードを聞かれているので、TCP の 3 ウェイ ハンドシェイクは完了しています。R3 の NAT テーブルを確認します。
R3
R3#sh ip nat translations
Pro Inside global Inside local Outside local Outside global
tcp 192.168.34.3:44717 192.168.23.2:44717 192.168.34.4:23 192.168.34.4:23
--- 192.168.34.3 192.168.23.2 --- —
R3
R3#sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 192.168.34.3:44717 192.168.23.2:44717 192.168.34.4:23 192.168.34.4:23
create 00:00:10, use 00:00:10 timeout:86400000, left 23:59:49,
flags:
extended, use_count: 0, entry-id: 15, lc_entries: 0
--- 192.168.34.3 192.168.23.2 --- ---
create 02:16:44, use 00:00:10 timeout:0,
flags:
static, use_count: 1, entry-id: 1, lc_entries: 0
timeout:86400000(ミリ秒)は 24 時間です。残り時間も 23:59:49 で、タイムアウトが 24 時間になっていることが確認できます。
セッションの終了(FIN)
R2 から R4 へ Telnet し、パスワードを3回まちがえます。これでセッションが終わり、R4 から TCP の FIN パケットが送られます。
| Source | Destination | Protocol | Length | Info |
|---|---|---|---|---|
| 192.168.34.4 | 192.168.34.3 | TCP | 64 | 23 → 22696 [FIN, PSH, ACK] Seq=116 Ack=38 |
| 192.168.34.3 | 192.168.34.4 | TCP | 58 | 22696 → 23 [ACK] Seq=38 Ack=117 Win=4013 Len=0 |
| 192.168.34.3 | 192.168.34.4 | TCP | 58 | 22696 → 23 [FIN, PSH, ACK] Seq=38 Ack=117 |
| 192.168.34.4 | 192.168.34.3 | TCP | 64 | 23 → 22696 [ACK] Seq=117 Ack=39 Win=4091 Len=0 |
R4(192.168.34.4)が先に FIN を送り、R2 側(変換後の 192.168.34.3)も FIN を返して、セッションが終わっています。R3 の NAT テーブルを確認します。
R3
R3#sh ip nat translations
Pro Inside global Inside local Outside local Outside global
tcp 192.168.34.3:40543 192.168.23.2:40543 192.168.34.4:23 192.168.34.4:23
--- 192.168.34.3 192.168.23.2 —
R3
R3#sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 192.168.34.3:40543 192.168.23.2:40543 192.168.34.4:23 192.168.34.4:23
create 00:00:09, use 00:00:01 timeout:86400000, left 00:00:58,
flags:
extended, timing-out, use_count: 0, entry-id: 18, lc_entries: 0
--- 192.168.34.3 192.168.23.2 --- ---
create 02:28:45, use 00:00:09 timeout:0,
flags:
static, use_count: 1, entry-id: 1, lc_entries: 0
timeout:86400000 は 24 時間のままですが、残り時間は 58 秒(left 00:00:58)になっています。flags にも timing-out(タイムアウト待ち)が表示されています。TCP のセッションが終了すると、エントリーの残り時間が 60 秒に変わります。
セッションのリセット(RST)
セッションが終了したときと同じように、TCP のセッションがリセットされたときも、残り時間が 60 秒に変わります。R2 から R4 へ、ポート 80 番を指定して Telnet します。R4 は TCP 80 番を受け付ける設定をしていないので、TCP のセッションはリセットされます。
R2
R2#telnet 192.168.34.4 80
Trying 192.168.34.4, 80 ...
% Connection refused by remote host
パケットキャプチャを見ると、R2 側の SYN に対して、R4 から TCP の RST が送られています。
| Source | Destination | Protocol | Length | Info |
|---|---|---|---|---|
| 192.168.34.3 | 192.168.34.4 | TCP | 62 | 26246 → 80 [SYN] Seq=0 Win=4128 Len=0 MSS=536 |
| 192.168.34.4 | 192.168.34.3 | TCP | 64 | 80 → 26246 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
R3 の NAT テーブルを確認します。
R3
R3#sh ip nat translations
Pro Inside global Inside local Outside local Outside global
tcp 192.168.34.3:46791 192.168.23.2:46791 192.168.34.4:80 192.168.34.4:80
--- 192.168.34.3 192.168.23.2 --- ---
R3
R3#sh ip nat translations verbose
Pro Inside global Inside local Outside local Outside global
tcp 192.168.34.3:46791 192.168.23.2:46791 192.168.34.4:80 192.168.34.4:80
create 00:00:01, use 00:00:01 timeout:86400000, left 00:00:58,
flags:
extended, timing-out, use_count: 0, entry-id: 22, lc_entries: 0
--- 192.168.34.3 192.168.23.2 --- ---
create 02:47:03, use 00:00:01 timeout:0,
flags:
static, use_count: 1, entry-id: 1, lc_entries: 0
残り時間が 58 秒(left 00:00:58)になっています。TCP のセッションがリセットされると、エントリーの残り時間が 60 秒になります。
タイムアウトの既定値と変更
Cisco ルータの NAT のタイムアウトの既定値は次のとおりです。ip nat translation コマンドで変更できます。
| コマンド | 対象 | 既定値 |
|---|---|---|
| ip nat translation timeout | overload なしのダイナミック NAT のエントリー | 86400 秒(24 時間) |
| ip nat translation icmp-timeout | ICMP | 60 秒 |
| ip nat translation syn-timeout | SYN を見た直後の TCP | 60 秒 |
| ip nat translation tcp-timeout | TCP | 86400 秒(24 時間) |
| ip nat translation finrst-timeout | FIN・RST を見た後の TCP | 60 秒 |
| ip nat translation udp-timeout | UDP | 300 秒(5 分) |
| ip nat translation dns-timeout | DNS | 60 秒 |
3 ウェイ ハンドシェイクが完了した TCP のエントリーは、FIN や RST が来ない限り、通信がなくても 24 時間残ります。端末が FIN を送らずに電源を切ったときなどは、使われないエントリーが長く残ります。PAT でエントリーが多くなる環境では、tcp-timeout を短くすることも検討します。
まとめ
| 通信 | タイムアウト |
|---|---|
| ICMP | 60 秒 |
| TCP(SYN の直後) | 60 秒 |
| TCP(ハンドシェイク完了) | 24 時間 |
| TCP(FIN・RST の後) | 残り 60 秒(timeout の値は 24 時間のまま、left が 60 秒から減る) |
| スタティック NAT | タイムアウトしない(timeout:0) |
タイムアウトと残り時間は show ip nat translations verbose で確認できます。timeout の単位はミリ秒、left は時:分:秒です。
コメント