本檔案將協助排解由於有效的快取Cisco Express Forwarding鄰接關係(指出錯誤的介面)所導致的Cisco Express Forwarding(CEF)路由回圈和次優路由的疑難問題。由於以下原因,建立了介面不正確的鄰接關係:
使用這些資源可更好地瞭解本文使用的一些概念:
本文件所述內容不限於特定軟體和硬體版本。
如需文件慣例的詳細資訊,請參閱思科技術提示慣例。
路由器R1通過Serial 8/0連線到R3,路由器R2通過Serial 8/0連線到R4。R1和R2通過Ethernet 0/0連線,如下圖所示。
R2收到來自R4的10.10.34.0/24的外部邊界網關協定(eBGP)字首更新。R2通過內部BGP(iBGP)將此字首傳播到R1。
R2有一條靜態預設路由(0.0.0.0/0),指向R4的Serial 8/0 IP地址10.10.24.4。
R2還具有一個備用浮動預設路由(IP route 0.0.0.0 0.0.0 Ethernet0/0 10),該路由指向Ethernet 0/0介面,以便在R2和R4之間的串列連線失敗時路由資料包。
R1有一條預設路由,它指向R3的Serial 8/0,IP地址為10.10.13.3。
目的地為10.10.34.0/24的IP流量在R1和R2之間循環。觀察R1上的traceroute命令輸出。
R1#traceroute 10.10.34.4 Type escape sequence to abort. Tracing the route to 10.10.34.4 1 192.168.12.2 20 msec 20 msec 20 msec 2 192.168.12.1 8 msec 12 msec 8 msec 3 192.168.12.2 8 msec 8 msec 12 msec 4 192.168.12.1 12 msec ...
請注意,目的地為10.10.34.4的流量在R1的乙太網0/0(IP地址192.168.12.1)和R2的乙太網0/0(IP地址192.168.12.2)之間跳躍。 理想情況下,由於iBGP學習字首10.10.34.0/24,從R1發往10.10.34.0/24的流量需要發往R2。然後,從R2發來的流量應路由到R4。但是,traceroute命令輸出會確認R1和R2之間的路由環路。
R1 |
---|
hostname R1 ! ip subnet-zero ! ip cef ! interface Ethernet0/0 ip address 192.168.12.1 255.255.255.0 ! interface Serial8/0 ip address 10.10.13.1 255.255.255.0 ! router bgp 11 no synchronization bgp log-neighbor-changes neighbor 10.10.13.3 remote-as 12 neighbor 192.168.12.2 remote-as 11 no auto-summary ! ip route 0.0.0.0 0.0.0.0 10.10.13.3 |
R2 |
---|
hostname R2 ! ip cef ! interface Ethernet0/0 ip address 192.168.12.2 255.255.255.0 ! interface Serial8/0 ip address 10.10.24.2 255.255.255.0 ! router bgp 11 no synchronization bgp log-neighbor-changes network 192.168.12.0 neighbor 10.10.24.4 remote-as 10 neighbor 192.168.12.1 remote-as 11 neighbor 192.168.12.1 next-hop-self no auto-summary ! ip route 0.0.0.0 0.0.0.0 10.10.24.4 ip route 0.0.0.0 0.0.0.0 Ethernet0/0 10 ! |
由於發往10.10.34.4的資料包在R1和R2之間循環,因此開始排除故障。首先檢查R1上的IP路由。show ip route 10.10.34.0命令輸出會確認要發往10.10.34.0/24的資料包的下一跳192.168.12.2。此跳與traceroute命令first hop匹配,在該命令中,資料包被傳送到下一跳192.168.12.2,這確認資料包在R1上正確交換。
R1#show ip route 10.10.34.0 Routing entry for 10.10.34.0/24 Known via "bgp 11", distance 200, metric 0 Tag 10, type internal Last update from 192.168.12.2 00:22:59 ago Routing Descriptor Blocks: * 192.168.12.2, from 192.168.12.2, 00:22:59 ago Route metric is 0, traffic share count is 1 AS Hops 1
下一步是檢查R2的IP路由表。如此show ip route 10.10.34.0命令輸出所示,應該將目的地為10.10.34.0的資料包路由到Serial 8/0上的下一跳10.10.24.4。但是,traceroute命令顯示將目的地為R1的資料包交換回IP地址192.168.12.1。需要進一步調查為什麼將目的地為10.34.0的資料包交換從R2跳到下一跳192.168.12.1(如traceroute命令的輸出所示),而不是到10.10.24.4。
R2#show ip route 10.10.34.0 Routing entry for 10.10.34.0/24 Known via "bgp 11", distance 20, metric 0 Tag 10, type external Last update from 10.10.24.4 00:42:32 ago Routing Descriptor Blocks: * 10.10.24.4, from 10.10.24.4, 00:42:32 ago Route metric is 0, traffic share count is 1 AS Hops 1
此時,必須瞭解的是,在Cisco Express Forwarding-switched網路中,資料包轉發決策包括:
最長字首匹配的路由表查詢。
轉發資訊庫(FIB)查詢。
由於路由表已經過驗證,請檢視思科快速轉發FIB。在show ip cef 10.10.34.4 detail命令的結果中,請注意Cisco Express Forwarding交換器10.10.34.4傳出Ethernet 0/0,而不是下一個躍點10.10.24.4傳出Serial 8/0(如show ip route 10.10.34.0命令輸出所示)。 這種差異會在網路中造成環路。
R2#show ip cef 10.10.34.4 detail 10.10.34.4/32, version 19, cached adjacency 10.10.34.4 0 packets, 0 bytes via 10.10.34.4, Ethernet0/0, 0 dependencies next hop 10.10.34.4, Ethernet0/0 valid cached adjacency
下一步是檢視Cisco Express Forwarding鄰接表,瞭解Cisco Express Forwarding如何學習從Ethernet 0/0交換資料包。注意,鄰接是因為ARP而構建的。
R2#show adjacency ethernet 0/0 detail | begin 10.10.34.4 IP Ethernet0/0 10.10.34.4(5) 50 packets, 2100 bytes AABBCC006500AABBCC0066000800 ARP 03:02:00
以下show ip arp指令輸出為確認。
R2#show ip arp 10.10.34.4 Protocol Address Age (min) Hardware Addr Type Interface Internet 10.10.34.4 60 aabb.cc00.6500 ARPA Ethernet0/0
接下來,找出當路由表中存在IP路由時為什麼建立此ARP條目。再次檢視路由表。
R2#show run | include ip route 0.0.0.0 ip route 0.0.0.0 0.0.0.0 10.10.24.4 ip route 0.0.0.0 0.0.0.0 Ethernet0/0 10
如果R2和R4之間的串列連線失敗,所有流量都會使用浮動靜態路由從Ethernet 0/0路由出去,因為R2具有指向多接入介面Ethernet 0/0的浮動靜態路由,而不是指向R1的乙太網IP地址192.168.12.1。因此,對於所有未知目標,路由器R2會通過Ethernet0/0介面傳送ARP請求。在這種情況下,R2丟失了通往10.10.34.0網路的更具體的路由。因此,當資料包到達此網路上的主機時,它會通過乙太網介面生成ARP請求。由於代理ARP在R1的乙太網介面上預設啟用,並且有一個指向R3的預設路由,因此它使用自己的MAC地址回覆代理ARP。因此,R2將所有流量傳送到R1,R1使用預設路由(0.0.0.0/0)將所有流量轉發到AS 12,進而通過Internet轉發到10.10.34.4。
當R2收到來自R1的代理ARP應答時,它會建立指向介面Ethernet 0/0的/32有效Cisco Express Forwarding鄰接關係。在乙太網網段上存在代理ARP路由器R1之前,此Cisco Express Forwarding條目不會過期。因此,/32 Cisco Express Forwarding條目繼續用於Cisco Express Forwarding交換資料包,即使R2和R4之間的串列連線已恢復並且路由表預設路由指向指向AS 10的Serial 8/0時也是如此。結果是路由環路。
最後,檢視日誌並檢視串列鏈路(s8/0)是否閃爍。這會導致在路由表中安裝浮動靜態路由,然後導致代理ARP,並導致在Cisco快速轉發FIB中安裝10.10.34.4/32的Cisco快速轉發條目。
R2#show log | beg Ethernet0/0 [..] %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial8/0, changed state to down %BGP-5-ADJCHANGE: neighbor 10.10.24.4 Down Interface flap %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial8/0, changed state to up %BGP-5-ADJCHANGE: neighbor 10.10.24.4 Up
日誌確認了原因。總之,這些步驟顯示事件的順序:
R2上的Serial 8/0介面關閉。
R2有一個目的地為10.10.34.4的資料包。
R2遵循直接指向Ethernet 0/0的備份預設路由。
R2傳送10.10.34.4的ARP請求。
R1(代理)使用自己的MAC地址向R2回覆ARP請求。
R2現在有一個MAC地址為R1的10.10.34.4的ARP條目。
R2為10.10.34.4建立Cisco快速轉發鄰接關係,並且通過Ethernet 0/0為此目標將10.10.34.4/32條目安裝在Cisco快速轉發表(FIB)中。只要ARP條目有效或直到R1出現在乙太網網段上,就會維護此Cisco快速轉發條目。
R2上的Serial 8/0啟動。
R2使用下一跳10.10.24.4從R4獲取eBGP路由10.10.34.0/24,並將該路由安裝在IP路由表中。
R1通過iBGP從R2獲取字首10.10.34.0/24,並將其安裝在IP路由表中。
R1有一個目的地為10.10.34.4的資料包。
R1檢視其路由表,匹配iBGP字首到R2的路由和到R2的路由。
R2收到目的地為10.10.34.4的資料包。由於它已經有一個10.10.34.4/32的Cisco Express Forwarding條目,該條目在其FIB表中指向Ethernet 0/0,且MAC地址為R1,因此它會將該資料包傳送回R1,而無需檢視路由表。這將建立一個循環。
將直接指向Ethernet 0/0的浮動靜態路由替換為指向下一跳地址的浮動靜態路由。
R2(config)#no ip route 0.0.0.0 0.0.0.0 ethernet 0/0 10 R2(config)# ip route 0.0.0.0 0.0.0.0 192.168.12.1 10
當您擁有指向下一跳IP地址而不是多路訪問介面Ethernet 0/0的靜態路由時,它會阻止R2傳送所有目的地的ARP請求。資料包將根據下一跳192.168.12.1進行路由和交換。因此,可避免任何ARP Cisco快速轉發條目和環路。
觀察R2上指向正確介面Serial 8/0的Cisco Express Forwarding條目。
R2#show ip cef 10.10.34.4 10.10.34.0/24, version 32, cached adjacency to Serial8/0 0 packets, 0 bytes via 10.10.24.4, 0 dependencies, recursive next hop 10.10.24.4, Serial8/0 via 10.10.24.0/24 valid cached adjacency