MPLS淺析——LDP破除BGP黑洞


基本概念

1.LSR ID

  • 每一台運行MPLS的LSR必須擁有一個域內唯一的LSR ID.
  • 激活MPLS之前,必須為設備配置MPLS ID(使用配置命令mpls lsr-id)
  • LSR ID長度為32bit,與IPV4地址的格式相同
  • 通常情況,我們選擇使用Loopback接口地址作為LSR ID

 

2.LDP ID

  • 每一台運行了LDP的LSR設備必須擁有LSR ID外,還必須擁有LDP ID
  • LDP ID的長度為48bit,由32bit的LSR ID與16bit的標簽空間標識符(Label Space ID)構成
  • LDP ID以“LSR ID:標簽空間標識”的形式表示,如2.2.2.2:0
  • 標簽空間標識一般存在兩種形態:

    值為0:表示基於設備(或基於平台)的標簽空間

    值為1:表示基於接口的標簽空間

 

3.傳輸地址

  • 互為鄰居的LSR需基於雙方的傳輸地址(Transport address)建立TCP連接
  • 鄰居之間通過hello報文知曉鄰居的傳輸地址
  • 在鄰居知道了通信雙方的傳輸地址后,鄰居之間嘗試TCP三次握手(基於傳輸地址),來交互LDP的初始報文,標簽映射報文,這些報文都使用傳輸地址來通信
  • 傳輸地址值會被用於鄰居間TCP連接,因此LSR必須擁有到達鄰居傳輸地址的路由
  • 缺省情況下,公網LDP的傳輸地址等於設備的LSR ID,私網的傳輸地址等於接口的主IP地址
  • 在接口視圖下,使用MPLS LDP transport-address命令可以修改傳輸地址

 

4.LDP對等體及LDP會話

LDP對等體

  LDP對等體是指相互之間存在LDP會話,使用LDP來交換標簽信息的兩個LSR

  LDP對等體通過他們之間的LDP會話獲得對方的標簽映射,LDP對等體也成為LDP鄰居

LDP會話

  

 

     本地LDP會話(Local LDP Session):建立會話的兩個LSR之間是直連的。

    (如圖R1和R2,R2和R3,R3和R4)

     遠端LDP會話(Remote LDP Session):建立會話的兩個LSR之間可以是直連的,也可以是非直連的

    (如圖R2和R4)

LDP會話建立過程

 

 

   通過發hello報文發現鄰居

  通過TCP三次握手來創建會話

 

5.LDP四種報文類型

  1. 發現(Discovery)報文:用於通告和維護網絡中LSR的存在,使用Hello報文。
  2. 會話(Session)報文:用於建立,維護和終止LDP對等體之間的會話,如Initialization報文,keepalive報文
  3. 通告(Advertisement)報文:用於創建,改變和刪除FEC的標簽映射
  4. 通知(Notification)報文:用於提供建議性的報文和差錯通知

  為保證LDP報文的可靠發送,除了Discovery報文使用UDP傳輸外,LDP的session報文,advertisement報文和notification報文都使用TCP傳輸

 

 

6.PHP(倒數第二跳彈出)

  在MPLS網絡的出站LER處,首先需要對接收的報文進行標簽移除(通過查找標簽轉發表),然后再進行FIB表的查找並轉發,由於進行了兩次查表操作,所以過程比較耗時。如果到達出站LER的流量比較大,會對設備性能造成一定的影響。為減輕出站LER的負擔,標簽在到達出站LER之前就被彈出,這樣在報文到達出站LER時已經是IP報文了,只需要查找IP轉發表就轉發出去,這樣提高了出站LER的工作效率

  為使標簽在到達出站LER之前就被彈出,使用了一個特殊的標簽——“3”,這個標簽也叫隱式空標簽,如下圖所示

 

   在上圖所示的場景中,對於網絡172.16.1.0/24來說,LSR3作為最后一跳路由器,向上游鄰居LSR2通告一個標簽值為3的標簽,當LSR2接收到去往該目標網絡的報文(帶有標簽值為1024的報文)時,會將1024標簽進行彈出操作后再轉發至下游鄰居LSR3,也就是說,3號標簽實際上是代表一種彈出操作,而不是實際需要攜帶的標簽,所以叫隱式空標簽。除了隱式空標簽外,還有顯示空標簽,用於保留標簽,使得標簽里面的qos信息不會因為標簽被彈出而丟失

 

 

