処理順序
Ciscoルーターでは、「insideからoutsideへの通信」と「outsideからinsideへの通信」でルーティングとNATの処理順序が異なります。
insideからoutsideへの通信 | outsideからinsideへの通信 |
|
|
※注意※
“outside側の送信元NAT”の設定のみで、「outsideからinsideへの通信」の場合だけ動作が異なるのですが、基本的に上記となります。詳しくは下記で説明します。
検証準備
ネットワーク構成
CML上でIOSvを3台設置し、「Router1 ー NAT-Router ー Router2」というネットワーク構成で検証します。
ルーターの設定
下記の通り各ルーターを設定します。
NAT-Routerに関しては、純粋なIPルーティングを確認したいため、CEFを無効化します。
デバッグコマンド
NAT-Routerに下記のコマンドを設定し、デバッグログが出力されるようにします。
※本番環境でのデバッグコマンドの実施は、ルーターの処理性能に影響を与えますので十分注意してください。最悪の場合、ルーターへのアクセスができなくなります。
[IPパケット処理(ルーティング等)]
debug ip packet detail
[NAT処理]
debug ip nat
[アクセスリスト処理]
debug ip access-list data-plane
デバッグログ確認
NAT無し
NAT設定を入れない状態でデバッグログを確認します。
insideからoutsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→ルーティング→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
19:57:06.848: IP: s=192.168.1.1 (GigabitEthernet0/0), d=172.16.1.1, len 100, input feature
19:57:06.853: IPACL-DP: Pkt matched ACL: Gi0/0_in seq: 10 Action: Permit
19:57:06.860: IP: tableid=0, s=192.168.1.1 (GigabitEthernet0/0), d=172.16.1.1 (GigabitEthernet0/1), routed via RIB
19:57:06.867: IPACL-DP: Pkt matched ACL: Gi0/1_out seq: 10 Action: Permit
19:57:06.873: IP: s=192.168.1.1 (GigabitEthernet0/0), d=172.16.1.1 (GigabitEthernet0/1), len 100, sending full packet
outsideからinsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→ルーティング→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
19:59:09.676: IP: s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1, len 100, input feature
19:59:09.681: IPACL-DP: Pkt matched ACL: Gi0/1_in seq: 10 Action: Permit
19:59:09.686: IP: tableid=0, s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), routed via RIB
19:59:09.691: IPACL-DP: Pkt matched ACL: Gi0/0_out seq: 10 Action: Permit
19:59:09.698: IP: s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), len 100, sending full packet
Inside側のNATのみ
Inside側の送信元NATのみを設定した状態でデバッグログを確認します。
NAT-Router
ip nat inside source static 192.168.1.1 172.16.2.1
insideからoutsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→ルーティング→NAT→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
14:27:09.465: IP: s=192.168.1.1 (GigabitEthernet0/0), d=172.16.1.1, len 100, input feature
14:27:09.471: IPACL-DP: Pkt matched ACL: Gi0/0_in seq: 10 Action: Permit
14:27:09.477: IP: tableid=0, s=192.168.1.1 (GigabitEthernet0/0), d=172.16.1.1 (GigabitEthernet0/1), routed via RIB
14:27:09.479: NAT: s=192.168.1.1->172.16.2.1, d=172.16.1.1 [22]
14:27:09.485: IPACL-DP: Pkt matched ACL: Gi0/1_out seq: 10 Action: Permit
14:27:09.493: IP: s=172.16.2.1 (GigabitEthernet0/0), d=172.16.1.1 (GigabitEthernet0/1), len 100, sending full packet
outsideからinsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→NAT→ルーティング→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
14:29:36.886: IP: s=172.16.1.1 (GigabitEthernet0/1), d=172.16.2.1, len 100, input feature
14:29:36.893: IPACL-DP: Pkt matched ACL: Gi0/1_in seq: 10 Action: Permit
14:29:36.898: NAT: s=172.16.1.1, d=172.16.2.1->192.168.1.1 [22]
14:29:36.901: IP: tableid=0, s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), routed via RIB
14:29:36.907: IPACL-DP: Pkt matched ACL: Gi0/0_out seq: 10 Action: Permit
14:29:36.915: IP: s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), len 100, sending full packet
Outside側のNATのみ
Outside側の送信元NATのみを設定した状態でデバッグログを確認します。
NAT-Router
ip nat outside source static 172.16.1.1 192.168.2.1 add-route
insideからoutsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→ルーティング→NAT→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
14:33:37.814: IP: s=192.168.1.1 (GigabitEthernet0/0), d=192.168.2.1, len 100, input feature
14:33:37.820: IPACL-DP: Pkt matched ACL: Gi0/0_in seq: 10 Action: Permit
14:33:37.825: IP: tableid=0, s=192.168.1.1 (GigabitEthernet0/0), d=192.168.2.1 (GigabitEthernet0/1), routed via RIB
14:33:37.826: NAT: s=192.168.1.1, d=192.168.2.1->172.16.1.1 [24]
14:33:37.831: IPACL-DP: Pkt matched ACL: Gi0/1_out seq: 10 Action: Permit
14:33:37.839: IP: s=192.168.1.1 (GigabitEthernet0/0), d=172.16.1.1 (GigabitEthernet0/1), len 100, sending full packet
outsideからinsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→ルーティング→NAT→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
14:35:41.905: IP: s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1, len 100, input feature
14:35:41.914: IPACL-DP: Pkt matched ACL: Gi0/1_in seq: 10 Action: Permit
14:35:41.923: IP: tableid=0, s=172.16.1.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), routed via RIB
14:35:41.925: NAT: s=172.16.1.1->192.168.2.1, d=192.168.1.1 [23]
14:35:41.933: IPACL-DP: Pkt matched ACL: Gi0/0_out seq: 10 Action: Permit
14:35:41.944: IP: s=192.168.2.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), len 100, sending full packet
※注記:この場合だけ処理順序が異なります※
“debug ip nat detail”を設定して確認したところ、下記のログが出力されており、ルーティングが先に処理されるようです。
NAT: Processing out-2-in packet in after_routing2
Inside側とOutside側のNAT
Inside側とOutside側の送信元NATを設定した状態でデバッグログを確認します。
NAT-Router
ip nat inside source static 192.168.1.1 172.16.2.1
ip nat outside source static 172.16.1.1 192.168.2.1 add-route
insideからoutsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→ルーティング→NAT→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
14:39:10.319: IP: s=192.168.1.1 (GigabitEthernet0/0), d=192.168.2.1, len 100, input feature
14:39:10.327: IPACL-DP: Pkt matched ACL: Gi0/0_in seq: 10 Action: Permit
14:39:10.333: IP: tableid=0, s=192.168.1.1 (GigabitEthernet0/0), d=192.168.2.1 (GigabitEthernet0/1), routed via RIB
14:39:10.335: NAT: s=192.168.1.1->172.16.2.1, d=192.168.2.1 [25]
14:39:10.335: NAT: s=172.16.2.1, d=192.168.2.1->172.16.1.1 [25]
14:39:10.341: IPACL-DP: Pkt matched ACL: Gi0/1_out seq: 10 Action: Permit
14:39:10.350: IP: s=172.16.2.1 (GigabitEthernet0/0), d=172.16.1.1 (GigabitEthernet0/1), len 100, sending full packet
outsideからinsideへの通信の場合
デバッグログを確認すると、「パケット着信→入力ACLチェック→NAT→ルーティング→出力ACLチェック→パケット送信」の順序で処理されているのが分かります。
14:40:46.269: IP: s=172.16.1.1 (GigabitEthernet0/1), d=172.16.2.1, len 100, input feature
14:40:46.275: IPACL-DP: Pkt matched ACL: Gi0/1_in seq: 10 Action: Permit
14:40:46.280: NAT: s=172.16.1.1->192.168.2.1, d=172.16.2.1 [24]
14:40:46.280: NAT: s=192.168.2.1, d=172.16.2.1->192.168.1.1 [24]
14:40:46.283: IP: tableid=0, s=192.168.2.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), routed via RIB
14:40:46.288: IPACL-DP: Pkt matched ACL: Gi0/0_out seq: 10 Action: Permit
14:40:46.297: IP: s=192.168.2.1 (GigabitEthernet0/1), d=192.168.1.1 (GigabitEthernet0/0), len 100, sending full packet
【補足】CEFが利用される場合のデバッグログ
NAT-RouterのCEFを有効にし、Inside側とOutside側の送信元NATを設定した状態でデバッグログを確認すると、下記の通り通常のルーティング処理と比較して、高速で処理されていることが分かります。
NATルーターの設定
NAT-Router
ip cef
デバッグコマンド
[CEF処理]
debug ip cef packet all input rate 0
debug ip cef packet all output rate 0
デバッグログ
13:50:19.173: CEF-Debug: Packet from 192.168.1.1 (Gi0/0) to 192.168.2.1
13:50:19.173: IPACL-DP: Pkt matched ACL: Gi0/0_in seq: 10 Action: Permit
13:50:19.173: IPACL-DP: Pkt matched permit it
13:50:19.173: NAT: s=192.168.1.1->172.16.2.1, d=192.168.2.1 [20]
13:50:19.173: NAT: s=172.16.2.1, d=192.168.2.1->172.16.1.1 [20]
13:50:19.173: IPACL-DP: Pkt matched ACL: Gi0/1_out seq: 10 Action: Permit
13:50:19.173: IPACL-DP: Pkt matched permit it
13:50:19.173: CEF-Debug: Packet from 172.16.2.1 (Gi0/0) to 172.16.1.1 (Gi0/1)
13:50:19.178: CEF-Debug: Packet from 172.16.1.1 (Gi0/1) to 172.16.2.1
13:50:19.178: IPACL-DP: Pkt matched ACL: Gi0/1_in seq: 10 Action: Permit
13:50:19.178: IPACL-DP: Pkt matched permit it
13:50:19.178: NAT: s=172.16.1.1->192.168.2.1, d=172.16.2.1 [20]
13:50:19.178: NAT: s=192.168.2.1, d=172.16.2.1->192.168.1.1 [20]
13:50:19.178: IPACL-DP: Pkt matched ACL: Gi0/0_out seq: 10 Action: Permit
13:50:19.178: IPACL-DP: Pkt matched permit it
13:50:19.178: CEF-Debug: Packet from 192.168.2.1 (Gi0/1) to 192.168.1.1 (Gi0/0)
これで、ルーティング・NAT・アクセスリストの処理順序の説明は完了です。