解決BGP的路由黑洞之BGP-MPLS解決方案(一)

BGP-MPLS解決方案

1.MPLS 發展-原理概述

2.MPLS的標籤交換前提-LDP

3.BGP-MPLS解決方案(原理版)

BGP-MPLS 是運營商最常用的一種手段,用於解決BGP的路由黑洞問題
MPLS類似一種專線,解決了大型企業在公司各站點間通過運營商進行通信的問題

本文主要通過分享一個案例來給大家詳細的介紹BGP-MPLS

首先我們要知道MPLS是如何工作的->

1.MPLS發展-原理概述

1.1 MPLS 發展歷程 -> 初試鋒芒-加快轉發速率

MPLS最初研發出來時不是用於解決BGP的路由黑洞問題的,而是用來解決TCP/IP路由器轉發速率慢的問題

我們都知道路由表是通過多次匹配、遞歸查找,最長匹配原則來匹配相應的路由條目,這種查找是通過路由器CPU來進行計算查找,比較耗費時間,且CPU處理的不僅僅是查找路由條目這一個工作,而要達到快速的目的必須依靠其他硬件芯片,之後以CISCO代表的廠商研究出來一種芯片,但時間晚於MPLS

在這裏插入圖片描述

MPLS定義的一種標籤轉發規則,隨着分配標籤協議發展,現在出現一種共用的協議LDP
LDP: 主要工作就是分配標籤,MPLS決定轉發,MPLS協議本身比較簡單,沒有對路由路徑進行多少判斷,它的判斷是根據其他協議的結果來做的,選路不是MPLS的強項,MPLS的強項在於轉發機制,來彌補路由表的缺點

1.2 MPLS 發展歷程 -> 風波再起-CEF

當MPLS發展正興時:
以CISCO代表的廠商發明了一種東西叫做:

CEF(優化的路由表)

CEF=ARP表+路由表最長匹配結果+路由表遞歸結果
多次->一次 三元匹配原則,由TCAM芯片完成
當CEF表研發出來後,英雄無用武之地,CEF替代了MPLS實現了快速轉發機制

1.3 MPLS 發展歷程 -> 重回巔峯-解決BGP路由黑洞

但是MPLS提供的一種新形式的轉發路徑,基於標籤轉發,每一條路由條目都有一條獨特的標籤路徑->符合隧道的一切特徵(封裝+洞口與洞尾),用標籤來形成一條隧道,此時人們發現BGP和MPLS是絕配,MPLS依據標籤隧道很好的解決了BGP的黑洞問題,且MPLS沒有算法,它只是一套轉發機制,相對於路由協議來說,MPLS只是佔用一定比例的帶寬資源,對路由器幾乎沒有計算上的壓力

在這裏插入圖片描述

VRF

之後又出現一種技術,又將MPLS推上頂峯,這種技術叫做VRF(Virtual Routing Forwarding,虛擬路由轉發)

我們都知道在交換網絡中,有一種技術叫做VLAN(Virtual Local Area Network,虛擬局域網),它的作用是劃分廣播域,可以說用來分割CAM表,而VRF產生出來是爲了劃分路由表,也可以說是劃分路由器,一個路由器中可以存在多個VRF,每個VRF中都有自己獨立的VRF路由表,這樣就將路由器的路由表分割開來,而彼此之間不互相影響

VLAN間通信使用Trunk幹道,那麼VRF間通信使用什麼呢?

在這裏插入圖片描述

2. MPLS的標籤交換前提-LDP

MPLS只負責標籤交換的過程,而LDP協議是爲MPLS服務的,它爲路由條目分發標籤,供MPLS進行交換,接下來我們介紹一下LDP-標籤分發協議

2.1 LDP狀態機

因爲MPLS是建立在LDP之上的,所有我們首先先了解LDP,路由器要分配標籤,那麼路由器之間必然存在關係,LDP與大多數路由協議類似,需要建立鄰居關係,建鄰必然存在狀態機(規定每個階段完成什麼樣的任務)
在這裏插入圖片描述

  • init: UDP 646端口,組播地址224.0.0.2,組播發送hello,收集對端Router-id參數
  • Open-sent/Recived: Open-sent是主動發出hello進入的狀態,Open-Recived是接收到對端的hello進入的狀態,在此狀態,通過TCP 646端口建立TCP連接,發送keeplive報文
  • Operational: TCP連接完成,進入保活狀態,鄰居關係建立
  • Non-Existent: TCP連接超時、收到init之外其他消息,超時發送NAK消息都會進入該狀態

識別對端Router-id,通過TCP 646端口建立TCP連接,啓用LDP協議,底層必須有着路由協議的支撐,且Router-id必須爲迴環口
之後通過Update報文,將爲路由條目所分配的標籤發送給各鄰居

2.2 LDP標籤分發機制

上游對下游分發標記,及控制層裏面的路由通告的方向
最佳標籤產生過程

LDP分配標籤時參考的爲CEF表,CEF表中所有的路由都分配一個標籤,形成一個binding表(Cisco通過show mpls ldp binding查看)

  • Binding表 = 路由前綴 + 本地分配標籤(local binding) + 從鄰居收到的關於該路由的標籤(remote binding)
  • Remote binding表 = 鄰居的Router-id + 鄰居爲該路由條目分配的標籤

該binding可以理解爲LDP的數據庫,類似於EIGRP/OSPF路由協議的拓撲表

在這裏插入圖片描述

標籤斷裂

在此處路由前綴一定是嚴格匹配一致性的
10.1.1.0/24
10.1.1.1/24

10.1.1.0/24 包含了10.1.1.1/24,但是在LDP中,完全不一樣,在此處,會分配不同的標籤

比如在OSPF,當我們將回環口起爲/24位時,會出現問題,因爲在OSPF中,其他路由器學到的路由條目是打O /32位的,此時如果啓用LDP協議,本地爲/24爲分配標籤,鄰居爲/32爲分配標籤,此時在鄰居binding表中,會存在兩條掩碼不同的路由前綴的binding表,不會產生標籤交換的過程,進而不能進行通信,所以在啓用LDP時,我們底層如果使用迴環口建鄰,迴環口必須定義成/32位

也就是說MPLS中路由在傳遞過程中不能彙總,不能該表其位數(掩碼),如果底層爲OSPF的迴環地址最好寫成32位主機地址

3.BGP-MPLS解決方案(原理版)

如下圖所示,這是我們來簡單的介紹一下MPLS是如何打破BGP黑洞的一個案例,這個案例只爲了說明怎樣去解決黑洞問題,在之後的博文中,會爲大家介紹更爲複雜、更趨於真實環境的案例
在這裏插入圖片描述
R1路由器

  • R1底層OSPF,使用環回地址建鄰,loopback 0口1.1.1.1/32
  • R1 BGP,BGP AS100,使用環回0口與R4建立IBGP鄰居關係,宣告環回1口10.1.1.1/32
  • R1 LDP,定義標籤分發範圍100-199
  • R1 啓用MPLS
**loopback 0口**
R1(config)#interface loopback 0
R1(config-if)#ip address 1.1.1.1 255.255.255.255
R1(config-if)#exit 

**loopback 1口**
R1(config)#interface loopback 1
R1(config-if)#ip address 10.1.1.1 255.255.255.255
R1(config-if)#exit 

**R1-R2直連**
R1(config)#interface s3/0
R1(config-if)#ip address 10.1.12.1 255.255.255.0
R1(config-if)#no shutdown 
R1(config-if)#exit

**底層OSPF**
R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#exit 
R1(config)#interface loopback 0
R1(config-if)#ip ospf 1 area 0
R1(config-if)#exit 
R1(config)#interface s3/0
R1(config-if)#ip ospf 1 area 0
R1(config-if)#exit 

**BGP**
R1(config)#router bgp 100
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#neighbor 4.4.4.4 remote-as 100
R1(config-router)#neighbor 4.4.4.4 update-source loopback 0
R1(config-router)#neighbor 4.4.4.4 next-hop-self 
R1(config-router)#network 10.1.1.1 mask 255.255.255.255
R1(config-router)#exit 

**定義標籤分發範圍**
R1(config)#mpls label range 100 199

**定義LDP建鄰Router-id**
R1(config)#mpls ldp router-id loopback 0 force

**啓用MPLS**
R1(config)#interface s3/0
R1(config-if)#mpls ip 
R1(config-if)#exit 
R1(config)#

R2路由器

  • R2底層OSPF,使用環回地址建鄰,loopback 0口2.2.2.2/32
  • R2 LDP,定義標籤分發範圍200-299
  • R2 啓用MPLS
**loopback 0口**
R2(config)#interface loopback 0
R2(config-if)#ip address 2.2.2.2 255.255.255.255
R2(config-if)#exit 

**R1-R2直連**
R2(config)#interface s3/1
R2(config-if)#ip address 10.1.12.2 255.255.255.0
R2(config-if)#no shutdown 
R2(config-if)#exit 

**R2-R3直連**
R2(config)#interface s3/0
R2(config-if)#ip address 10.1.23.1 255.255.255.0
R2(config-if)#no shutdown 
R2(config-if)#exit 

**OSPF**
R2(config)#router ospf 1
R2(config-router)#router-id 2.2.2.2
R2(config-router)#exit 
R2(config)#interface loopback 0
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit 
R2(config)#interface s3/1
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit 
R2(config)#interface s3/0
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit 

**定義標籤分發範圍**
R2(config)#mpls label range 200 299

**定義LDP建鄰Router-id**
R2(config)#mpls ldp router-id loopback 0 force 
R2(config)#exit 

**啓用MPLS**
R2(config)#interface s3/1
R2(config-if)#mpls ip 
R2(config-if)#exit 
R2(config)#interface s3/0
R2(config-if)#mpls ip
R2(config-if)#exit 
R2(config)#

R3路由器

  • R3底層OSPF,使用環回地址建鄰,loopback 0口3.3.3.3/32
  • R3 LDP,定義標籤分發範圍300-399
  • R3 啓用MPLS
**loopback 0口**
R3(config)#interface loopback 0
R3(config-if)#ip address 3.3.3.3 255.255.255.255
R3(config-if)#exit 

**R2-R3直連**
R3(config)#interface s3/1
R3(config-if)#ip address 10.1.23.2 255.255.255.0
R3(config-if)#no shutdown 
R3(config-if)#exit 

**R3-R4直連**
R3(config)#interface s3/0
R3(config-if)#ip address 10.1.34.1 255.255.255.0
R3(config-if)#no shutdown 
R3(config-if)#exit 

**OSPF**
R3(config)#router ospf 1
R3(config-router)#router-id 3.3.3.3
R3(config-router)#exit 
R3(config)#interface loopback 0
R3(config-if)#ip ospf 1 area 0
R3(config-if)#exit 
R3(config)#interface s3/1
R3(config-if)#ip ospf 1 area 0
R3(config-if)#exit 
R3(config)#interface s3/0
R3(config-if)#ip ospf 1 area 0
R3(config-if)#exit 

**定義標籤分發範圍**
R3(config)#mpls label range 300 399

**定義LDP建鄰Router-id**
R3(config)#mpls ldp router-id loopback 0 force 
R3(config)#exit 

**啓用MPLS**
R3(config)#interface s3/1
R3(config-if)#mpls ip 
R3(config-if)#exit 
R3(config)#interface s3/0
R3(config-if)#mpls ip
R3(config-if)#exit 
R3(config)#

R4路由器

  • R4底層OSPF,使用環回地址建鄰,loopback 0口4.4.4.4/32
  • R4 BGP,BGP AS100,使用環回0口與R1建立IBGP鄰居關係,宣告環回1口10.4.4.4/32
  • R4 LDP,定義標籤分發範圍400-499
  • R4 啓用MPLS
**loopback 0口**
R4(config)#interface loopback 0
R4(config-if)#ip address 4.4.4.4 255.255.255.255
R4(config-if)#exit 

**loopback 1口**
R4(config)#interface loopback 1
R4(config-if)#ip address 10.4.4.4 255.255.255.255
R4(config-if)#exit 

**R3-R4直連**
R4(config)#interface s3/1
R4(config-if)#ip address 10.1.34.2 255.255.255.0
R4(config-if)#no shutdown 
R4(config-if)#exit

**底層OSPF**
R4(config)#router ospf 1
R4(config-router)#router-id 4.4.4.4
R4(config-router)#exit 
R4(config)#interface loopback 0
R4(config-if)#ip ospf 1 area 0
R4(config-if)#exit 
R4(config)#interface s3/1
R4(config-if)#ip ospf 1 area 0
R4(config-if)#exit 

**BGP**
R4(config)#router bgp 100
R4(config-router)#bgp router-id 4.4.4.4
R4(config-router)#neighbor 1.1.1.1 remote-as 100
R4(config-router)#neighbor 1.1.1.1 update-source loopback 0
R4(config-router)#neighbor 1.1.1.1 next-hop-self 
R4(config-router)#network 10.4.4.4 mask 255.255.255.255
R4(config-router)#exit 

**定義標籤分發範圍**
R4(config)#mpls label range 400 499

**定義LDP建鄰Router-id**
R4(config)#mpls ldp router-id loopback 0 force

**啓用MPLS**
R4(config)#interface s3/1
R4(config-if)#mpls ip 
R4(config-if)#exit 
R4(config)#

測試

以上配置完成之後,BGP的路由黑洞打通,10.1.1.1 和 10.4.4.4 之間可以互相通信
在這裏插入圖片描述
在R1上我們可以看到,4.4.4.4與10.4.4.4的CEF表中,下一跳出接口和標籤都一致,意味着,此時R1與10.4.4.4進行通信使用的爲4.4.4.4的標籤路徑,也就是說4.4.4.4和10.4.4.4共用一條標籤路徑,而在啓用MPLS之後,R2與R3值通過標籤交換進行數據轉發,不去看路由表,當數據到達R4之後,脫去標籤查本地路由表從而到達10.4.4.4
在這裏插入圖片描述
同理R4與10.1.1.1通信原理一致,那麼此時就用MPLS解決了BGP的路由黑洞問題
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章