路由配置與管理——BGP路由配置與管理1
BGP路由配置與管理
BGP是個複雜而又龐大的距離向量型別動態路由協議,涉及非常複雜的配置。與RIP、OSPF、IS-IS路由協議屬於內部閘道器協議(IGP)不同,BGP路由協議屬於外部閘道器協議(EGP)。BGP本身不產生路由,而是通過引入其他型別的路由在對等體中間傳播的。所以BGP路由協議解決的不再是同一AS不同路由器之間的選路問題,而是解決不同AS之間的選路問題(也可在同一AS內部路由器上執行,稱之為IBGP),這也正是BGP路由協議廣泛應用於廣域網的根本原因。
BGP基礎
BGP(Border Gateway Protocol,邊界閘道器協議)是一種實現AS(自治系統)之間路由的距離向量性動態路由協議。
一、BGP簡介
1982年,EGP被用於在AS之間動態交換路由資訊,但EGP只發佈網絡可達的路由資訊,不對路由資訊進行優選,同時沒有考慮環路避免等問題。
BGP是用於取代最初的EGP而設計的另外一種外部閘道器協議。BGP能夠進行路由優選、避免路由環路、更高效的傳遞路由和維護大量的路由。早期釋出3個版本分別是BGP-1(RFC1105)、BGP-2(RFC1163)、BGP-3(RFC1267)。1994年使用BGP-4(RFC1771);2006年之後單播Ipv4網路使用的版本是BGP-4(RFC4271),其他網路使用的版本是MP-BGP(RFC4760);再後來BGP-4+提供了對IPv6單播網路的支援,用於控制IPv6單播網路中路由的傳播和選擇。
在BGP檢視下的配置將對BGP-4、BGP-4+和MP-BGP同時生效,預設情況下,在BGP IPv4單播地址族檢視下配置的命令也可在BGP檢視下直接配置,但只對BGP4生效。
雖然BGP用於在AS之間傳遞路由資訊,但並不是所有AS之間傳遞路由資訊都需要執行BGP。在一些網路出口比較單一的AS邊界,可以用更為簡單的靜態路由來配置。
1、BGP中的AS
AS是指在一個組織機構管轄下的擁有相同選路策略的IP網路。BGP網路中的每個AS都被分配了一個唯一的AS號,用於區分不同的AS。BGP中的AS號分為2位元組AS號和4位元組AS號,其中2位元組AS號的範圍為1~65535的整數,4位元組AS號範圍為1~4294967295的整數,屬於擴充套件AS號。支援4位元組AS號的裝置能夠與支援2位元組AS號的裝置相容。
2、BGP分類
BGP按照執行方式分為EBGP(External/Exterior BGP,外部BGP)和IBGP(Internal BGP,內部BGP)。
①EBGP:運行於不同AS之間的BGP稱為EBGP。為了防止AS間產生環路,當BGP裝置接收EBGP對等體發來的路由時,會將路由資訊AS_Path列表中帶有本地AS號的路由丟棄。
②IBGP:運行於同一AS內部的BGP稱為IBGP。為防止AS內產生環路,BGP裝置不將從IBGP對等體學習到的路由釋出給其他IBGP對等體。預設需要與所有IBGP對等體建立全連線才能實現AS內部各IBGP裝置間的路由互通。為了解決現實網路中多數情況下AS內部各IBGP裝置間很難實現全連線的問題,BGP提供了“路由發射器”和“聯盟”兩種解決方案。
如果在AS內一臺BGP裝置收到EBGP對等體傳送的路由後,需要通過另一臺BGP裝置將該條路由資訊傳播給其他AS時,則建議將這兩臺BGP裝置配置執行IBGP。如上圖,位於AS200中的R1收到EBGP對等體R3傳送的路由後,希望把這條路由資訊通過R2傳播到AS300中,所以R1與R2要配置為執行IBGP。實際上就是讓他們成為IBGP對等體。由此可見IBGP對等體不一定就是直接連線的。
3、兩種BGP報文互動角色
BGP報文互動中分為Speaker和Peer兩種角色。
①Speaker:傳送BGP報文的裝置稱為BGP Speaker(發言者)。它接收或產生新的報文資訊,併發布給其他BGP Speaker。Speaker角色是針對具體報文傳送過程而言的,網路中每臺BGP路由器均可成為自己傳送BGP報文的Speaker。
②Peer:相互交換報文的Speaker之間互稱Peer(對等體)。多個相關的對等體可以構成對等體組(PeerGroup),然後可以為這個對等體組進行集中配置。
4、BGP的路由器ID(RouterID)
與OSPF一樣,BGP也是採用RouterID(路由器ID)來標識一個BGP裝置的。路由器ID會在BGP會話建立時傳送的Open報文中攜帶,也是一個32位值,通常是IP地址的形式。在對等體之間建立BGP會話時,每臺BGP裝置都必須有唯一的路由ID,否則對等體之間不能建立BGP連線。
在整個BGP網路中,每臺BGP裝置的路由器ID必須唯一,可採用手動配置,也可讓BGP自己在裝置上選取。在沒有手動配置路由器ID的預設情況下,BGP選擇裝置上的Loopback介面的IP地址作為BGP的路由器ID。否則選擇裝置上物理介面中最大的IP地址作為BGP的路由器ID。一旦選出路由器ID,除非發生介面地址刪除等事件,否則即使配置了更大的介面IP地址,也會保持原來的路由器ID。
二、BGP AS
BGP的AS用於將整個外部網路劃分為一個個應用本地路由策略的路由子域,這樣公司通過BGP可以簡化路由域管理和統一策略配置,因為一個BGP裝置可以連線多個AS。在BGP裝置連線的每個AS中可以支援多種不同的路由協議,但BGP本身不產生路由,需要通過引入各種IGP路由、直連路由和靜態路由來實現與各個子網路的連線。不同的BGP AS中的BGP路由器間需通過EBGP對等會話動態交換路由資訊;同一個AS內部的BGP路由器間通過IBGP對等會話交換路由資訊。
因為BGP主要用於基於Internet這樣的公網連線,所以它的AS又與僅應用於公司內部網路的AS不一樣,在公網中使用的AS(稱之為“公用AS”)必須是在公網註冊,並由ISP統一分配,且在整個Internet中都是唯一的,就像公網IP地址一樣。
RFC5398中規定,在1~64511間的2位元組AS號是公網AS,64512~65534之間的2位元組AS號是私網AS(AS號65535是保留用於特定用途的)。私有AS號可以用於內部路由域,但不能傳輸到達Internet的通訊,不要配置通告私有AS號到外部網路。
上圖說明了在分隔AS中的兩個路由器可以通過EBGP協議進行連線。RouterA和RouterB是兩個使用公用AS號的獨立路由子域上的ISP路由器。這兩個路由器通過Internet來傳輸通訊。RouterA和RouterB是通過EBGP對等會話進行連線的。每個直接連線Internet的公用AS各自分配一個由ISP提供的AS號,用於標識BGP程序和AS。
1、BGP AS號格式
在2009年1月之前,RFC4271 BGP-4中使用的AS號是一個2位元組數,取值在1~65535範圍之間。IANA從2009年1月開始在RFC5396中定義了4位元組的AS號,取值範圍從65536~4294967295。AS有以下兩種表示格式:
(1)Asplain AS(無格式AS)
Asplain AS號格式是一個普通的十進位制整數,可以是2位元組的,也可以是4位元組的,不同長度僅代表As編號的取值範圍不同,是BGP預設的AS號格式。
(2)Asdot AS(點分AS)
Asdot AS格式AS號是一個點分記數法所表示的十進位制數。它規定:如果是2位元組的AS號(最大值為65535),則直接用它的十進位制整數表示;如果是4位元組的AS號,則採用點分計數法表示。點分記數法的計算方法是先把這個十進位制AS號轉換成二進位制,然後從右向左每16為(2位元組)分成一段,在兩段之間以小圓點分隔,再將這兩段分別換算成十進位制。
儘管可以任意使用Asplain格式或者Asdot格式4位元組AS號,但在display命令的輸出中,或者在正則表示式中僅顯示或控制一種格式。
2、保留的AS號
在RFC4893 BGP-4標準中,支援由2位元組AS向4位元組的過渡。但這個標準中新增了保留的AS號23456.後來又在新的RFC5398標準中規定了新的保留AS號,它們是在64496~64511之間的2位元組AS號和在65536~65551之間的4位元組AS號。
三、BGP地址族
最初BGP-4標準僅支援IPv4網路,為解決BGP對多種網路層協議的支援,IETF對BGP-4進行了地址族能力擴充套件,形成MP-BGP(Multi-Protocol BGP,多協議BGP),使BGP能夠為多種網路應用提供路由資訊。在RFC4760(Multiprotocol Extensions for BGP-4)中,定義了兩個新的可選非過度屬性(“非過度屬性”就是該屬性不能傳遞到其他裝置上,僅在本地裝置上使用),BGP的多種協議擴充套件都用到了這兩個屬性。
①擴充套件協議可達NLRI(MP_REACH_NLRI,屬性型別14)。
②擴充套件協議不可達NLRI(MP_UNREACH_NLRI,屬性型別15)。
這兩種屬性適用於所有BGP協議擴充套件。為了對不同的擴充套件型別進行區分,在這兩種屬性中都攜帶了BGP地址族(Address Family)和子地址族(Sub-Address Family)資訊。所謂“地址族”就是一種網路層協議(如TCP/IP網路中的IPv4、IPv6,以及OSI網路中的CNLS)配置模組,簡單說就是把不同型別的網路分塊進行配置。其目的就是把針對執行不同網路層協議的網路分別進行功能配置,這樣配置起來就更加有條理,因為這些不同網路層協議的地址格式的應用需求或許根本不一樣。
為了進一步區分同一型別網路中不同型別的網路應用(如IPv4和IPv6網路中都有單播、組播、VPN等),又可在地址族下劃分子地址族。“地址族”使用AFI(Address Family Identifier,地址族識別符號)進行標識,對應的子地址族為SAFI(Subsequent AddressFamily Identifier,子序列地址族識別符號)。
目前在IP網路中,MP-BGP主要包括4個地址族:IPv4、IPv6、L2VPN和VPLS地址族。在IP地址族下又有IPv4單播、IPv4組播、IPv4 VPN、IPv4 MPLS和IPv4 MDT子地址族等,IPv6地址族下有IPv6單播和IPv6組播子地址族等。
BGP報文型別及格式
BGP-4協議有5種報文:Open(建立)、Update(更新)、Notification(通知)、Keepalive(保持活躍)和Route-refresh(路由重新整理)。
各欄位解釋:
①Marker:佔16位元組,用於標明BGP報文邊界,固定值為所有位元均為“1”,相當於一個報文的頭部識別符號。
②Length:佔2位元組,標識BGP報文總長度(包括報頭在內),以位元組為單位。
③Type:佔1位元組,標識BGP報文的型別。其取值從1到5,分別表示Open、Update、Notification、Keepalive和Route-refresh訊息。
一、Open報文格式
Open(建立)是TCP連線建立後傳送的第一個報文,包含本地Speaker資訊以及用於後面對等體間建立TCP會話的資訊,用於建立BGP對等體之間的連線關係。報文格式如下:
Open報文中的各欄位資訊必須在對等體之間進行路由資訊交換之前協商確定好。
①Version:標識本地裝置使用的BGP版本,佔1位元組。對BGP-4,其值為4。
②My autonomous system:標識本地AS號,佔2位元組或4位元組。通過比較兩端的AS號可以確定是EBGP連線(不同時)還是IBGP連線(相同時)。
③Hold time:標識對等體與本裝置保持連線的時間,佔2位元組,以秒為單位。在建立對等體關係時兩端要協商Holdtime,並保持一致。如果在這個時間內未收到對端發來的Keepalive訊息或Update訊息,則認為BGP連線中斷。
④BGP identifier:標識BGP路由器的路由器ID,佔4位元組,採用點分十進位制格式的IP地址的形式,用來識別BGP路由器。
⑤Opt Parm Len(Optional Parameters Length):可選引數的長度,佔1位元組,標識可選引數的總長度,如果為0則沒有可選引數。
⑥Optional Parameters:可選引數,長度可變,用於多協議擴充套件(Multiprotocol Extensions)等功能,如BGP驗證資訊。
二、Update報文格式
在BGP對等體之間成功建立了BGP會話後,雙方就可以開始利用Update(更新)報文進行路由資訊交換了,包括要向對等體通告的每條路由資訊。但Update報文既可以釋出可達路由資訊,也可以撤銷不可達路由資訊。
一條Update報文可以通告一類具有相同路徑屬性的可達路由,這些路由放在NLRI(Network Layer ReachableInformation,網路層可達資訊)欄位中,PathAttributes欄位攜帶了這些路由的屬性,BGP根據這些屬性進行路由的選擇;同時Update報文還可以攜帶多條不可達路由資訊,被撤銷的路由放在Withdrawn Routes欄位中,用來通知對等體要撤銷的路由。
①Unfeasible routeslength:標識不可達路由(Withdrawnroutes)欄位的長度,佔2位元組,以位元組為單位,包含通知對等體從它的BGP路由表中要撤銷的當前不可達路由的數量。如果為0則說明沒有要撤銷的路由,也就沒有下面的Withdrawn routes欄位。
②Withdrawn routes:不可達路由列表,長度可變,包含要從對等體BGP路由表中撤銷的當前不可達路由的網路地址及字首。
③Total path attributelength:標識路徑屬性(Path attributes)欄位的長度,佔2位元組,以位元組為單位。如果為0則說明沒有下面的Path attributes欄位。
④Path attributes:與NLRI欄位相關的所有路徑屬性列表,每個路徑屬性由一個TLV(Type-Length-Value)三元組構成,可變長度。BGP正是根據這些屬性值來避免環路,進行選路、協議擴充套件等。
⑤NLRI(Network Layer Reachability Information):標識網路層可達資訊,包含要向對等體通告的每條可達路由的字首,長度可變。這些可達路由資訊來自本地Adj-RIB-In(AdiacentRouting Information Base,Incoming,入方向鄰接路由資訊庫),然後又將加入到對端Adj-RIB-In中。
三、Notification報文格式
當BGP檢測到錯誤狀態時,就會向對等體發出Notification(通知)報文,之後BGP連線會立即中斷。
①Error code:差錯碼,佔1位元組,指定錯誤型別。
②Error subcode:差錯子碼,佔1位元組,描述錯誤型別的詳細資訊。
③Data:錯誤訊息內容,可變長度,用於輔助發現錯誤的原因。內容依賴於具體的差錯碼和差錯子碼,記錄的是出錯部分的資料。
四、Keepalive報文格式
BGP會週期性的向對等體傳送Keepalive(保持活躍)報文,用來保持對等體連線的有效性。報文格式僅包含BGP報頭,沒有附加其他任何欄位。
五、Route-refresh報文格式
Route-refresh(路由重新整理)報文用來要求對等體重新發送指定地址族的路由資訊。
①AFI:Address Family Identifier,地址族標識,佔2位元組,用於標識所採用的地址族型別。
②Res:保留,1位元組,必須為0。
③SAFI:subsequent Address Family Identifier,子地址族標識,1位元組,用於標識子地址族型別。
BGP的主要路由屬性
BGP路由屬性是隨著通過Update報文傳送的BGP路由資訊一起釋出的一組引數。它對特定的路由進行了進一步的描述,使得路由接收者能夠根據路由屬性值對路由進行過濾和選擇。它們可以被看做選擇路由的度量(metric)。
一、BGP路由屬性分類
BGP路由資訊包括許多屬性,總體分為4類:
①公認必須遵循(Well-know mandatory):所有BGP裝置都可以識別此類屬性(這就是“公認”的含義),且必須在Update報文中存在(這就是“必須遵循”的含義),否則對應的路由資訊就會出錯。
②公認任意(Well-known discretionary):所有BGP裝置都可以識別此類屬性,但不要求必須存在於Update報文中(這就是“任意”的含義),即就算缺少這類屬性,路由資訊也不會出錯。
③可選過渡(Optional transitive):BGP裝置可以不識別此類屬性,如果BGP裝置不識別此類屬性,仍然會接收這類屬性(這就是“可選”的含義),且可將該屬性通告給其他對等體(這就是“過渡”的含義)。
④可選非過渡(Optional non-transitive):BGP裝置可以不識別此類屬性,如果BGP裝置不識別此類屬性,也會接收這類屬性,但在接收時忽略該屬性,不會將該屬性通告給其他對等體(這就是“非過渡”的含義),即僅在本地路由器上使用。
二、ORIGIN(源)屬性
Origin屬性公認必須遵循(就是所有BGP路由器都可識別,且必須在Update報文中存在)的BGP路由屬性,用來標記一條BGP路由的路由資訊源型別,指明瞭當前BGP路由是從哪類裝置中產生的。有以下三種類型:
①IGP(i):是IBGP裝置通過network命令通告的路由,是本AS內產生的路由,優先順序最高。
②EGP(e):是從EGP對等體那裡學習得到的路由,優先順序次之。
③incomplete(?):優先順序最低,是通過其他方式學習到的路由資訊,比如BGP通過import-route命令引入的外部路由。但它並不是說明路由不可達,而是表示路由的來源無法確定。
三、AS_PATH屬性
AS_Path(AS路徑)屬性也是公認必須遵守的BGP路由屬性。AS_PATH屬性按向量(所謂“向量”就是帶有方向性的變數)順序記錄了某條路由從本地到達目的地址所經過的所有AS號,即“AS路徑列表”的含義。AS路徑列表可以理解為一個小括號裡面包括所經過的AS號,各AS號間以逗號分隔,且離本地裝置越近的AS編號越在前面(小括號的左邊),如(200,400,100)表示該路由經過了AS200、AS400、AS100三個AS,其中AS200離本地裝置最近,AS100離本地裝置最遠,也即路由的源AS。
通過觀察路由的AS_Path屬性,BGP裝置可以找出該路由是從哪個AS產生的,以及該路由在傳遞過程中經過了多少AS。AS路徑最右邊的AS號就是路由的產生者(即源AS),最左邊的AS號就是剛剛宣告該路由的那個相鄰的AS。處於AS_Path中間的AS號是路由傳遞經過的AS。這樣的AS_Path序列被稱為AS_Sequence。
當BGP路由器在通告路由資訊時,遵循以下原則:
(1)當BGP Speaker通告自身引入的路由時
①當BGP Speaker將這條路由釋出到EBGP對等體時,便會在Update報文中建立一個攜帶本地AS號的AS路徑列表。
②當BGP Speaker將這條路由釋出給IBGP對等體時,便會在Update報文中建立一個空的AS路徑列表。
(2)當BGP Speaker通告從其他BGP Speaker的Update報文中學習到的路由時
①當BGP Speaker將這條路由釋出給EBGP對等體時,便會把本地AS編號新增在AS路徑列表的最前面(最左面)。收到此路由的BGP裝置根據AS-Path屬性就可知道去目的地址所要經過的AS。離本地AS最近的相鄰AS號排在前面,其他AS號按順序依次排列。
②當BGP Speaker將這條路由釋出給IBGP對等體時,不會改變這條路由相關的AS_Path屬性。
如上圖,有兩條從AS 50區域中路由器到達目的網路8.0.0.0的路由,根據箭頭所示的路由釋出方向(路由釋出方向是到達目的地址的路由路徑的反方向)可看出,在AS_Path列表中依次添加了所經過的AS號,並且是最近的處於最前面,其他AS號按順序依次排列,中間以逗號分隔。如最後D=8.0.0.0(30,20,10)和D=8.0.0.0(40,10)。
預設情況下,BGP不會接受AS_Path中已包含本地AS號的路由,從而避免了環路形成,與RIP的水平分割特性功能類似。也就是隻有在EBGP對等體之間通告路由時才會在AS路徑列表中新增AS號,同一個AS中的通告不會新增AS號。如果某臺BGP路由器從其外部對等體收到某條路由的AS路徑列表中包含了自己的AS號,則該路由器就知道出現了環路,因而將丟棄該路由。
同時,AS_Path屬性也可用於路由的選擇和過濾。在其他因素相同的情況下,BGP會優先選擇路徑較短的路由。如上圖,AS50中的BGP路由器會優先選擇經過AS40的路徑作為目的地址8.0.0.0的最優路由。
在某些應用中,還可以使用路由策略來人為增加AS路徑長度,以便更靈活控制BGP路由路徑的選擇。通過配置AS路徑過濾列表,還可針對AS_Path屬性中所包含的AS號來對路由進行過濾。
四、NEXT_HOP屬性
Next_Hop(下一跳)屬性也是公認必須遵守的BGP屬性。因為BGP主要用於AS間網路的連線,所以它的“下一跳”僅是針對不同AS中的EBGP對等體間的路由釋出而言的,是指下一個AS,而不是指下一個路由器,因為在IBGP對等體間的路由釋出中其下一跳屬性是不會改變的。
動態路由(包括RIP、OSPF、IS-IS和BGP)的“下一跳”都是針對接收路由資訊的裝置而言的,而不是針對傳送路由資訊而言的,因為路由中的目的地址所在網路總是在通告路由的路由器之前,即路由自身的路徑與路由被通告的路徑是相反的。另外,無論是EBGP對等體,還是IBGP對等體,不一定都是直接連線的,非直接連線的BGP路由器之間也可建立EBGP或者IBGP對等體連線。
通常情況下,Next_Hop屬性遵循下面的規則:
①BGP Speaker在向EBGP對等體釋出(包括轉發)某條路由時,會把該路由資訊的下一跳屬性修改為本地與對端建立EBGP對等體連線關係的出介面IP地址。
如下圖14-9圖,AS100路由器產生到達8.0.0.0網路的路由併發布給AS200路由器時,下一跳地址就是AS100路由器與AS200路由器連線時所用的出介面IP地址1.1.1.1/24。
再次解釋一下為什麼該路由的下一跳會變成傳送路由釋出的AS100中的路由器的出介面IP地址1.1.1.1/24。因為對於接收這條路由的AS200中的路由器來說,它到達1.1.1.1/24的路由方向其實就是由AS100中的路由器向他自己通告這條路由的反方向(也就是圖中箭頭方向的反方向),而在這個反方向中的下一跳正好就是AS100中的路由器的出介面。
同理,AS200向AS300中左邊那臺路由器轉發從AS100得到的路由釋出時,其路由的下一跳地址為AS200與AS300中左邊那臺路由器相連時所用的出介面的IP地址1.1.2.1/24。
②BGP Speaker將本地始發的路由(也就是這條路由的目的網路就是直接連線在該BGP Speaker上)釋出給IBGP對等體時,也會把該路由資訊的下一跳屬性設定為本地與對端建立IBGP鄰居關係的出介面IP地址。但是收到該IBGP路由的IBGP對等體不會再轉發給其他的IBGP對等體,這是為了避免在AS內部出現路由環路。即BGP Speaker從IBGP對等體獲得的IBGP路由不再向其他IBGP對等體釋出。
③BGP Speaker在向IBGP對等體轉發從EBGP對等體學習到的路由時,不改變該路由資訊的下一跳屬性(但通過配置也改為轉發路由的BGP裝置的出介面IP地址),但收到轉發的EBGP路由的IBGP對等體可以再轉發給其他IBGP對等體。且如果配置了負載分擔,路由被髮給IBGP對等體時則會修改其下一跳屬性。
如上圖,AS300左邊那臺路由器轉發從AS200獲得的路由釋出到相同區域中的右邊那臺路由器時,其下一跳沒有改變,仍為AS200與AS300中左邊那臺路由器相連時所用的介面的IP地址1.1.2.1/24。
五、LOCAL_PREF屬性
Local_Pref(本地優先順序)屬性是公認任意(所有BGP路由器都可識別,但可以不在Update報文中存在)的BGP屬性,表明BGP路由器自身(不是針對具體路由)的BGP優先順序(Local_Pref屬性值越大,優先順序越高),用於判斷流量離開本地AS時的最佳路由。路由器配置了Local_pref屬性後,本路由器上所有的BGP路由都具有相同的本地優先順序。
當一個AS內部的BGP的裝置通過得到不同的IBGP對等體到達位於其他AS中的相同目的地址,但下一跳不同的多條路由時,將優先選擇Local_Pref屬性值較高的路由。Local_Pref屬性僅在IBGP對等體之間交換和比較,不通告給其他AS。
如下圖,在RouterD上學習到了兩條通過同一AS中的IBGP路由器路徑到達RouterA的路由,這時就可以使用本地優先順序進行選路了,經過比較最終確定選擇RouterC作為從AS20到AS10的出口(如虛箭頭方向),因為RouterC中的Local_Pref屬性值為200,高於RouterB中的Local_Pref屬性值100。
六、MED屬性
MED(多出口)屬性是一個可選非過渡(不要求在Update必須存在,且不可向其他對等體通告)屬性,用於EBGP對等體判斷流量進入其他AS時的最優路由。
MED屬性僅在相鄰兩個AS之間交換,收到此屬性的AS一方不會再將其通告給任何其他第三方AS。當一個BGP路由器通過不同的EBGP對等體得到目的地址相同,但下一跳不同的多條路由時,在其他條件相同的情況下,將優先選擇MED值較小者作為進入EBGP對等體所在AS的最優路由,即MED值越小,優先順序越高。
如上圖,從AS10到AS20的流量將選擇RouterB作為入口(虛箭頭方向),因為RouterB中的MED值為0,小於RouterC中的MED值100。
一般情況下,EBGP路由器只比較來自同一個其他AS中多個EBGP對等體路徑的MED屬性,不比較來自不同AS的MED值。若非要比較的話,則可以通過手動配置強制BGP比較來自不同AS的路由的MED屬性值。如果路由器沒有配置MED屬性,BGP選路時將該路由的MED值按預設值0來處理。
七、團體屬性
Community(團體)屬性是一個可選過渡(不要求在Update必須存在,但可向其他對等體通告)的BGP屬性,是一組有相同特徵的目的地址的BGP路由集合,用來簡化路由策略的應用和降低維護管理的難度,因為這樣可以為團體中的路由成員一次性配置相同的引數屬性和路由策略,也可通過團體屬性進行路由過濾。而且,團體中具體集合的路由數量沒有物理上的邊界,與其所在的AS無關,也就是可以是不同AS路徑的路由。
BGP團體屬性可分為基本團體屬性和擴展團體屬性兩種:
1、基本團體屬性
基本團體屬性的“Type code”(型別程式碼)欄位值是8,屬性取值佔32位,可以解析為一個十進位制數,也可解析為aa:nn的格式,各佔16位。32位團體屬性值中0x00000000~0x0000FFFF和0xFFFF0000~0xFFFFFFFF被保留。RFC1997中規定,前16位表示路由的源AS號,後16位可以理解為源AS劃分的子AS號,也可用來標識路由來自不同的IGP路由型別,或者其他屬性,如本地優先順序值、MED屬性值等,應用非常靈活。
RFC1997還規定了以下幾種公認的基本團體屬性:
①INTERNET:預設情況下,所有的路由都屬於INTERNET團體。具有此屬性的路由可以被通告給所有的BGP對等體。
②NO_EXPORT(屬性值為十進位制的4294967041,或者十六進位制的0xFFFFFF01):具有此屬性的路由在被收到後,不能被髮布到本地AS之外。如果使用了聯盟(Confederation),則不能被髮布到BGP聯盟之外,但可以釋出給聯盟中的其他子AS。
BGP聯盟其實就是一個AS下面的子AS劃分,滿足一些較大企業使用者需要多個AS,但又想進行集中路由域管理的需求。這樣在一個大的組織機構劃分多個子網路管理區域,每個子區域獨立分配成為1個子AS,可以減少同一個AS中BGP路由的數量,提高了路由和管理效率。
③NO_ADVERTISE(屬性值為十進位制的4294967042,或者十六進位制的0xFFFFFF02):具有此屬性的路由被接收後,不能被通告給任何其他的BGP對等體。
④NO_EXPORT_SUBCONFED(屬性值為十進位制的4294967043,或十六進位制的0xFFFFFF03):具有此屬性的路由被接收後,不能被通告到本地AS之外,也不能通告到聯盟中的其他子AS。
2、擴展團體屬性
因為團體屬性的使用越來越豐富,原有的32位定義已經不能滿足各種應用,所以應運而生了擴展團體屬性。擴展團體屬性使用了新的“Type code”(為16)格式。比起原來的基本團體屬性,擴展團體屬性提供了更長的取值範圍(佔64位),以減少衝突的可能;同時,還增加了一個Type欄位,可以使得路由策略直接基於擴展團體屬性的Type欄位進行操作。相當於將一些原來需要通過複雜的團體屬性配置才能實現的功能,直接新增到了擴展團體屬性的結構中。
路由反射器與聯盟
在BGP中,為了防止路由環路的出現,對於EBGP路由和IBGP路由分別作了如下規定:
①對於AS之間學習到的EBGP路由,通過AS_Path屬性記錄途經的AS路徑,規定在收到帶有本地AS號的路由將被直接丟棄。
②對於AS內部學習到的IBGP路由,規定在收到路由後禁止向其他IBGP對等體釋出。也就是IBGP對等體之間僅能學習到對等體(IBGP的對等體可以不是直接連線的)之間的路由,不能學習到非鄰居之間的路由。
從上可看出,IBGP裝置之間只有對等體之間可以相互學習到路由,這樣就帶來一個問題,即非IBGP對等體之間不能彼此互動路由資訊,變成路由不可達了。為保證IBGP對等體之間的連通性,需要在IBGP對等體之間建立全連線關係。即假設在一個AS內部有n臺裝置,那麼建立的IBGP連線數就是n*(n-1)/2。這樣一來,當一個AS中的BGP裝置很多時,裝置配置將十分複雜且消耗網路和CPU資源。
為解決以上問題,BGP提供了兩種解決方案:一個是在IBGP對等體間使用路由反射器(Route Reflector,RR),另一個就是聯盟(Confederation)。
一、路由反射器
在RR技術中,為一個AS內部的各IBGP裝置定義了以下幾種角色:
①路由反射器(RR):允許把從IBGP對等體學習到的路由反射到其他IBGP對等體,與OSPF網路中的DR(指定路由器)或者IS-IS網路中的DIS(指定IS)類似。
②客戶機(Client):與RR形成反射鄰居關係的IBGP裝置,類似於OSPF中的DROther,或者IS-IS網路中的DISOther。在AS內部,客戶機只需要與RR直連,彼此交換路由資訊,客戶機之間無需直接連線,也無需交換路由資訊。
③非客戶機(Non-Client):既不是RR,也不是客戶機的IBGP裝置。在AS內部非客戶機與RR之間,以及所有的非客戶機之間仍然必須建立全連線關係。
④叢集(Cluster):路由反射器及其客戶機的集合,通過專門的Cluster_List屬性可以防止叢集間產生路由環路。
⑤始發者(Originator):在AS內部始發IBGP路由的BGP裝置。通過專門的Originator_ID屬性可防止叢集內產生路由環路。
1、路由反射器原理
在路由反射器技術中規定,同一叢集內的客戶機只需要與該叢集的RR直接交換路由資訊,因此客戶機只需要與RR之間建立IBGP連線,不需要與其他客戶機建立IBGP連線,從而減少了IBGP連線數量。
RR突破了“從IBGP對等體獲得的BGP路由只能釋出給它的EBGP對等體”的限制,並採用獨有的Cluster_List屬性和Originator_ID屬性分別防止了叢集之間和叢集內部的路由環路出現。RR向IBGP鄰居釋出路由規則如下:
①從非客戶機學習到的路由,釋出給所有客戶機
②從客戶機學習到的路由,釋出給所有非客戶機和客戶機(發起此路由的客戶機除外)。
③從EBGP對等體學習到的路由,釋出給所有的非客戶機和客戶機。
2、Cluster_List屬性
路由反射器和它的客戶機組成一個叢集(Cluster),使用AS內唯一的Cluster ID作為標識。為了防止叢集間產生路由環路,路由反射器使用Cluster_List屬性來記錄路由經過的所有叢集的ClusterID,類似EBGP路由中所使用的AS_Path屬性。具體流程如下:
①當一條路由第一次被RR通告時,RR會把本地Cluster ID新增到Cluster_List的前面。如果沒有Cluster_List屬性,RR就建立一個。
②當RR接收到一條更新路由時,RR會檢查Cluster_List。如果Cluster_List中已經有本地Cluster ID,則丟棄該路由;否則,將其加入Cluster_List,然後通告該更新路由。
3、Originator_ID屬性
Originator_ID由RR產生,使用路由始發者的RouterID進行標識,用於防止叢集內產生路由環路。具體流程:
①當一條路由第一次被RR通告時,RR將路由始發者的Originator_ID屬性加入這條路由,標識這條路由的發起裝置。如果一條路由中已經存在了Originator_ID屬性,則RR將不會建立新的Originator_ID屬性。
②當IBGP接收到這條路由的時候,將比較收到的Originator_ID和本地的RouterID,如果兩個ID相同,則丟棄該路由,否則,接收該更新路由。
4、備份路由反射器
為增加網路可靠性,防止單點故障,需要在一個叢集中配置一個以上的RR。由於RR打破了從IBGP對等體收到的路由不能傳遞給其他IBGP對等體的限制,所以如果同一叢集記憶體在多個RR,則它們之間中又可能存在環路,因此這裡又規定,同一叢集中的所有RR必須使用相同的Cluster ID,以避免RR之間的路由環路。
如上圖,路由反射器RR1和RR2在同一個叢集內,配置了相同的Cluster ID。下面是備份路由反射器解決路由環路的具體流程:
①當客戶機Client1從EBGP對等體接收到一條更新路由時,它將通過IBGP同時向RR1和RR2通告這條路由。
②RR1和RR2在接收到該更新路由後,將本地Cluster ID新增到Cluster_List前面,然後向其他的客戶機(Client2、Client3)通告。
③當Client2、Client3客戶向RR1和RR2進行路由釋出時,RR1和RR2有可能收到原來由自己向客戶機通告的路由。這時RR1和RR2會檢查路由釋出中的Cluster_List,如果發現自己的ClusterID已經包含在通告路由的Cluster_List中,就丟棄該更新路由,從而避免了路由環路。
5、多叢集路由反射器
一個AS中可以存在多個叢集,各個叢集的RR之間可以建立IBGP對等體。當RR所處的網路層不同時,可以將較低網路層次的RR配成客戶機,形成分級RR。當RR所處的網路層相同時,可以將不同叢集的RR全連線,形成同級RR。在實際的RR部署中,常用的是分級RR場景。
如14-14圖所示,ISP為AS100提供Internet路由。AS100內部分為兩個叢集,其中Cluster1內的4臺裝置是核心路由器,採用備份RR的形式保證可靠性;而Cluster2內的兩臺裝置是下級路由器,採用單RR結構。
圖14-15所示,一個骨幹網被分成多個叢集。各叢集的RR間互為非客戶機關係,並建立全連線。此時雖然每個客戶機只與所在叢集的RR建立IBGP連線,但所有RR和客戶機都能收到全部路由資訊。
二、BGP聯盟
解決AS內部的IBGP網路連線激增問題,還可以使用聯盟(Confederation)技術。
聯盟將一個AS劃分為若干個子AS。每個子AS內部建立IBGP全連線關係,子AS之間建立聯盟EBGP連線關係,但聯盟外部AS仍會認為聯盟是一個AS。配置聯盟後,原AS號將作為每個路由器的聯盟ID。這樣有兩個好處:一是可以保留原有的IBGP屬性,包括Local Preference屬性、MED屬性和Next_Hop屬性等;二是聯盟相關的屬性在傳出聯盟時會自動被刪除,即管理員無需在聯盟的出口處配置過濾子AS號等資訊的操作。
如下圖14-16,AS100使用聯盟後被劃分為3個子AS:AS65001、AS65002、AS65003,使用AS100作為聯盟ID。此時IBGP的連線數量從10條減少到4條,不僅簡化了裝置的配置,也減輕了網路和CPU的負擔。AS100外的BGP裝置因為僅知道AS100的存在,並不知道AS100內部的聯盟關係。
聯盟的缺陷是:從非聯盟方案向聯盟方案轉變時,要求路由器重新進行配置,邏輯拓撲也要改變。