實驗目的

1.利用LDP破除BGP黑洞

2.分析路由,標簽,數據

 

實驗拓撲

 

 

 

 

 

初始配置

AR1:ip route-static 150.1.5.5 255.255.255.255 155.1.12.2     //是在LSP的Ingress節點處,LSP對應的FEC在本地路由表中需要存在相應的路由前綴,為LSP指定的下一跳也要和本地路由表一致。而中間Transit節點就不一樣了,Transit節點配置指向目標的nexthop時,這個nexthop可以和該目標在本地路由表中的nexthop不一致,甚至,本地路由表可以沒有這個FEC   

AR2:ip route-static 150.1.1.1 255.255.255.255 155.1.12.1

AR4:ip route-static 150.1.5.5 255.255.255.255 155.1.45.5

AR5:ip route-static 150.1.1.1 255.255.255.255 155.1.45.4

僅配置MPLS LDP未配置IGP時,設備上提示報錯,此時各設備間傳輸地址不可達,無法建立LDP會話

Aug  8 2021 17:08:04-08:00 AR2 %%01LDP/4/SSNHOLDTMREXP(l)[1]:Sessions were deleted because the session hold timer expired and the notification of the expiry was sent to the peer 150.1.3.3.

AR234上開啟LDP,ISIS,在AR24之間建立IBGP鄰居;在AR24上配置路由迭代route recursive-lookup tunnel

 

 

初始結果 

[AR1]tracert -v -q 1 -a 150.1.1.1 150.1.5.5
traceroute to 150.1.5.5(150.1.5.5), max hops: 30 ,packet length: 40,press CTRL_C to break
1 155.1.12.2 20 ms
2 *
3 155.1.34.4 30 ms
4 155.1.45.5 40 ms

 

 

實驗步驟

第一步,上圖中,AR3的環回口地址我設置的是150.1.3.3 /24,此時AR24上沒有AR3的LSP,但是AR3上有AR24的LSP.更改為150.1.3.3 /32后正常

更改前:

 

 

 

 

 

 

 更改后:

 

 

 

 

 

 結論:華為設備默認情況下只對主機路由(/32)分配標簽,當然也可以通過lsp-tragger進行修改

 

 

 

第二步:在AR3上使用undo ttl  expiration pop

ICMP中LSR將TTL超時消息回應給報文發送者的方式有兩種:

  1.如果LSR上存在到達報文發送者的路由,則可以通過IP路由直接向發送者回應TTL超時消息

  2.如果LSR上不存在到達報文發送者的路由,則ICMP響應報文將按照LSP繼續傳輸,到達LSP出節點后,由Engress節點將該消息返回給發送者

通常情況下,收到的MPLS報文只帶一層標簽時,LSR可以采用第一種方式回應TTL超時消息;收到的MPLS報文包含多層標簽時,LSR采用第二種方式回應TTL超時消息

ttl expiration pop命令用來配置MPLS TTL超時后ICMP響應報文沿本地IP路由轉發。

undo ttl expiration pop命令用來取消此功能,即ICMP響應報文沿LSP返回。

注意:MPLS下,將清除所有ttl expiration pop功能

更改后:

[AR1]tracert -v -q 1 -a 150.1.1.1 150.1.5.5
traceroute to 150.1.5.5(150.1.5.5), max hops: 30 ,packet length: 40,press CTRL_C to break
1 155.1.12.2 20 ms
2 155.1.23.3[MPLS Label=1024 Exp=0 S=1 TTL=1] 30 ms
3 155.1.34.4 30 ms
4 155.1.45.5 20 ms

結論:默認情況下,當前拓撲僅有一層標簽,所以AR3上TTL超時信息要沿着IP路由返還,可以AR3上並沒有150.1.1.1的路由。所以出現丟包。通過在AR3上undo ttl expiration pop,使得當AR3上產生ICMP報錯時,按照第二種方式沿着LSP繼續傳輸后,由Engress節點將消息返還。

此時在AR4的0/0/0口抓包:可以抓到AR3的ICMP報錯信息,可見是沿着MPLS LSP繼續傳送了

 

 

 

 

第三步:

