這是一例發生在運行MPLS ×××的網絡上由ios軟件Bug引發的故障案例,我把他整理出來供你們參考和討論,故障的發生和解決都帶有偶然性,並不重要, 只但願經過討論,可以提升咱們分析問題,解決問題的能力.
1、故障原因
某城市A城域網骨幹兩臺7206(R1和R2)上聯核心網,下聯城域,互爲備份,運行MPLS,圖就不畫了,呵呵。某日升級城域,對城域網進行調整和擴容。(下文中的城市B的城域結構有所不一樣,規模也大些,但在此例中也可按此結構理解,故不作詳細說明)
升級過程:
一、 升級7206ios
二、 業務割接
三、 冗餘測試、HSRP測試和全網測試、業務測試,作最後一次用戶連通性測試,OK,走人!
四、 觀察階段。
次日,某用戶報MPLS ×××網絡不通。(注:割接過程不對用戶配置進行修改!)
2、故障現象
用戶報割接城市A到另外城市B的MPLS ×××業務中斷。
城市A的某用戶業務是經過CE設備以MPLS ×××的形式接入到城市A的PE路由器上(就是剛剛將的升級過的骨幹路由器Cisco VXR 7206)的,一樣,城市B的某用戶業務是經過CE設備以MPLS ×××的形式接入到省骨幹網相應的PE路由器。
故障現象是城市A的某用戶能夠PING通城市A本地的PE路由器,城市A某用戶本地網絡鏈接無任何問題,但不能PING通遠端城市B的PE路由器的某用戶業務子接口。
一樣城市B的某用戶能夠PING通城市B本地的PE路由器,城市B某用戶本地網絡鏈接無任何問題,但不能PING通遠端城市A的PE路由器。
最奇怪的是: 城市A某用戶業務所鏈接的PE路由器上,同時存在其餘五個×××的用戶,這五個×××用戶網絡業務運行徹底正常。 且其網絡業務的設置與某用戶業務的設置是同一類型的。全部的×××業務之間的命令比較,很少一句,很多一句。
某用戶×××業務,城市A和城市B之間的×××及IPV4的路由徹底正常!
3、排錯過程
(1)故障的隔離
第一時間在城市A某用戶×××所在的省骨幹PE路由器上 Cisco 7206VXR上開設邏輯端口Loopback1, 並將Loopback1 劃入某用戶×××, 此時城市B某用戶×××能夠收到此Loopback 地址的路由,但仍舊沒法PING通該Loopback地址。所以可證實某用戶×××的中斷不是新增的城域網設備引發的,問題產生在省骨幹路由器之間的MPLS交互進程上。此時咱們把全部的工做重點放在省骨幹網之間的排錯上。
(2)命令處理流程
主要的處理工做以下:
1. 在城市A的骨幹路由器r2上使用命令show ip vrf 檢查mpls ***的配置和RD的名字。發現都是正確的。使用命令show ip vrf detail ***9:XXX.×××和show ip vrf interface檢查某用戶***的路由屬性,和它的接口狀態和ip地址。發現都是正確的。使用命令show ip bgp neighbors/show ip bgp ***v4 all /show ip bgp ***v4 vrf ***9:XXX.×××檢查城市A和城市B兩PE間的BGP關係。發現都是正確的。
2.在城市A的骨幹路由器r2上使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市A本地某用戶)和一條bgp的路由(城市B某用戶)。使用命令ping vrf ***9:XXX.××× 210.5.2.130 。測試城市A本地PE到城市A本地CE的聯通性。測試結果是通的。使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市A本地PE到城市BPE的聯通性。測試結果是ping不通。
3.而後telnet到城市B的PE路由器上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條bgp的路由(城市A某用戶)。使用命令ping vrf ***9:XXX.××× 210.5.0.222 。測試城市B本地PE到城市B本地CE的聯通性。測試結果是通的。使用命令ping vrf ***9:XXX.××× 210.5.2.129.。測試城市BPE到城市A PE的聯通性。測試結果是ping不通。
由於這個***兩端的路由都是正確的,並且在割接過程當中沒有作任何的改動。割接後的測試也是正常的。討論後得出初步結論,認爲問題不是割接形成的。有多是其餘的緣由引發。分析問題的方向應該和割接無關,重點在mpls ***的方向。
4.在城市A的骨幹路由器r2上使用命令clear ip route vrf ***9:XXX.××× *,使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,bgp路由(城市B某用戶)已經消失。稍後使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,除了直連的路由(城市A本地某用戶),一條bgp的路由(城市B某用戶)從新出現。在城市B的PE路由器上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條bgp路由(城市A某用戶)。在城市A的骨幹路由器r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市APE的聯通性。測試結果是ping不通。
5.在城市B的PE路由器上使用命令clear ip route vrf ***9:XXX.××× *,使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,bgp路由(城市A某用戶)已經消失。稍後使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,除了直連的路由(城市B本地某用戶),一條bgp的路由(城市A某用戶)從新出現。在城市A的骨幹路由器r2上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條bgp路由(城市A某用戶)。在城市A的骨幹路由器r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市A PE的聯通性。測試結果是ping不通。
6.在城市A的骨幹路由器r2上某用戶的子端口上使用命令shutdown,使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,直連的路由(城市A本地某用戶)已經消失。使用no shutdown,使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,直連的路由(城市A本地某用戶)從新出現,一條bgp的路由(城市B某用戶)仍然存在。在城市B的PE路由器上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條新學到的bgp路由(城市A某用戶)。在城市A的骨幹路由器r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市APE的聯通性。測試結果是ping不通。
7.在城市B的PE路由器上某用戶的子端口上使用命令shutdown,使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,直連的路由(城市B本地某用戶)已經消失。使用no shutdown,使用命令show ip route vrf ***9:XXX.×××能夠看到***的路由已經有變化,直連的路由(城市B本地某用戶)從新出現,一條bgp的路由(城市A某用戶)仍然存在。在城市A的骨幹路由器r2上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市A本地某用戶)和一條新學到的bgp路由(城市B某用戶)。在城市A的骨幹路由器r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市A PE的聯通性。測試結果是ping不通。
8.在城市A的骨幹路由器r2上某用戶的子端口上使用命令去掉此***的配置命令。稍後使用原來的命令從新配置。配置完畢在r2上使用命令show ip route vrf ***9:XXX.×××能夠看到正確的***路由,直連的路由(城市A本地某用戶)和一條bgp的路由(城市B某用戶)。在城市B的PE路由器上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條bgp的路由(城市A某用戶)。在r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市APE的聯通性。測試結果是ping不通。
9.在城市A的骨幹路由器r2上某用戶的子端口上使用命令去掉此***的配置命令。使用原來的命令從新在城市A的骨幹路由器r1配置。配置完畢在r1上使用命令show ip route vrf ***9:XXX.×××能夠看到正確的***路由,直連的路由(城市A本地某用戶)和一條bgp的路由(城市B某用戶)。在城市B的PE路由器上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條bgp的路由(城市A某用戶)。在r1上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市A PE的聯通性。測試結果是ping不通。爲了穩妥起見,咱們又把某用戶***的配置從新挪回到r2上,並刪除r1的某用戶***配置。
10.由於在割接前曾經升級了城市A的骨幹路由器r1和r2的IOS軟件。考慮到有多是IOS軟件BUG引發這個問題。嘗試把r2路由器的IOS版本降級回原來使用的版本。在r2路由器上使用配置命令boot system flash disk0:c7200-p-mz.120-17.ST1.bin,存盤後執行命令reload。等r2路由器啓動完畢。在r2上使用命令show ip route vrf ***9:XXX.×××能夠看到正確的***路由,直連的路由(城市A本地某用戶)和一條bgp的路由(城市B某用戶)。在城市B的PE路由器上,使用命令show ip route vrf ***9:XXX.×××。能夠看到***的路由是正確的,分別是一條直連的路由(城市B本地某用戶)和一條bgp的路由(城市A某用戶)。在r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市APE的聯通性。測試結果是ping不通。
11.重複步驟10的操做,改成使用其餘的軟件版本。一共嘗試了3個軟件版本。軟件版本分別是:c7200-p-mz.122-11.T1.bin,c7200-p-mz.120-17.ST1.bin,c7200-p-mz.120-23.S1.bin
12.在城市A的骨幹路由器r2上使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X檢查城市B某用戶路由的標籤。發現標籤堆棧裏只有一級標籤。這個標籤是城市B的PE路由器分發的關於城市B某用戶路由的標籤。可是缺乏了和城市A PE直連的P路由器分發的mpls標籤。這會致使城市A的PE不懂如何轉發mpls數據幀到mpls骨幹,也就是P路由器。最終的結果是致使某用戶在城市A和城市B的***不通。
13.在城市A的r2上使用命令clear ip bgp *,稍後再使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X檢查城市B某用戶路由的標籤。發現標籤堆棧裏仍然只有一級標籤。
14.重複13的操做接近10次,在這過程當中也曾經使用show tech命令去檢查r2的各類狀態信息,可是沒有任何異常。在大概15點00分,忽然發現show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X的輸出顯示城市B某用戶路由的標籤堆棧裏有了兩級標籤。在r2上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市APE的聯通性。測試結果是ping不通。
15.在城市A的骨幹路由器r2上使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X檢查城市B某用戶路由的標籤。同時在城市B的PE路由器上使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail。發現問題所在,城市B的PE路由器對城市B某用戶的路由的標籤在分發到城市A的PE路由器上後標籤值不一致。致使城市A PE分發的MPLS數據包到達城市BPE路由器時,城市BPE路由器不知道該怎麼處理,由於城市A傳輸過來的數據的標籤並非城市BPE分發的。因此城市BPE路由器只能把它丟棄。致使網絡不通。R>
16.在城市B的PE路由器上使用命令clear ip bgp *,稍後在城市A的骨幹路由器r2上使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X檢查城市B某用戶路由的標籤。同時在城市B的PE路由器上使用命令show tag forwarding-table vrf ***9:XXX.××× *.*.*.* detail。發現標籤仍然不匹配。
17.在城市B的PE路由器上某用戶的子端口上使用命令no ip address,稍後從新配置原來的ip地址。稍後在城市A的骨幹路由器r2上使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X檢查城市B某用戶路由的標籤。同時在城市B的PE路由器上使用命令show tag forwarding-table vrf ***9:XXX.××× 210.5.2.129detail。發現標籤仍然不匹配。
18.重複16的操做。可是結果仍然是標籤不匹配。
認爲應該是CISCO IOS的軟件BUG引發的問題。可是不能經過象clear ip bgp * ,no ip address 等手段解決。在CISCO尋求幫助。
19. Cisco負責支持項目的工程師,也說不出因此然的理由;在跟Cisco工程師的電話溝通的同時,咱們仍舊在作嘗試,在城市A的骨幹路由器r2上某用戶的子端口上使用命令去掉此***的配置命令。使用原來的命令從新在城市A的骨幹路由器r1配置。配置完畢在r1上使用命令show tag forwarding-table vrf ***9:XXX.××× X.X.X.X detail和命令show ip cef vrf ***9:XXX.××× X.X.X.X檢查城市B某用戶路由的標籤。同時在城市B的PE路由器上使用命令show tag forwarding-table vrf ***9:XXX.××× *.*.*.* detail。發現標籤是匹配的。在r1上使用命令ping vrf ***9:XXX.××× X.X.X.X。測試城市BPE到城市APE的聯通性。測試結果是ping通。
20. 全面的網絡測試, 相似問題沒有產生!
4、故障的具體技術分析
在發生故障的當時咱們分別檢查了城市A和城市B PE路由器上的路由表。在城市A的PE路由器上發現某用戶×××的路由是正確的。同時在城市B的PE上也發現某用戶×××的路由是正確的。也就是說城市A城市B某用戶兩端的路由都是正確的。
MPLS ×××的路由正確都是不能PING通,問題出如今底層的MPLS的交換過程。這個也是CISCO早期實現MPLS ×××技術時發生的軟件BUG。具體表現爲:一個MPLS ×××在正常的使用過程當中,忽然發現不通,可是從MPLS ×××路由表上看不到任何的異常。這些現象和某用戶×××的故障徹底一致。
通過進一步檢查,發現致使某用戶×××城市A和城市B不通的直接緣由是由於城市A的省骨幹PE路由器(Cisco 7206VXR),和PE直接鏈接的省骨幹P路由器(Cisco GSR 12016),城市B的省骨幹PE路由器(Cisco GSR12016)這三者間的MPLS標籤的分發出現了問題。由於MPLS ×××的IP包在MPLS骨幹網中傳輸須要在IP包頭加上兩級的MPLS標籤,依次爲IP V4標籤和××× V4標籤。
IP V4標籤是由和城市A PE直接鏈接的P路由器分發的,××× V4標籤是由城市B PE路由器分發的。若是這兩級標籤任一不正確,均可以致使×××不通。
當時就發現發生故障的PE路由器上的MPLS標籤不正確。剛開始是隻收到一級的標籤,即只收到××× V4的標籤,沒有收到IP V4的標籤。努力解決了IP V4標籤的問題後又發現××× V4的標籤不正確,即由城市B PE路由器分發的標籤通過傳輸後在城市A PE路由器上顯示爲另外一標籤。以上MPLS 標籤的不正確是致使城市A和城市B某用戶×××路由正確可是不通的緣由。