本檔案將說明以下情況:使用動態網路位址轉譯(NAT)時,由於流量目的地為NAT池中的未使用ip位址,且在NAT路由器上存在將封包路由回外部的預設路由,因此封包會在NAT路由器與外部介面的相鄰路由器之間回圈。
本文件沒有特定需求。
本文件所述內容不限於特定軟體和硬體版本。
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您在即時網路中工作,請確保在使用任何命令之前瞭解其潛在影響。
以下拓撲用於建立示例場景。
如需文件慣例的詳細資訊,請參閱思科技術提示慣例。
在上述拓撲中,路由器A配置了NAT,以便它將來自網路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調試已開啟,並且此時轉換表中沒有條目。
註:debug命令會產生大量輸出。僅當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#
內部路由器(內部裝置)發起的ICMP資料包的源地址為171.68.200.48,目的地址為171.68.191.1(外部裝置的地址)。 以下debug輸出顯示了源IP地址為171.68.200.48的IP資料包被轉換為172.16.47.161。該資料包來自Serial0介面,目的地為Serial1介面。
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
以下debug輸出顯示目的IP地址為172.16.47.161的返回IP資料包正在轉換回171.68.200.48。資料包來自Serial1介面,目的地為serial0介面。
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
debug輸出顯示了內部裝置和外部裝置之間成功的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 --- ---
由於轉換表中存在內部裝置的轉換,因此我們可以從外部裝置ping通內部裝置的全域性地址,如下面路由器A生成的調試輸出所示。
注意:外部裝置發出的資料包的源地址為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
以下調試輸出演示了當外部裝置嘗試與測試環路池中未使用IP地址的目標地址發起通訊時會發生的情況。clear ip nat translation命令用於清除轉換表,並向test-loop池中未使用的IP地址傳送ping。
外部裝置傳送一個目的地為內部全域性地址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只能路由封包。路由器A依靠其預設路由來路由資料包,並將資料包傳送回Serial1介面,這會導致最終可能導致串列線路關閉的環路。
為避免此類路由環路,切勿將資料包從外部裝置傳送到內部全域性地址。但是,由於難以強制執行,因此您可以在Router-A中為內部全域性地址新增靜態路由(下一跳為null0)。這樣,當外部裝置傳送目的地為內部全域性地址的資料包時,在轉換表中沒有條目,路由器A會將資料包路由到null0,從而避免環路。使用上面的示例,靜態路由如下所示:
ip route 172.16.47.160 255.255.255.252 null0.
修訂 | 發佈日期 | 意見 |
---|---|---|
1.0 |
10-Aug-2005 |
初始版本 |