IP : IP アドレッシング サービス

ダイナミック NAT の使用時にルーティング ループを回避する方法

2003 年 2 月 25 日 - ライター翻訳版
その他のバージョン: PDFpdf | 機械翻訳版 (2013 年 8 月 21 日) | 英語版 (2005 年 8 月 10 日) | フィードバック

この文書では、ダイナミック ネットワーク アドレス変換(NAT)の使用時にルーティング ループが発生するシナリオについて説明します。シナリオを作成するために、次の構成図を使用しました。

Network Diagram

上記の構成図では、ルータ A に NAT が設定されているため、ルータ A はネットワーク 171.68.200.0/24 を送信元として持つパケットを、NAT プール "test-loop" によって定義されているアドレス範囲に変換します。ルータ A の設定は、次のとおりです(他のすべてのルータには、接続性を得るためにスタティック ルートが設定されています)。

hostname Router-A

 !

 !

 ip nat pool test-loop 172.16.47.161 172.16.47.165 prefix-length 28

 ip nat inside source list 7 pool test-loop

 !

 interface Loopback0

  ip address 1.1.1.1 255.0.0.0

 !

 interface Ethernet0

  ip address 135.135.1.2 255.255.255.0

  shutdown

 !

 interface Serial0

  ip address 171.68.200.49 255.255.255.0

  ip nat inside

  no ip mroute-cache

  no ip route-cache

  no fair-queue

 !

 interface Serial1

  ip address 172.16.47.146 255.255.255.240

  ip nat outside

  no ip mroute-cache

  no ip route-cache

 !

 ip classless

 ip route 0.0.0.0 0.0.0.0 172.16.47.145

 access-list 7 permit 171.68.200.0 0.0.0.255

 !

 !

 line con 0

  exec-timeout 0 0

 line aux 0

 line vty 0 4

  login

 !

 end

 

NAT 変換デバッグ コマンドと IP パケット デバッグ コマンドを使って、内部デバイス上のルータからの ping を生成しました。ping は動作し、変換テーブル エントリが作成されました。次の出力では、IP パケット デバッグと IP NAT デバッグがオンになっており、この時点では変換テーブル内にエントリが存在していないことがわかります。

注: デバッグ コマンドは、大量の出力を生成します。システムの他の動作に悪影響が及ばないように、IP ネットワーク上のトラフィック負荷が低い場合にだけ使用してください。

Router-A#show debug

 Generic IP:

   IP packet debugging is on (detailed)

   IP NAT debugging is on

 Router-A#show ip nat translations

 Router-A#

 

内部ルータ(内部デバイス)は、送信元アドレス 171.68.200.48 と宛先アドレス 171.68.191.1 (外部デバイスのアドレス)を持つ ICMP パケットを発信します。次のデバッグ出力は、送信元 IP アドレス 171.68.200.48 を持つ IP パケットが 172.16.47.161 に変換される様子を示しています。パケットはシリアル 0 インターフェイスに到着し、シリアル 1 インターフェイス宛てに送られます。

NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [401]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 

次のデバッグ出力は、宛先 IP アドレス 172.16.47.161 を持つリターン IP パケットが 171.68.200.48 に変換し直される様子を示しています。パケットはシリアル 1 インターフェイスに到着し、シリアル 0 インターフェイス宛てに送られます。

NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [401]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=0, code=0

 

デバッグ出力は、内部デバイスと外部デバイスの間で ping が正常に交換されたことを示しています。

NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [402]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [402]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=0, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [403]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [403]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=0, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [404]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [404]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=0, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [405]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [405]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=0, code=0

 

show ip nat translations コマンドを使って、内部デバイスの変換テーブル内のエントリを確認します。

Router-A#show ip nat translations

 Pro Inside global      Inside local       Outside local      Outside global

 --- 172.16.47.161      171.68.200.48      ---                ---

 

この時点で、内部デバイスの変換エントリが変換テーブル内に存在しています。次のルータ A によって生成されたデバッグ出力に示されているとおり、外部デバイスから内部デバイスのグローバル アドレス宛てに ping を正常に実行できます。

注:外部デバイスによって発信されたパケットは、送信元アドレスとして 171.68.191.1、宛先アドレスとして 172.16.47.161(変換テーブル内の内部グローバル アドレス)を持っています。

Router-A#

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [108]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=8, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [108]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=0, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [109]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=8, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [109]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=0, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [110]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=8, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [110]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=0, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [111]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=8, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [111]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=0, code=0

 NAT*: s=171.68.191.1, d=172.16.47.161->171.68.200.48 [112]

 IP: s=171.68.191.1 (Serial1), d=171.68.200.48 (Serial0), g=171.68.200.48, len 100, forward

     ICMP type=8, code=0

 NAT: s=171.68.200.48->172.16.47.161, d=171.68.191.1 [112]

 IP: s=172.16.47.161 (Serial0), d=171.68.191.1 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=0, code=0

 

次のデバッグ出力は、外部デバイスが、test-loop プール内の未使用の IP アドレスである宛先アドレスと通信を開始しようとした場合に何が起こるかを示しています。clear ip nat translation コマンドを使って変換テーブルをクリアし、ping を test-loop プール内の未使用の IP アドレスへ送信しました。

外部デバイスは、内部グローバル アドレス 172.16.47.161 宛てに ICMP パケットを送信しました。ただし、出力インターフェイスは、このパケットの入力インターフェイスと同一です。

IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 IP: s=171.68.191.1 (Serial1), d=172.16.47.161 (Serial1), g=172.16.47.145, len 100, forward

     ICMP type=8, code=0

 

NAT は、外部から内部宛てのパケットを変換してから、そのパケットをルーティングします。この場合、変換テーブル内にエントリがないため、ルータ A はデフォルト ルートに依存してパケットをルーティングし、そのパケットをシリアル 1 インターフェイスに送り返します。このため、偶発的にシリアル回線をダウンさせてしまうことのあるループを引き起こします。

この種のルーティング ループを回避するために、外部デバイスから内部グローバル アドレス宛てには、決してパケットを発信しないでください。ただし、これを適用するのは困難なため、ルータ A で、ネクストホップとしてヌル 0 を持つ、内部グローバル アドレスのスタティック ルートを追加することができます。この方法を使えば、外部デバイスが内部グローバル アドレスにパケットを送信し、変換テーブル内にエントリがない場合に、ルータ A はパケットをヌル 0 へルーティングするため、ループは回避できます。上記の例を使うと、スタティック ルートは次のようになります。

ip route 172.16.47.160 255.255.255.252 null0.

 


関連するシスコ サポート コミュニティ ディスカッション

シスコ サポート コミュニティは、どなたでも投稿や回答ができる情報交換スペースです。


関連情報


Document ID: 13775