分析AR1訪問AR5過程中的:標簽分配,路由傳遞,數據轉發

1.標簽分配

AR1->AR5借用了AR2-AR4的LSP,下面舉例分析下150.1.4.4/32的標簽分配過程:

首先區分一個概念:LSP(標簽交換路徑)指標簽報文穿越MPLS網絡到達目的地所走的路徑。AR1->AR5過程中使用到的一條LSP是:AR2->AR3->AR4。運行LDP協議的LSR之間建立LDP會話,自動交換LDP消息,實現了標簽管理等能力

  1.1 AR4針對FEC:150.1.4.4/32在本地為上游生成標簽3,並利用Lable Mapping Message發送給AR3 ,16進制的00003轉換成10進制為3

  

  

 

   1.2 AR3收到傳過來的這個FEC及對應標簽后,存入本地,用於本地訪問150.1.4.4。另外AR3在本地為上游生成標簽1027,用於上游可以訪問150.1.4.4,並利用Label Mapping Message發送給AR2。16進制的00403轉換成十進制是1027

  

 

   

 

  1.3 AR2收到AR3傳過來的這個FEC之后記錄到本地,用於本地訪問150.1.4.4,此時仍然會為150.1.4.4本地生成一個標簽1030並發送給AR3(16進制00406等於1030),因為此時AR2上認為AR3也是上游,但是AR3不會講這個標簽放入LSP,同樣的問題AR3上也有,AR3認為AR4也是上游.AR4上則沒有這個問題

 

   

  

  

 

   

 

   

 

   

 

   

 

  *在destaddress/mask前,表示未生效

 

  1.4 至此,AR2上有了去往AR4的標簽交換路徑:1027-》3

     同樣的分析方法,AR4上有了去往AR2的標簽交換路徑:1028-》3     

 

 

2.路由傳遞

  2.1AR4上手動設置了靜態路由,要訪問150.1.5.5的下一跳是AR5

    ip route-static 150.1.5.5 255.255.255.255 155.1.45.5

 

  2.2此時AR4上已經有了150.1.5.5的路由,並將這個路由引入到了BGP中,本地引入的路由是可以傳遞給IBGP鄰居的,所以AR4會將鄰居傳遞給AR2,但此時出現一個問題,去往IBGP鄰居AR2的下一跳是AR3,但是AR3上並沒有開啟BGP,所以不會接收AR4傳遞過來的路由,這就是所謂的路由黑洞

  

 

   解決方法就是,AR4->AR3->AR2這一段路由無法走通就走標簽交換。通過配置隧道迭代route recursive-lookup tunnel,使得路由傳遞信息包裹使用AR2->AR4的LSP在標簽中傳遞給了AR2

    注意:此時的BGP更新數據包對於MPLS來說,屬於用戶數據,所以走得LSP是與用戶數據相反的AR2->AR4

  

 

  由於PHP次末彈跳出,在AR3上看到要轉換的標簽是隱式空標簽3,所以直接把標簽去掉了,抓到的包里面就不包含標簽了

   

 

 

  2.3路由到達AR2之后,被AR2接收並計入路由表

  

 

   2.4AR1上手動設置了要去往150.1.5.5,下一跳是AR2

 

  2.5至此AR1到AR5的路由傳遞完成

 

 

3.數據轉發

  3.1AR1訪問AR5根據路由表,數據包被轉發到了AR2

 

  3.2AR2上根據路由確定了下一跳是AR3,根據隧道迭代,打上了1029的標簽傳給了AR3(左邊是分析過程,實際是因為數據包到達AR2之后查fib表是要走 標簽交換)

    注意:因為標簽是動態分配,文章編寫過程中shut過端口,所以上下文標簽可能不一樣

 

  

   

 

   

 

 

  3.3在AR3上根據LSP信息,得知要更換的標簽是隱式空標簽3,所以彈出標簽,將數據發送給了AR4

  

 

  

 

   3.4在AR4上收到不帶標簽的數據包,根據手動配置的靜態路由發送給了AR5(左邊是分析過程,實際是因為查到LFIB表象,下一跳是IP轉發,所以查IP路由表。因為模擬器不支持查看LFIB表,無法驗證)

  ip route-static 150.1.5.5 255.255.255.255 155.1.45.5

 

  3.5數據通信完成

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM