熊建輝, 盧 宇,b, 鄭中華
(福建師范大學a.協和學院;b.物理與能源學院,福州350117)
隨著各種新型ICP及應用不斷涌現,生活、工作、娛樂越來越網絡化、便捷化,電信骨干網絡流量每年以50%以上的速度高速增長,使得互聯網規模的不斷擴大及運營商網絡出現流量分布不均衡、資源利用率低等問題[1],產生了如何基于現有網絡實現多樣化路由策略等實現流量調度需要。核心骨干網絡路由器路由條目多達十余萬條,路由協議成為計算機網絡的核心技術和萬物互聯的基礎技術。邊界網關協議(Border Gateway Protocol,BGP)是目前唯一的一種廣泛應用于運營商網絡的外部網關協議(Exterior Gateway Protocol,EGP)[2],可用來解決不同自治系統(Autonomous System,AS)之間的路由及通過路由策略優化路由的問題,從而實現流量按需可控調度。
骨干網路由設備價格昂貴,而現網承載任務重大、試驗風險高[3]。本文基于EVE-NG虛擬仿真環境下的IOL 及i86bi_linux-L3-adventer prisek9-ms.157-3.M.bin仿真設計并實現了一個多AS有選路需求的仿真網絡,重點是研究BGP路由協議的技術框架、原理,驗證BGP路由協議工作機制,仿真設計方案還可直接移植到實際的網絡中。
路由協議根據作用范圍可分為內部網關協議(Interror Gateway Protocol,IGP)和EGP。BGP 屬于EGP被稱為路徑矢量路由協議,支持CIDR和VLSM,有別于距離矢量路由協議在于其定義了路徑屬性,并且可以根據需要通過設置不同的BGP路徑屬性值來控制選路[4]。BGP路由條目數量巨大,以增量更新及觸發更新機制基于TCP179端口更新路由信息。當前使用的BGP協議版本為RFC 4271,并且在一些方面進行了升級,具體詳見RFC6286,RFC6608,RFC6793,RFC7606,RFC7607,RFC7705,RFC 8212(2017 年7月)等。以下從BGP基本術語、鄰居建立機制、消息類型等入手闡述BGP路由協議原理。
自治系統(AS):處于同一個管理機構控制之下的路由器和網絡群組的集合。如CHINANET-IDC-GD就是一個AS。AS通過16 bit的AS號來標識,并分公共AS號(1~64511)和私有AS號(64512~65535),在RFC 6793 中其長度擴展為32 bit(1 ~4294967295)[5]。在AS內一般運行IGP,運營商網絡常用的IGP有ISIS、OSPF 等。
BGP發言者(BGP Speaker):運行BGP協議的路由器,也稱BGP路由器。
BGP對等體(BGP Peer):相互交換消息的BGP發言者之間互稱為BGP對等體。
EBGP關系:處于不同AS的邊界BGP發言者與對等體之間的關系。為形成EBGP關系一般需要確保BGP發言者與對等體存在直連或靜態路由。
IBGP關系:因BGP路由穿越本AS傳遞到另外一個AS,而在本AS內形成的BGP發言者與對等體之間的關系。為形成IBGP關系先確保AS內部存在IGP(如OSPF等)路由使得BGP發言者與對等體網絡能通。
BGP路由協議中通過形成并維護BGP鄰居表(adjancy table),BGP 轉發表(forwarding database)及路由表(routing table)來實現其工作機制。其中形成鄰居表是基礎,每個BGP發言者鄰居關系建立過程(BGP有限狀態機)如下:
空閑(Idle)狀態:為初始狀態,當協議激活后初始化,復位計時器,發起第一個TCP連接,同時監聽遠程對等體所發起的連接,轉向連接狀態。
連接(Connect)狀態:開始TCP連接并等待TCP連接成功的消息。如果TCP連接成功,則進入Open發送狀態;如果TCP連接失敗,進入活躍狀態。
活躍(Active)狀態:總是試圖建立TCP連接,若連接計時器超時,則退回到連接狀態,TCP連接成功就轉為OPEN發送狀態。
OPEN 發送(Open sent)狀態:TCP連接已建立,已發送第一個OPEN報文,等待接收對方的Open報文,并對報文進行檢查,若發現錯誤則發送Notification消息報文并退回到Idle狀態。若檢查無誤則發送Keepalive消息報文,Keepalive計時器開始計時,并轉為Open證實狀態。
OPEN證實(Open confirm)狀態:等待接受Keepalive報文,復位保持計時器。如收到Keepalive報文,就轉為Established狀態,鄰居關系完成。如果系統收到一條更新或Keepalive消息,它將重新啟動保持計時器;如果收到Notifi cation消息,則退回到空閑狀態。
已建立(Established)狀態:鄰居關系協商完成,即建立了鄰居(對等體)關系,路由器將和鄰居交換Update報文,同時復位保持計時器。
Open消息:為TCP連接建立(3次握手)后發送的第一個消息,用于建立BGP對等體之間的鄰居關系形成BGP鄰居表。
Keepalive消息:BGP會周期性地向對等體發出Keepalive消息,用來復位保持穩定的鄰居關系。
Update消息:用于在對等體之間交換路由信息,其中攜帶BGP路徑屬性,它既可發布可達路由信息,也可撤銷不可達路由信息,用來形成BGP轉發表。
Notification消息:當BGP檢測到錯誤狀態時,就向對等體發出Notification消息,之后BGP連接會立即中斷。
Route-refresh消息:當路由策略發送變化時,請求BGP鄰居重新通告路由的消息,用來刷新BGP轉發表。
BGP協議中AS能接收鄰居的消息也會宣告消息給鄰居[7],消息中的路徑屬性可以根據需要設計路由策略來修改,然后根據選路原則從BGP轉發表中選擇最優的BGP轉發條目放進路由表中。
BGP協議把一個AS理解為一個大的路由器,BGP表的每一條條目包含下一跳AS、網絡目的前綴及若干屬性。該屬性稱為BGP路徑屬性,正是設計了眾多BGP路徑屬性,方可根據需要改變BGP路徑屬性來制定想要的路由策略,從而實現流量調度,成為BGP除能支持大規模路由條目外另一大優勢。BGP路徑屬性就是可對特定路由進行了進一步描述的參數,被攜帶在Update消息中在BGP路由器中傳遞,通過制定策略在發送或接受該消息時對路徑屬性值進行修改,然后再根據BGP選路原則決定該條目是否優選為最佳,最佳的將被放進路由表中。BGP路徑屬性可被看作是不同類型的metric值,一般分為公認強制遵守、公認可選遵守、可選并傳遞的、可選不傳遞的等4類屬性[8]。公認的屬性是指不同網絡設備廠商都識別的,又分為強制包含和可選包含。可選是指可以不識別此類屬性,傳遞的是指傳遞給對等體,不傳遞即不會傳遞給對等體。目前BGP及其擴展協議定義了多達16種路徑屬性,其中常見的屬性有ORIGIN、AS-PATH、NEXT-HOP、LOCAL-PREF、MULTI-EXIT-DISC(MED)、Community及Weight等等,其中前3個為公認強制遵守的,第4個為公認可選遵守的,第5個為可選并傳遞的,第6個為可選不可傳遞的[9]。
BGP選路原則即BGP協議選擇最優BGP轉發表條目放進路由表中的優先順序,作為制定BGP路由策略的基礎。是否能成為最優BGP轉發條目與改條目中攜帶的BGP路徑屬性有關,由于不同廠商的BGP路徑屬性不一樣,BGP選路原則也有差異,比如有些廠商路由器ID也參與選路(級別較低)[10]。以路由器為例,BGP選路原則首先得滿足路由的下一跳可達、關閉同步等前提,具體原則包含14條,按屬性優先級從高往低匹配,一旦匹配成功則不再往下匹配。以下為常用的6條原則:
(1)先比較Weight值,越大越優先:Weight屬性為廠家私有,本地通告的路由的Weight為32 768,從BGP對等體學習的路由Weight屬性默認為0,保證了本地始發的路由最優先,該參數本地有效。
(2)再比較LOCAL_PREFf值,越大越優先:Local Preference屬性只能在IBGP對等體之間傳遞,如果在EBGP對等體之間收到的路由的路徑屬性中攜帶Local Preference,則會觸發Notifica tion報文,中斷BGP鏈接。
(3)本地通告的路由優先:如果LOCAL_PREF值相同,則選擇BGP本地通告的路由也就是下一跳為0.0.0.0的轉發的條目放進路由表。
(4)最短AS路徑的優先:AS路徑即記錄路由信息傳遞過程所經過的AS號,AS數量最少的優先。并且聚合路由時,使用as-set后產生的AS列表中{}內的AS號長度為1;而在聯盟內的AS列表中()內的AS號長度不參與計算。另外不同方向的route-map中插入的AS號的位置是不同的。
(5)比較origin屬性:該屬性標識路徑信息的來源,為公認強制屬性,該屬性值為:IGP,標識信息來源于AS內部;EGP,標識信息通過AS外部學習;Incomplete,標識信息通過別的方式習得;并且優先順序:IGP>EGP>incomplete。Origin屬性雖然在BGP路由信息必須中攜帶,但很少使用作為BGP選路策略。
(6)多出口標識符(Multi-Exit Discriminator,MED):該屬性為公認可選(主流廠商都實現該路徑屬性)非傳遞屬性,MED值越小越優先,MED可以在IBGP間傳遞,可以傳遞給EBGP;但是最多只能傳遞到相鄰的AS中。通常用于AS的出口策略,也即控制進入本AS的入流量。在廠家的BGP表顯示為metric。它跟Local Preference屬性基本上是相反的,配置上則很相似。
BGP路由策略就是根據要實現的選路目標及BGP選路原則而制定修改BGP路徑屬性的一套方法。BGP路由策略實現的具體過程:根據選路原則確定要修改的路徑屬性,然后抓獲BGP條目信息,最后修改其中需要修改的路徑屬性,該過程可以發生在BGP條目信息的發送者或接受者上。通常通過訪問控制列表(ACL)、前綴列表(Prefix-list)等設置條件,然后通過Route-map中match語句來匹配調用設置的條件,對于匹配成功的通過Route-map中的set語句來修改具體的路徑屬性。
Route-map應用范圍非常廣泛,其一般形式如下:
route-map Name [deny|permit]N1 //Name 為該routemap的名字,N1為該序列的序列號
match X1 X2...Xn //X1、X2...Xn 表示匹配條件X1、X2...Xn“與”的關系
set Y1 //Y1 為同時滿足X1、X2...Xn時修改路徑屬性的語句
...
...
route-map Name [deny|permit]Nx
match Xx1
...
match Xx+n //Xx1...Xx+ n 表示匹配條件Xx1...Xx+n“或”的關系
set Yx //Yx為滿足條件Xx1...Xx+n中的至少一個時修改路徑屬性的語句
一個Route-map一般包含多個序列語句,每個序列語句中可包含match匹配語句和set修改路徑屬性的語句,并且末尾隱含deny any序列語句。序列語句中[deny|permit]為可選、默認為permit,根據場景不一樣所代表的含義不一樣,Nx為該序列的序列號默認為10,除第1個外所有序列均需標明序列號。Routemap定義好需調用在接口上方可生效。
下一代仿真虛擬環境(EmulatedVirtual Environment-Next Generation,EVE-NG),原名是Unified Networking Lab。EVE-NG實質為一塊深度定制的Ubuntu操作系統,不僅融合了dynamips、IOL、KVM 還支持多個廠家的網絡設備;不僅可以模擬仿真網絡設備,還可運行虛擬機,只要能將虛擬機的虛擬磁盤格式轉換為qcow2都可以在EVE-NG上運行,因此EVENG為一名副其實的仿真虛擬環境平臺。應用時,可直接安裝在x86架構的物理主機上或部署在VMware Workstation及Exsi平臺上,另外還有ova版本直接導入VMware等虛擬機中運行[11]。EVE-NG目前包含社區版、專業版及學習中心版[12]。
EVE-NG與以往GNS3、eNSP、HCL及Packet Tracer不同。GNS3雖然也是融合了dynamips但更像是一款單機版虛擬仿真軟件,雖然dynamips能夠部署成C/S架構,但文本配置比較復雜;而EVE-NG可部署成B/S架構,管理應用簡單,服務端安裝EVE-NG并根據不同客戶需要搭建不同的網絡結構,客戶端只需支持http/https登錄服務端選擇網絡結構進行實驗。學習中心版可供多個客戶同時登錄并隔離實驗。
本實驗通過EVE-NG虛擬仿真環境下的Cisco IOL 及i86bi_linux-L3-adventerprisek9-ms.157-3.M.bin型號的IOS仿真了一個包含6臺路由器的多AS多出口的BGP 網絡,R1、R2、R3、R4 屬于AS64521,R5、R6分別位于AS64525、AS64526,重點研究BGP在3個AS特別是AS 64521中的實現機制和過程,該網絡設備間連接及接口信息等情況如圖1所示。

圖1 BGP網絡實例結構
BGP路由協議有良好的特性,本實驗重點展示了通過local-prefer ence屬性、MED屬性設計路由策略來實現如下目標:
(1)AS64525與AS64526網絡相通;
(2)訪問AS64525 的.5.5.50/24 網段時通過R1;
(3)AS64525 訪問AS64526 中的60.60.60.0/24、60.60.61.0/24 網段時通過R2 出發;
(4)AS64525與AS64521間的多出口鏈路中的一個斷開時所有流量通過另外一條鏈路。
實驗過程中根據需要拓展ping查看數據往返情況、BGP鏈接、鄰居表、BGP轉發表、路由表等信息。在部署BGP時首先部署好IGP(如OSPF等)使得本AS域內全網可通,方可建立BGP連接[13],在本例中通過邏輯鏈路的Full-mesh(IBGP)實現AS64521內BGP路由器之間的互聯。
(1)網絡基本配置。按照表1,分別配置路由器R1~R6各端口的IP地址和子網掩碼等信息,其中Lo0、Lo1等為環回網卡,測試用。

表1 網絡基本配置
(2)AS64521 IGP配置。根據以上理論分析:在一個AS內部須先運行IGP,在本實驗中選擇OSPF(選擇IS-IS也行,均為運營商網絡主流協議),為簡化問題假定R1、R2、R3、R4 均處于骨干區域(area 0),以R2為例配置如下,R1、R3、R4的配置以此類推。
R2(config)#router ospf 100
R2(config-router)#net 2.2.2.2 0.0.0.255 area 0
R2(config-router)#net 10.1.25.0 0.0.0.255 area 0
R2(config-router)#net 10.1.23.0 0.0.0.255 area 0
R1、R3、R4均配置完畢后,在R4上分別拓展ping 1.1.1.1、2.2.2.2,源為4.4.4.4,測試結果如下:
Sending 5,100-byte ICMP Echos to 1.1.1.1,timeout is 2
seconds:!!!!!
Success rate is 100 percent(5/5),round-trip min/avg/max = 4/19/40 ms
Sending 5,100-byte ICMP Echos to 2.2.2.2,timeout is 2
seconds:.!!!!
表明AS內已實現全網可達。
(3)BGP 基本配置。根據圖1,R1、R2、R3、R4 為同一AS,R5、R6分別單獨為一個AS,它們之間的AS號及關系見表2,分別配置路由器R1~R6的AS號及其鄰居關系。

表2 AS及BGP鄰居關系
R1上的BGP配置如下,R2、R3、R4上的BGP配置與R1類似不再贅述,R5、R6通過直連接口配置與鄰居間的BGP關系。
R1(config)#router bgp 64521
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#no auto-summary
R1(config-router)#no synchronization
R1(config-router)#neighbor 3.3.3.3 remote-as 64521
R1(config-router)#neighbor 3.3.3.3 up lo0
R1(config-router)#neighbor 3.3.3.3 next-hop-self
R1(config-router)#neighbor 4.4.4.4 remote-as 64521
R1(config-router)#neighbor 4.4.4.4 up lo0
R1(config-router)#neighbor 4.4.4.4 next-hop-self
R1(config-router)#neighb 10.1.15.5 remote-as 64525
配置好R1、R2、R3、R4、R5、R6 上的BGP 基本信息后,可以查看到建立的TCP關系,以R1為例,其BGP TCP鏈接關系如下,表明其與R3、R4的IBGP關系及與R5的EBGP關系建立好了。
R1#show tcp bri
TCB Local Address Foreign Address (state)
C6CC8908 1.1.1.1.47519 3.3.3.3.179 ESTAB
C6CC5A98 1.1.1.1.25826 4.4.4.4.179 ESTAB
C6CC63A0 10.1.15.1.29240 10.1.15.5.179 ESTAB
在BGP中通告路由和建立TCP關系是分開的,接下來需要在R5、R6上向網絡通告自己的BGP路由,以R6為例通告路由配置如下(R5與之類似不再贅述):
R6(config)#router bgp 64526
R6(config-router)#net 6.6.6.0 mask 255.255.255.0
R6(config-router)#network 60.60.60.0 mask 255.255.255.0
R6(config-router)#network 60.60.61.0 mask 255.255.255.0
R5、R6 通告完路由后,在R1、R2、R3、R4、R5、R6上查看到到達5.5.5.0/24、6.6.6.0/24、50.50.50.0/24、60.60.60.0/24、60.60.61.0/24 等網絡的路由信息,以R6為例信息如圖2所示:

圖2 通告后R6上的路由信息
以上表明BGP配置成功。
(4)測試及分析。通過以上配置,AS64525與AS64526之間的網絡通過穿越AS64525網絡理應互通。選擇在R5上測試,為了更清晰的看到數據的往返路由情況,我們選擇了拓展Ping,目標IP為6.6.6.6、源IP 為5.5.5.5,選擇“記錄”路由過程信息,具體信息如圖3所示,以上結果看出正確率為100%,表明該網絡可達;通過記錄的路由過程信息表明從5.5.5.0/24 到60.60.61.0/24 去往時經歷了R5、R1、R3、R4、R6,返回時經歷了R6、R4、R3、R2、R5。進一步,在R5上繼續拓展Ping,目標IP 改為為60.60.60.6 或6.6.6.6、源IP 改為50.50.50.5 或5.5.5.5,記錄的路由過程信息與上面一樣,測試結果見表3。

圖3 R5 拓展ping 6.6.6.6、源IP 為5.5.5.5 結果

表3 AS64525與AS64526間連通性測試
測試結果表明“去”均是經歷R1,“回”都是經歷R2。測試看起來貌似很成功,但是BGP的“路徑”特性及“負載”功能還未得到體現,更重要的是如果本結構圖中E0/0接口均換成F0/0后,測試結果是“去”和“回”都是經過R2,這樣造成了所有大流量都是經過R2,而R1卻空閑。因此需要進一步選路優化。
通過以上工作實現了第1點需求,接下來通過BGP選路優化實現第2點和第3點同時保障第4點需求,即進一步實現AS64525 自治系統5.5.5.0/24 網段訪問6.6.6.0/24 時(從R1 出去然后)從R1 返回;AS64525 自治系統訪問60.60.60.0、60.60.61.0/24網段時從R2出去(然后從R2返回);當AS64525與AS64521之間的一個鏈路故障時,所有流量自動切換到另一鏈路[14]。
根據前面闡述的基本原理,BGP選路主要通過Route-map并結合訪問控制列表(Access Control List)或前綴列表(Prefix-list)來實現,以下分別來通過案例進行論證。
(1)實現訪問AS64525 的5.5.5.0/24 網段時通過R1。選路分析:通過上面BGP基本工作,已實現了流量從R1出去、從R2返回,所以接下來只需要實現AS64525 自治系統5.5.5.0/24 網段訪問6.6.6.0 從R1返回即可。因此需要使得在R3上優選從R1收到的5.5.5.0/24 即可,根據選路原則,可選擇增大R1 的local-preference屬性值(默認值為100),具體設計的路由策略如下:
R1(config)#access-list 1 permit 5.5.5.0
R1(config)#route-map out_of_R1 permit 10
R1(config-route-map)#match ip address 1
R1(config-route-map)#set local-preference 110
R1(config-route-map)#exit
R1(config)#route-map out_of_R1 permit 20
R1(config)#router bgp 64521
R1(config-router)#neighbor 3.3.3.3 route-map out_of_R1 out
在R3上,查看BGP轉發表,會看到返回5.5.5.0/24 的路由最優路由下一跳是1.1.1.1(R1),如圖4所示。實現目標。

圖4 調整R1的local-preference后R3上的BGP轉發表
(2)實現訪問AS64526 中的60.60.60.0/24、60.60.61.0/24 網段時通過R2。選路分析:通過上面BGP基本工作,已實現流量從R1出去、從R2返回,所以接下來只需要實現AS64525自治系統訪問60.60.60.0/24、60.60.61.0/24 網段時從R2 進入AS64521即可,因此需要使得R5上優選從R2收到的關于60.60.60.0/24、60.60.61.0/24 網段的路由信息即可。根據選路原則,可選擇增大R1發來的關于60.60.60.0/24、60.60.61.0/24 路由信息的MED 屬性值(廠家設備中以metric標識,默認為0),由于涉及到兩個網段為了提高效率通過prefix-list來抓取,具體設計的路由策略如下:
R1(config)#ip prefix-list 2 permit 60.60.60.0/23 ge 24 le 24
R1(config)#route-map out_of_R2 permit 10
R1(config-route-map)#match ip address prefix-list 2
R1 (config-route-map)#set metric 10
R1(config-route-map)#exit
R1(config)#router bgp 64521
R1(config-router)#neighbor 10.1.25.5 route-map out_of_R2 out
在R5上,查看BGP轉發表,收到來自R1的關于60.60.60.0/24、60.60.61.0/24 條目的Metric 屬性變為10,因此也變成了次優路由,最優路由經由R2,詳細信息如圖5所示。
(3)測試與分析。在R5上,通過拓展ping R6目的IP 為6.6.6.6 源IP 為5.5.5.5 時,記錄的ping包往返路由信息如圖6所示,成功率為100%,往返路由為:R5-> R1-> R3-> R4-> R6-> R6-> R4-> R3->R1,實現了源為5.5.5.0/24 的信息從R1 發從R1 回的目標。

圖6 R5 拓展ping IP 為6.6.6.6 源IP 為5.5.5.5 結果
在R5上,繼續拓展ping R6目的IP分別為60.60.60.6、60.60.61.6,源IP 分別為50.50.50.5、5.5.5.5,記錄所有ping包往返路由信息,成功率均為100%,測試結果詳細信息如表4所示。

表4 優化后AS64525測試
測試結果表明:實現了訪問AS64525 的5.5.5.0/24網段時通過R1;實現了訪問AS64526中的60.60.60.0/24、60.60.61.0/24 網段時通過R2。
進一步測試是否實現了當AS64525與AS64521之間的一個鏈路故障時,所有流量自動切換到另一鏈路。測試如下:現在假定AS64525與AS64521間R5-R2鏈路故障(關閉R5的S1/1),在R5上查看到的BGP轉發表如圖7所示;并且在R5上能ping通R6。

圖7 R5與R1直接鏈路故障是R5上的BGP轉發表
BGP路由協議作為互聯網核心骨干網絡中的核心和基礎[15],網絡規模龐大且流量調度需求多樣化、協議原理復雜。通過EVE-NG虛擬仿真環境下的IOL及i86bi_linux-L3-adventerpr isek9-ms.157-3.M.bin 型號的IOS仿真設計并實現了一個BGP實例網絡,并結合給定選路需求演繹了路由策略設計的方法和具體過程,基于對鄰居表、BGP轉發表、路由表等信息和拓展ping得到的路由過程信息的分析,清晰驗證了BGP路由協議原理和卓越特性。并且該仿真設計方案可直接移植到實際網絡中,對指導實際網絡的應用有一定應用價值。