Border Gateway Protocol (BGP) 邊界網關協定

前言

BGP 的全寫是 Border Gateway Protocol,最新的版本是 BGP-4,即是 Version 4,亦是最常學習和應用的版本。BGP 通常應用於比較大型的網絡結構中,用作交換不同 AS 之間的路由資訊,例如 ISP 與 ISP 之間的路由交換。BGP 的複雜性在於建立 Peers 上的一些規限,以及有大量可以影響路由結果的 Attribute,要學好 BGP,必需知道微調這些 Attribute 的方法。

eBGP 與 iBGP

學習任何 Routing Protocol,第一步得先了解如何組成 Neighbors,在 BGP 中亦稱作 Peers。Peers 利用 TCP 179 Port 溝通,分為 internal BGP (iBGP) peering 及 external BGP (eBGP) peering 兩種。

如果兩個 Router 於相同的 AS 之內組成 Peers,就會成為 iBGP Peers。 如果兩個 Router 於不同的 AS 之內組成 Peers,就會成為 eBGP Peers。

現在讓我們嘗試設定一組簡單的 BGP Peers。

bgp

圖 1 的路由器設定如下:

hostname R1
!
interface Ethernet0/0
 ip address 192.168.12.1 255.255.255.0
!
router bgp 65500
 neighbor 192.168.12.2 remote-as 65501
hostname R2
!
interface Ethernet0/0
 ip address 192.168.12.2 255.255.255.0
!
interface Ethernet0/1
 ip address 192.168.23.2 255.255.255.0
!
router bgp 65501
 neighbor 192.168.12.1 remote-as 65500
 neighbor 192.168.23.3 remote-as 65501
hostname R3
!
interface Ethernet0/1
 ip address 192.168.23.3 255.255.255.0
!
router bgp 65501
 neighbor 192.168.23.2 remote-as 65501

要知道是否成功建立 Peers,可以使用 show ip bgp summary 指令。

R2#show ip bgp summary
BGP router identifier 192.168.23.2, local AS number 65501
BGP table version is 1, main routing table version 1

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.12.1    4 65500      21      21        1    0    0 00:18:57        0
192.168.23.3    4 65501      19      19        1    0    0 00:16:27        0

每一個欄位的意思如下:

Neighbor

就是 Peer Router 的 IP address。

V

是 BGP 的版本,正如前面所說,現今一般都使用 Version 4 這個版本。

AS

Peer Router 的 AS number。如果 AS 與第一行顯示的 local AS number 相同,即代表建立了 iBGP,否則,建立的就是 eBGP 了。

MsgRcvd 及 MsgSent

MsgRcvd 是從 Peer 接收到的 BGP 封包,MsgSent 則是傳送到 Peer 的封包,在 default 的環境下,BGP Router 會每分鐘 (因為 default keepalive time=60 秒) 傳送 keepalive message 給 Peer,所以這兩個數是會不斷上升。

TblVer

傳送給這個 Peer 的最新的 BGP Database 版本,這個稍後會再說明。

InQ

顯示收到而未被處理的 BGP 訊息,如果這個數字很大的話,即是很多訊息在排隊等待處理,代表 Router 的 CPU 很忙,並未能夠處理 Peer 傳來 BGP 訊息。

OutQ

顯示等待送出的 BGP 訊息,如果這個數字很大的話,可能是由於 CPU 很忙或都 Bandwidth 不足夠而導致 BGP 訊息未能送出。

Up / Down

就是這個 Connection 的維持上線或下線時間有多久了。

State / PfxRcd

如果顯示一個數字的話 (就算是 0 也好),代表從這個 Peer 收到的 BGP Route 的數量,即是 Peer 已成功建立。但如果是顯示 Active 的話,很不幸,這代表 Peer 沒有建立成功。

建立 Peers 的狀態 (State)

一般來說,如果設定沒有問題的話,BGP Peers 就會成為 Established 的狀態。但實際上,Peers 在進入 Established 之前會經過幾個狀態 (State),了解這幾個 State 對 troubleshooting 很有幫助。

BGP Peers 的 6 個 State 分別是:

IDLE

Router 正在搜尋 Routing Table,找一條能夠連接 Neighbor 的路徑。(注意:不會使用 Default Route。)

CONNECT

Router 已經找到連接 Neighbor 的路徑了,並且完成了 TCP 3-way handshake。

OPEN SENT

已經傳送了 BGP 的 OPEN 封包,告訴對方希望建立 Peers。

OPEN CONFIRM

收到了 Neighbor 回傳封包,對方贊成建立 Peers。

ESTABLISHED

兩個 Neighbor 已經成功建立了 Peers。

ACTIVE

這是最不想看到的 State,代表 Router 仍然處於主動傳送封包的狀態,收不到對方回傳,如果持續見到此狀態的話,代表 Peers 並未成功建立。

如果想了解 State 的變化,可以使用 debug ip bgp,然後執行 clear ip bgp * 來讓 BGP Peers 從新建立起來。

R3#debug ip bgp
BGP debugging is on for address family: IPv4 Unicast
R3#clear ip bgp *
R3#
*Mar  1 02:11:24.015: BGPNSF state: 192.168.23.2 went from nsf_not_active to nsf_not_active
*Mar  1 02:11:24.019: BGP: 192.168.23.2 went from Established to Idle
*Mar  1 02:11:24.019: %BGP-5-ADJCHANGE: neighbor 192.168.23.2 Down User reset
*Mar  1 02:11:24.023: BGP: 192.168.23.2 closing
*Mar  1 02:11:24.027: BGP: 192.168.23.2 went from Idle to Active
*Mar  1 02:11:24.039: BGP: 192.168.23.2 open active, local address 192.168.23.3
*Mar  1 02:11:24.111: BGP: 192.168.23.2 went from Active to OpenSent
*Mar  1 02:11:24.111: BGP: 192.168.23.2 sending OPEN, version 4, my as: 65501, holdtime 180 seconds
*Mar  1 02:11:24.111: BGP: 192.168.23.2 send message type 1, length (incl. header) 45
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcv message type 1, length (excl. header) 26
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcv OPEN, version 4, holdtime 180 seconds
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcv OPEN w/ OPTION parameter len: 16
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 6
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has CAPABILITY code: 1, length 4
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has MP_EXT CAP for afi/safi: 1/1
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 2
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has CAPABILITY code: 128, length 0
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has ROUTE-REFRESH capability(old) for all address-families
*Mar  1 02:11:24.167: BGP: 192.168.23.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 2
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has CAPABILITY code: 2, length 0
*Mar  1 02:11:24.167: BGP: 192.168.23.2 OPEN has ROUTE-REFRESH capability(new) for all address-families
BGP: 192.168.23.2 rcvd OPEN w/ remote AS 65501
*Mar  1 02:11:24.167: BGP: 192.168.23.2 went from OpenSent to OpenConfirm
*Mar  1 02:11:24.167: BGP: 192.168.23.2 went from OpenConfirm to Established
*Mar  1 02:11:24.167: %BGP-5-ADJCHANGE: neighbor 192.168.23.2 Up

用 Loopback 來建立 iBGP Peers

在一個 AS 當中,除了 BGP 之外,一般會使用 IGP (例如:OSPF, EIGRP) 來作路由交換,在這個情況下,我們會使用 Loopback interface 作為 iBGP 的 neighbor address。因為 Loopback interface 永遠是 UP 的,而且 Neighbor 之間可以自己透過 IGP 來尋找到達 Loopback 的路徑,這比起使用 Interface IP 來作 neighbor address 來得靈活一點,也減少了因為 Interface down 而令 BGP Table 不穩定。請看以下例子。

bgp

在圖 2 的例子中,假設 R2、R3 及 R4 正運行 OSPF,如果 R2 連到 R3 的 iBGP connection 是使用 R3 e0/1 interface IP,那麽當 R3 e0/1 因為某些原因而 Down 的話,iBGP 便會斷開,讓我們做個實驗吧。

hostname R2
!
interface Ethernet0/1
 ip address 192.168.23.2 255.255.255.0
!
interface Ethernet0/2
 ip address 192.168.24.2 255.255.255.0
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
router bgp 65501
 neighbor 192.168.23.3 remote-as 65501
hostname R3
!
interface Ethernet0/1
 ip address 192.168.23.3 255.255.255.0
!
interface Ethernet0/2
 ip address 192.168.34.3 255.255.255.0
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
router bgp 65501
 neighbor 192.168.23.2 remote-as 65501
hostname R4
!
interface Ethernet0/0
 ip address 192.168.24.4 255.255.255.0
!
interface Ethernet0/1
 ip address 192.168.34.4 255.255.255.0
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0

正常情況下,R3 與 R2 能夠建立 iBGP Peers:

R3#show ip bgp summary
BGP router identifier 192.168.23.3, local AS number 65501
BGP table version is 1, main routing table version 1


Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.23.2    4 65501      11      15        1    0    0 00:05:22        0

但若果我們把 R3 的 e0/1 shutdown,iBGP connection 立刻斷開。過了 3 分鐘之後,狀態變成 Active,因為 BGP default 的 holdtime 是 180 秒,如果過了 180 秒對方也沒有反應,則進入 Active 狀態,表示已經無法成功連接。

R3#show ip bgp summary
BGP router identifier 192.168.23.3, local AS number 65501
BGP table version is 1, main routing table version 1


Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.23.2    4 65501      12      20        0    0    0 00:00:06 Active

看!這就是用 Interface IP 做 Neighbor 的壞處。今次我們試試更改設定,把 R2 和 R3 都改成用 Loopback 做 Neighbor IP。步驟如下:

  1. 首先在 R2 和 R3 加入 Loopback Interface,並設定 IP address
  2. 在 bgp config 裡,把 neighbor 的 IP 改成對方的 Loopback address
  3. 還要加入一句 neighbor <ip> update-source <interface> 的 command
hostname R2
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
!
router bgp 65501
 neighbor 3.3.3.3 remote-as 65501
 neighbor 3.3.3.3 update-source Loopback0
hostname R3
!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
!
router bgp 65501
 neighbor 2.2.2.2 remote-as 65501
 neighbor 2.2.2.2 update-source Loopback0

這樣子,就算把 R3 的 e0/1 shutdown,iBGP 都不會有中斷的情況,因為 R2 和 R3 會跟據 OSPF 提供的路由使用 R2-R4-R3 的路徑來連接對方的 Loopback Interface IP。而且在 show ip bgp summary 中也看到 Neighbor IP 變成對方 Loopback 的 IP 了。

R3#sh ip bgp summary
BGP router identifier 192.168.23.3, local AS number 65501
BGP table version is 1, main routing table version 1

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
2.2.2.2         4 65501      13      13        1    0    0 00:09:12        0

請留意,Loopback 這個技巧通常只用在 iBGP 的 connection,甚少用於 eBGP,因為我們不會用 IGP 把兩個不同的 AS 連起來。

eBGP Multihop 指令

有時候,兩個 Router 中間可能有其他網絡設備使到兩個 BGP Neighors 不能直接連接,很大機會是防火牆,因為連接其他 AS 的位置一般是 Network 的邊緣 (Edge),企業或組織通常會安裝防火牆以策安全。遇到這些情況,我們需要用 ebgp multihop 來使兩個 Router 連接起來。請看以下例子。

bgp

設定好圖 3 中 R1 和 R2 的 IP Address 之後,各加入一條 Static Route 把路徑指向 Firewall,我們用一隻 Router 來模擬成 Firewall,它能夠做 Routing。

hostname R1
!
interface Ethernet0/0
 ip address 10.1.1.1 255.255.255.0
!
router bgp 65500
 neighbor 10.2.2.1 remote-as 65501
!
ip route 10.2.2.0 255.255.255.0 Ethernet0/0
hostname R2
!
interface Ethernet0/1
 ip address 10.2.2.1 255.255.255.0
!
router bgp 65501
 neighbor 10.1.1.1 remote-as 65500
!
ip route 10.1.1.0 255.255.255.0 Ethernet0/1
hostname Firewall
!
interface Ethernet0/0
 ip address 10.1.1.2 255.255.255.0
!
interface Ethernet0/1
 ip address 10.2.2.2 255.255.255.0

在 R1 測試一下,明明可以 PING 到 10.2.2.1,就是沒法建立 BGP Peers!

R1#ping 10.2.2.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.2.2.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 40/50/72 ms
R1#show ip bgp summary
BGP router identifier 10.1.1.1, local AS number 65500
BGP table version is 1, main routing table version 1

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.2.2.1        4 65501      31      32        0    0    0 00:02:05 Idle

這時候在兩個 Router 的 BGP config 裡加入 neighbor <ip> ebgp-multihop <max hop count>,<max hop count> 是兩隻 Router 中間相隔的 hop 數目。設定好之後,問題迎刃而解!

R1(config-router)#neighbor 10.2.2.1 ebgp-multihop 2
R2(config-router)#neighbor 10.1.1.1 ebgp-multihop 2
*Mar  1 00:48:31.035: %BGP-5-ADJCHANGE: neighbor 10.1.1.1 Up

Password

為了認證 Peer Router,我們可以加入 Password,方法如下:

router bgp 65000
 neighbor 2.2.2.2 remote-as 65000
 neighbor 2.2.2.2 password cisco

只要兩邊都加入了 password 指令,即可以透過密碼認證。

Peer Group

若果要為各個 Neighbor 做相同的設定,可以使用 Peer Group 來簡化,既方便又快捷。用以下的一套設定為例:

router bgp 65000
 neighbor 2.2.2.2 remote-as 65000
 neighbor 2.2.2.2 password cisco
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 3.3.3.3 remote-as 65000
 neighbor 3.3.3.3 password cisco
 neighbor 3.3.3.3 update-source Loopback0
 neighbor 4.4.4.4 remote-as 65000
 neighbor 4.4.4.4 password cisco
 neighbor 4.4.4.4 update-source Loopback0

如果使用 Peer Group 將會變成這樣:

router bgp 65000
 neighbor iBGPNei peer-group         //為 Peer Group 設個名稱  
 neighbor iBGPNei remote-as 65000    //開始為 Peer Group 做設定  
 neighbor iBGPNei password cisco
 neighbor iBGPNei update-source Loopback0
 neighbor 2.2.2.2 peer-group iBGPNei //把 2.2.2.2 放進 Peer Group  
 neighbor 3.3.3.3 peer-group iBGPNei
 neighbor 4.4.4.4 peer-group iBGPNei

Network 指令

學好了建立 Peers 之後,終於可以開始嘗試在 Neighbor 之間交換 Route 了。最基本的方法就是使用 Network 這個指令,不過在 BGP 中執行 Network 指令,其功能與 OSPF、EIGRP 等的 Routing Protocol 有所不同。在 BGP 中,Network 指令只會宣告發佈一個網段,而不會讓任何 Interface 加入成為 BGP 的發佈點。原因其實很理所當然,因為 BGP 的 Neighbor 指令已經讓 BGP 知道那些 Interface 加入 BGP,而且完成了 Peers 的建立,而 Network 指令只需處理發佈網段的事情便可以了。還有一件事情需要緊記,就是:

要用 BGP 發佈一個網段,Router 本身的 Route Table 必需有該網段的Route,否則不能發佈。

請看看以下的例子:

bgp

假設所有 IP 和 Neighbor 已經設置好,現在我們嘗試在 R1 加一個 Loopback,然後把 Loopback 這個網段發佈出去:

hostname R1
interface Loopback0
 ip address 1.1.1.1 255.255.255.0
!
router bgp 65100
 network 1.1.1.0 mask 255.255.255.0

先在 R1 用 show ip route 確認一下 1.1.1.0/24 出現在 Routeing table 之中。

R1#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback0

然後使用 show ip bgp,可以看到 1.1.1.0/24 已經加入 BGP Table 了。

R1#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       0.0.0.0                  0         32768 i

再來看看 R2 的 show ip bgp,有收到 1.1.1.0/24 !而且 show ip route 也看到這網段已成功加入在 Route Table 之中!

R2#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.12.1             0             0 65100 i
R2#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [20/0] via 192.168.12.1, 00:08:35 
C    192.168.23.0/24 is directly connected, Ethernet0/1

R3 的情況又怎樣呢?

R3#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.23.2                           0 65200 65100 i
R3#show ip route

< Output Omitted>

     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [20/0] via 192.168.23.2, 00:16:04 
C    192.168.23.0/24 is directly connected, Ethernet0/1

就是一個 Network 指令,便完成了這個簡單的 BGP 網絡路由交換了。在此我們先解釋一下在 show ip bgp 中看到的欄位夠竟有什麼意思?

Network

網段的 Network ID 與及 Prefix Length。

Next Hop

要到達這個網段的 Next Hop IP address。如果顯示為 0.0.0.0,即是說此網段是由本地 Router 發佈的。另外有一個重要的地方要注意,就是此欄位所顯示的 Next Hop IP 必需有路由可到達,此網段才會放入 Routing Table 之中,暫時請稍稍記一下,稍後的例子會加以說明。

Metric

這是其中一個用來選擇最佳路徑的屬性。在路徑選擇的部份會詳細說明。

LocPrf

也是其中一個用來選擇最佳路徑的屬性。

Weight

特別注意這是 Cisco 獨有的欄位,如果這條 Route 是由本機 Network 指令產生的話,就會設定成 32768。這也是其中一個用來選擇最佳路徑的屬性。

Path

到達這個網段所經過的 AS Number,如果該網段是在本機的 AS Number 之中,此值便會變成空白,請留意是空白,並非 i ,i 是下一個欄位 Origin。

Origin

Origin 並沒有在欄位名顯示出來,Origin 的值就顯示在 Path 屬性後面,只有三個值:i , e 或是 ?

  • i – 此 Route 的來源是 IGP 或者是用 Network 指令
  • e – 此 Route 的來源是 EGP,不過 EGP 已經是歷史的產物,可以不用理會了。
  • ? – 此 Route 是通過 redistribute 得來的

Origin 也是選擇最佳路徑的一個方法,在稍後會詳細說明。

Next-hop-self 指令

現在我們試試另一個例子:

bgp

R1 與 R2 是 eBGP,R2 與 R3 是 iBGP,R3 與 R4 是 eBGP。假設全部 IP 及 Peers 已經設定好,我們在 R1 設定 Loopback Interface 然後把它發佈出去。看看 R2 的 BGP database,有 “>” 標記表示 BGP 選好了用 Next Hop IP 192.168.12.1 來到達 1.1.1.0/24,Route Table 也似乎沒問題。

R2#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.12.1             0             0 65100 i
R2#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [20/0] via 192.168.12.1, 00:07:37
C    192.168.23.0/24 is directly connected, Ethernet0/1

再看看 R3 的 BGP Table,天啊!為什麼沒有選到 best path,Route table 也沒有加入 1.1.1.0 這條 Route,為什麼?

R3#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i1.1.1.0/24       192.168.12.1             0    100      0 65100 i
R3#show ip route

< Output Omitted>

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C    192.168.23.0/24 is directly connected, Ethernet0/1

大家還記得嗎?在上一部份介紹 Next Hop 這個欄位時,我們說過 Next Hop IP 必需要「可以到達」的才能把該條 Route 加入 Route Table,由於對 R3 來說,192.168.12.1 並沒有路徑可以到達 (即 Route Table 裡找不到 192.168.12.1 的 Route) ,所以 R3 不會把這條 Route 加入 Route Table。至於為什麽 Next Hop IP 會是 192.168.12.1 而不是 R2 的 192.168.23.2 呢?這是因為當 BGP 把一條 Route 用 iBGP 發佈給 Neighbor 時,Default 是不會更改其 Next Hop 的 IP ,這點我們需要緊記!怎麽解決呢?有兩個辦法:

第一個方法是加入一條 Static Route (或用其他 IGP) 讓 R3 學懂怎樣去 192.168.12.1。加了之後便發現 BGP Route 成功得到了:

R3(config)#ip route 192.168.12.1 255.255.255.255 ethernet 0/1
R3(config)#do sh ip route

< Output Omitted>

     192.168.12.0/32 is subnetted, 1 subnets
S       192.168.12.1 is directly connected, Ethernet0/1      
     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [200/0] via 192.168.12.1, 00:00:04 
C    192.168.23.0/24 is directly connected, Ethernet0/1
C    192.168.34.0/24 is directly connected, Ethernet0/0

另一個方法是使用 Next-hop-self 指令,迫使 R2 在發佈 Route 給 R3 時使用自己的 IP 作為 Next Hop IP。只要在 BGP config 中加入一句 neighbor <IP> next-hop-self  便可以。

router bgp 65200
 neighbor 192.168.12.1 remote-as 65100
 neighbor 192.168.23.3 remote-as 65200
 neighbor 192.168.23.3 next-hop-self

現在我們再看看 R3 的 BGP Table,Next Hop 變成 192.168.23.2 了,有 “>” 標記,證明 BGP 接受了這條為 Best Path,Route Table 亦成功加入這條 Route。

R3#show ip bgp

< Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i1.1.1.0/24       192.168.23.2             0    100      0 65100 i
R3#show ip route

< Output Omitted>

     1.0.0.0/24 is subnetted, 1 subnets
B       1.1.1.0 [200/0] via 192.168.23.2, 00:02:47 
C    192.168.23.0/24 is directly connected, Ethernet0/1
C    192.168.34.0/24 is directly connected, Ethernet0/0

Synchronization (同步)

有些情況,我們需要透過 IGP 作媒介來讓兩個或多個 iBGP Neighbor 連接,如圖 6 這個例子,AS65200 的 R2 和 R5 成為 iBGP Peers,然後我們想把 AS65100 的 Route 透過 AS65200 發佈到 AS65300,這時候我們需要注意同步的問題。我們試把著眼點放於 R5 上,當 BGP 的 Route,到達 R5 之後,由於 R5 開啓了 IGP,所以 R5 把 Route 發佈去 AS65300 之前會先檢查同步的條件有沒有達成,如果條件達成就發出去,相反就不會發出去。

所謂達到同步,就是說從 iBGP 收回來的 Route,在 Routing Table 中必需要有相同的 IGP Route 能夠到達。

例如:在 AS65100 發佈 1.1.1.0/24 到 R2,R2 收到後發佈到 R5,R5 會檢查 Route Table 中有沒有 IGP Route 能夠去到 1.1.1.0/24,如果有就是同步了。

bgp

就圖 6 的例子,我們可以看看 R2 和 R5 的設定。

hostname R2
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.0
!
router ospf 1
 network 2.2.2.0 0.0.0.255 area 0
 network 192.168.23.0 0.0.0.255 area 0
 network 192.168.24.0 0.0.0.255 area 0
!
router bgp 65200
 neighbor 5.5.5.5 remote-as 65200
 neighbor 5.5.5.5 update-source Loopback0
 neighbor 5.5.5.5 next-hop-self
 neighbor 192.168.12.1 remote-as 65100
hostname R5
!
interface Loopback0
 ip address 5.5.5.5 255.255.255.0
!
router ospf 1
 network 5.5.5.0 0.0.0.255 area 0
 network 192.168.35.0 0.0.0.255 area 0
 network 192.168.45.0 0.0.0.255 area 0
!
router bgp 65200
 neighbor 2.2.2.2 remote-as 65200
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 192.168.56.6 remote-as 65300

在 R2 確認有收到 1.1.1.0/24:

R2#show ip bgp 
<Output Omitted>
   Network          Next Hop            Metric LocPrf Weight Path 
*> 1.1.1.0/24       192.168.12.1             0             0 65100 i

R5 收到但沒有 “>” 標記,所以沒有發佈出去:

R5#show ip bgp 
<Output Omitted>
   Network          Next Hop            Metric LocPrf Weight Path 
* i1.1.1.0/24       2.2.2.2                  0    100      0 65100 i

為什麼沒有發佈呢?因為 IGP 不懂 1.1.1.0/24

R5#show ip route

<--Output Omitted-->

     2.0.0.0/32 is subnetted, 1 subnets
O       2.2.2.2 [110/21] via 192.168.45.4, 00:37:38, Ethernet0/1
                [110/21] via 192.168.35.3, 00:37:38, Ethernet0/0
C    192.168.45.0/24 is directly connected, Ethernet0/1
O    192.168.24.0/24 [110/20] via 192.168.45.4, 00:37:38, Ethernet0/1
     5.0.0.0/24 is subnetted, 1 subnets
C       5.5.5.0 is directly connected, Loopback0
C    192.168.56.0/24 is directly connected, Ethernet0/2
O    192.168.23.0/24 [110/20] via 192.168.35.3, 00:37:38, Ethernet0/0
C    192.168.35.0/24 is directly connected, Ethernet0/0

所以 R6 什麼也沒有:

R6#show ip bgp

R6#

有兩個辦法可以解決,第一個方法當然是把 IGP 同步,例如在 R2 把 BGP Route redistribute 到 OSPF 之中。

R2(config)#router ospf 1
R2(config-router)#redistribute bgp 65200 subnets

R5 有 best path 了。(留意 r 的意思是 RIB failure,不要擔心,這是因 iBGP (AD=200) 的 AD 不夠 OSPF (AD=110) 低,所以系統標了 r  (Route Table 不用這條 Route,但對 BGP 的發佈沒有影響)。

R5#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
r>i1.1.1.0/24       2.2.2.2                  0    100      0 65100 i

R6 收到 BGP Route 了。

R6#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.56.5                           0 65200 65100 i

那麽另一個解決辦法是什麼呢?就是乾脆把 Synchronization 關掉。只要在 BGP 設定中用 no synchronization 這個指令便可以。不過有一點需要留意的是:在某些 IOS 版本中,Synchronization default 是關掉的。

R2(config)#router bgp 65200
R2(config-router)#no synchronization
R5(config)#router bgp 65200
R5(config-router)#no synchronization

Route Reflector

再討論圖 6 的網絡,讀者有沒有想過為什麼要借助 OSPF 來當橋樑呢?如果把全部 Router 都用 iBGP 連起來不就可以了嗎?答案是可以的!不過現在又要宣佈 BGP 中一個重要的法則……

從 iBGP Peers 得到的 Route 不會發佈到另一個 iBGP Peers。

如果 AS65200 全部使用 iBGP 的話,R2 從 R1 那裡收到 1.1.1.0/24,並發佈到 R3 ,但 R3 不會把 Route 發給 R5。同樣地,R4 也不會發給 R5。解決方法之一是 R2 也和 R5 建立 iBGP 連線,除此之外,為了整個 AS 裡 的 Route 可以互通,我們應該把所有 Router 對應其他 Router 都建立 iBGP 連線,即所謂的 Fully Mesh。但 Fully Mesh 隨著 Router 的數量增加,連線數目也會幾何級數上升,另一個較好的方法是使用 neighbor <ip> route-reflector-client。Route Reflector 指令可以讓 BGP Router 把從 iBGP Peers 得到的 Route 發佈到另一個 iBGP Peers。設定方法如下:

hostname R3
!
router bgp 65200
 neighbor 192.168.23.2 remote-as 65200
 neighbor 192.168.23.2 route-reflector-client
 neighbor 192.168.35.5 remote-as 65200
!

Confederation

有時遇到較複雜的網路,在同一個 AS 裡面有很多隻 BGP Router 的話,用 Route Reflector 來建 iBGP Peers 仍然令人相當頭痛,這時候我們還有一殺著,就是使用 Confederation。Confederation 可以把一個 AS 分成多個 Sub-AS,只需要每一個 Sub-AS 裡的 BGP Router 要 Fully Mesh,設定簡單之餘又方便管理。而其他 AS 的 Router 亦不會看到這些 Sub-AS,試看以下例子,圖中把 AS 65000 分成兩個 Sub-AS 10 和 20,留意 AS 65100 的 R7 會和 AS 65000 的 R1 成 eBGP Peers,而不是 AS 10,同樣地, AS 65200 的 R6 會和 AS 65000 的 R5 成 eBGP Peers,而不是 AS 20。

bgp

來看看 R1 的 BGP 設定,基本上分別不大,只是多了以下兩個 Command:

  • bgp confederation identifier <AS Number> – 宣告這個 Sub-AS 包含在那一個主 AS 裡
  • bgp confederation peers <AS Number> – 還有那些相鄰的 Sub-AS 呢?
hostname R1
!
router bgp 10
 bgp confederation identifier 65000  
 bgp confederation peers 20  
 neighbor 192.168.12.2 remote-as 10
 neighbor 192.168.13.3 remote-as 10
 neighbor 192.168.14.4 remote-as 20
 neighbor 192.168.17.7 remote-as 65100

假設全部 Router 已經設定好 BGP Peers,我們試試在 R6 用 Network 指令去發佈 6.6.6.0/24 的網段。到 R7 看看 BGP Table,AS Path 並沒有顯示 AS 10 和 20 喔!

R7#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 6.6.6.0/24       192.168.17.1                           0 65000 65200 i

Best Path (最佳路徑) 的選擇

說了這麽久,終於進入我們的主菜,就是 BGP Best Path 的選擇。什麼時候需要選擇呢?當一隻 Router 收到很多條關於同一個 destination 的 Route 時,一般情況下 BGP 只會選擇一條最好的來使用。而選擇的方法就是透過比較每條 BGP Route 當中不同的 Attribute (屬性),現在介紹這些屬性和比較的順序。

0. 基本條件

在正式比較之前,BGP 會先檢查 Route 的 3 個屬性,附合這 3 個條件的 Route 才可進入比較程序,不附合的 Route 在這刻已經被即時淘汰了。

  1. Next-hop Address 所在 Network 必需為可到達,即存在於 Route Table 之中。
  2. As-path 不存在 Router 自身的 AS Number,這是為了防止 Loop 發生。
  3. 如 BGP 有開啟 Synchronization,則必需附合,詳情請看本篇 Synchronization 部份。

1. Weight (選較大的)

第一個比較項目是比 Weight,Weight 是本地 Router 對自己的 Peers 的權重值,誰的 Weight 大就用它給我的那條 Route。請注意 Weight 是 Cisco 獨有的 Attribute,其他牌子是沒有的。用以下例子去測試一下,假設所有 IP address,BGP Peers 都設定好,R1 與 R2 和 R1 與 R3 之間的 iBGP Peers 用了 Next-hop-self 指令,R1 執行了 Route Reflector,R6 把 Loopback 0 的 6.6.6.0/24 用 Network 指令發佈出來。

bgp

在 R1 看看 BGP Table,得知現時選擇了 192.168.12.2 為 Best Path,兩條 Route 的 Weight 是 0,因為在沒有設定的情況下,Weight default 設定是 0 ,由於 Weight 相等,BGP 用了其他方法去決定 Next Hop 192.168.12.2 是 Best Path。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.13.3             0    100      0 65100 65300 i
*>i                 192.168.12.2             0    100      0 65200 65300 i

有幾個方法可以更改 Weight 的設定,其中一個最簡單的方法就是在 R1 使用 neighbor <ip> weight <default weight> 指令,然後用 clear ip bgp * 去 reset 所有 Peers:

R1(config)#router bgp 65000
R1(config-router)#neighbor 192.168.13.3 weight 1000 
R1(config-router)#end
R1#
*Mar  1 00:21:19.123: %SYS-5-CONFIG_I: Configured from console by console
R1#clear ip bgp *
R1#
*Mar  1 00:24:05.375: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Down User reset
*Mar  1 00:24:05.379: %BGP-5-ADJCHANGE: neighbor 192.168.13.3 Down User reset
*Mar  1 00:24:06.079: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Up
R1#
*Mar  1 00:24:06.587: %BGP-5-ADJCHANGE: neighbor 192.168.13.3 Up

這時再 show ip bgp,Next Hop 192.168.13.3 這條 Route 的 Weight 值變成 1000 了,基於這條 Route Weight 1000 比較大,所以選擇了這條做 Best Path。亦只有這條 Route 會被 R1 發佈到其他 Peers。

R1#show ip bgp

<Output Omitted>

Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2          0    100      0 65200 65300 i
*>i                 192.168.13.3          0    100   1000 65100 65300 i

留意 Weight 只是一個用於 Local Router 的 Attribute,所以 Weight 值並不會跟隨 Route 發佈到另一個 Router。這時看看 R2 的 BGP Table,所有 Weight 仍然是 0,R2 選擇自己的 Best Path。

R2#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.13.3             0    100      0 65100 65300 i
*>                  192.168.24.4                           0 65200 65300 i

2. Local Preference (選較大的)

如果因為 Weight 相同而沒法選出 Best Path,BGP 會用 Local Preference 來判斷,一條 Route 的Local Preference 較大的話,它就是整個 AS 對於該個 Destination 的出口。接著,我們再使用相同的例子,但先在 R1 把兩條 Route 的 Weight 調至一樣。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    100   1000 65200 65300 i
* i                 192.168.13.3             0    100   1000 65100 65300 i

這樣第一條 Route 又比選為 Best Path 了。慢著!我們還未作 Local Preference 的調校工作,為什麽會是 100 呢?這是因為凡是透過 iBGP Peers 傳來的 Route,Local Preference default 值都是 100。為了證明較大的被選中,我們嘗試在 R3 把從 R5 傳來 6.6.6.0/24 這條 Route 的 Local Preference 設定成 500,看看會有什麼變化。我們可以使用 Route Map 來完成。

R3(config)#router bgp 65000
R3(config-router)#neighbor 192.168.35.5 route-map TuningLocPrf in
R3(config-router)#exit
R3(config)#ip access-list extended RouteMatch
R3(config-ext-nacl)#permit ip 6.6.6.0 0.0.0.255 any
R3(config-ext-nacl)#route-map TuningLocPrf permit 10
R3(config-route-map)#match ip address RouteMatch
R3(config-route-map)#set local-preference 500
R3(config-route-map)#end
R3#clear ip bgp *

由於 Local Preference 是整個 AS 的事,所以這個 Attribute 會傳送到 iBGP Peers。看看 R1 的 BGP Table,可以看到 Local Preference 已經變成 500 了,順理成章地,R1 把這條選為 Best Path。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.13.3             0    500   1000 65100 65300 i
* i                 192.168.12.2             0    100   1000 65200 65300 i

3. Locally Originated (本機原生)

即由本機用指令 Network、Aggregate-address 生成或由本機把 IGP Route Redistribute 到 BGP 的 Route,較從其他 Neighbor 收回來的 Route 好。

4. AS Path (選較短的)

AS Path 是到達目的地網段所要經過的 AS,BGP 認為 AS Path 越短越好,如果以上兩點都無法分出勝負,BGP 就會選 AS Path 較短的那條 Route 為 Best Path。以同一例子來測試,不過我們先把 R1 的兩條 Route Local Preference 值調整到一樣。

R1#sh ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65300 i
* i                 192.168.13.3             0    500   1000 65100 65300 i

現時使用了第一條 Route 為 Best Path,如果把第一條的 AS Path 增長,那麽第二條 Route 應該可以成為 Best Path。如果我們不想大費周章去改變網絡的 Topology,那怎樣可以簡單地改動 AS Path 來測試呢?我們可以使用 Route Map 裡面的 Prepend。Prepend 可以在 AS Path 很犯規地加入一些 AS Number,讓它變得較長,不過此方法只可用於 eBGP Peers 傳來的 Route,iBGP Peers 傳出的是不能修改 AS Path 的。因此,為了延長第一條 Route 的 AS Path,我們可以走到 R4 改設定,實例如下:

R4(config)#router bgp 65200
R4(config-router)#neighbor 192.168.24.2 route-map TuningAsPath out
R4(config-router)#exit
R4(config)#ip prefix-list MatchNetwork seq 5 permit 6.6.6.0/24
R4(config)#route-map TuningAsPath
R4(config-route-map)#match ip address prefix-list MatchNetwork
R4(config-route-map)#set as-path prepend 65200
R4(config-route-map)#end
R4#clear ip bgp *

為什麼是 Prepend 65200 呢?我們目標只想把 AS Path 延長,AS Number 是什麼都沒有關係,不過為了防止有 Routing Loop 出現,我們通常都會使用 AS Path 最前面的一個 AS Number 作為 Prepend 的 AS,所以就用了 65200。現在看看 R1 的 BGP Table,由於第二條 Route 的 AS Path 較短,所以被選定為 Best Path 了。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65200 65300 i
*>i                 192.168.13.3             0    500   1000 65100 65300 i
R1#

5. Origin Type (選較小的)

之前曾經介紹過 Origin 有三個值,i , e 和 ? ,e 已經很少會用到了,因此只需學習 i 和 ?,i 表示該 Route 的來源是 IGP、使用 Network 指令或 Aggregate-address 指令,? 表示該 Route 是通過 redistribute 得來的。要測試這個 Attribute ,首先我們得把 AS Path 長度調至一樣,如下圖:

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65300 i
* i                 192.168.13.3             0    500   1000 65100 65300 i

現在嘗試把第一條 Route 的 Origin 改成 ? ,看看能否把 Best Path 改變。要怎樣改呢?我們可以在 R4 加入一條指向 6.6.6.0/24 的 Static Route,然後把它 Redistribute 到 BGP 中。

R4(config)#ip route 6.6.6.0 255.255.255.0 null 0
R4(config)#router bgp 65200
R4(config-router)#redistribute static

回到 R1 看 BGP Table,Origin 變成 ?,但由於 R4 的設定改變了 AS Path,我們必需 Prepend AS Path,來證明在 AS Path 長度相同的情況下,BGP 比較喜歡 i 多於 ? 。Prepend AS Path 的辦法在上一部份已說明過,在此不重覆描述。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65200 ?
* i                 192.168.13.3             0    500   1000 65100 65300 i

Prepend 好 AS Path 之後,兩條 Route AS Path 長度一樣,BGP Table 果然選了 Origin i 的第二條作 Best Path。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2             0    500   1000 65200 65200 ? *>i                 192.168.13.3             0    500   1000 65100 65300 i

6. MED (選較小的)

故事尚未完結,如果去到 Origin Type 也相同,下一個要比較的就是 MED (Metric)。MED 就像 IGP 裡的 Metric,是一個可以傳到另一個 AS 的 Attribute,Metric 較少的 Route 會被選為 Best Path。不過要注意的是,MED 必需要在 AS Path 中第一個 AS Number 相同的時候才會作出比較,除非使用了 bgp always compare MED,則不設此限。為了做這個測試,我們在圖 7 的 Topology 中把 AS 65200 改成 65100。

bgp

另外還故意把 Weight, LocPrf, AS Path, Origin 都設定成相同的值,現時使用第一條 Route 作為 Best Path,如果把第一條 Route 的 Metric 增大,理論上它就會失去 Best Path 了。

R1#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*>i6.6.6.0/24       192.168.12.2             0    500   1000 65100 65300 i
* i                 192.168.13.3             0    500   1000 65100 65300 i

嘗試在 R4 用 Route Map 把 Metric 增加至 100,看看 Best Path 是否會改變。

R4(config)#router bgp 65100
R4(config-router)#neighbor 192.168.24.2 route-map TuningMetric out
R4(config-router)#exit
R4(config)#ip prefix-list MatchNetwork seq 5 permit 6.6.6.0/24
R4(config)#route-map TuningAsPath permit 10
R4(config-route-map)#match ip address prefix-list MatchNetwork
R4(config-route-map)#set metric 100
R4(config-route-map)#end
R4#clear ip bgp *

由於第二條 Route Metric 比較小,現在成為了 Best Path。值得留意的是,這個 AS 當中的 R2 和 R3 的 Metric 同樣改變了,因為 Metric 是傳到整個 AS 當中的。

R1#sh ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
* i6.6.6.0/24       192.168.12.2           100    500   1000 65100 65300 i
*>i                 192.168.13.3             0    500   1000 65100 65300 i
R2#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 6.6.6.0/24       192.168.24.4           100    500      0 65100 65300 i
* i                 192.168.13.3             0    500      0 65100 65300 i
R3#show ip bgp

<Output Omitted>

   Network          Next Hop            Metric LocPrf Weight Path
*> 6.6.6.0/24       192.168.35.5                           0 65100 65300 i
* i                 192.168.12.2           100    500      0 65100 65300 i

預設情況下,如 Route 沒有提供 MED 值則設為 0,如使用 bgp bestpath med missing-as-worst 則預設值改為最大值,即 4,294,967,294。

7. eBGP vs iBGP

如果以上全部相同,eBGP 的路徑會優於 iBGP。就算 Best Path 在這個階段被選出,BGP 仍會跳到 9. Multipath 檢查是否需要做 Load Sharing。由此可見,如希望做 Multipath 設定,之前所比較的 1-6 項 Attribute 必需全部相同。

8. Next-hop 的 IGP Metric (選較小的)

如此時未能選出 best path,則比較到達 Next-hop 的 IGP Metric,較小的勝出。就算 Best Path 在這個階段被選出,BGP 仍會跳到 9. Multipath 檢查是否需要做 Load Sharing。

9. Multipath

BGP 所支緩的是 Unbalanced Load Sharing,即可以參考 Interface 的 Bandwidth 設定去分配 Traffic。現在使用以下網絡作例子,進行 Multipath 設定。

bgp

R5 一共有 3 條 Path 到達 172.16.4.0/24。在預設情況下,Multipath 設定值為 1,即不會進行 Load Balancing。

R5#show ip protocols 
*** IP Routing is NSF aware ***

Routing Protocol is "bgp 65125"
  Outgoing update filter list for all interfaces is not set
  Incoming update filter list for all interfaces is not set
  IGP synchronization is disabled
  Automatic route summarization is disabled
  Neighbor(s):
    Address          FiltIn FiltOut DistIn DistOut Weight RouteMap
    192.168.15.1                                         
    192.168.25.2                                         
    192.168.35.3                                         
  Maximum path: 1
  Routing Information Sources:
    Gateway         Distance      Last Update
    192.168.35.3          20      00:02:10
  Distance: external 20 internal 200 local 200

所以根據概定程序選了 Next-hop 192.168.25.2 為 Best Path。

R5#show ip bgp  
BGP table version is 5, local router ID is 192.168.35.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *   172.16.4.0/24    192.168.35.3                           0 65001 i
 *                    192.168.15.1                           0 65001 i
 *>                   192.168.25.2                           0 65001 i

現在把 Maximum Path 加至 3。

R5(config)#router bgp 65005
R5(config-router)#maximum-paths 3

於是所有 3 條 BGP Route 也入選成為 Multipath,留意 Best Path 仍然存在,Router 只會把 Best Path 發佈給其他 Neighbor。

R5#show ip bgp 
BGP table version is 6, local router ID is 192.168.35.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *m  172.16.4.0/24    192.168.35.3                           0 65001 i
 *m                   192.168.15.1                           0 65001 i
 *>                   192.168.25.2                           0 65001 i

show ip route 可以查看現時的 Traffic 分佈,可見現時分佈是 1:1:1。

R5#show ip route 172.16.4.0
Routing entry for 172.16.4.0/24
  Known via "bgp 65005", distance 20, metric 0
  Tag 65001, type external
  Last update from 192.168.25.2 00:05:20 ago
  Routing Descriptor Blocks:
  * 192.168.35.3, from 192.168.35.3, 00:05:20 ago
      Route metric is 0, traffic share count is 1
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.25.2, from 192.168.25.2, 00:05:20 ago
      Route metric is 0, traffic share count is 1
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.15.1, from 192.168.15.1, 00:05:20 ago
      Route metric is 0, traffic share count is 1
      AS Hops 1
      Route tag 65001
      MPLS label: none

由於 R5 > R3 這條 Path 速度較慢,平均分佈 Traffic 並非好辦法。我們可以用 bgp dmzlink-bw 要求 BGP 按照 Interface 的 Bandwidth 去分配 Traffic。

R5(config-router)#bgp dmzlink-bw 
R5(config-router)#neighbor 192.168.15.1 dmzlink-bw 
R5(config-router)#neighbor 192.168.25.2 dmzlink-bw 
R5(config-router)#neighbor 192.168.35.3 dmzlink-bw

新的 Traffic 分佈為 37:240:240。

R5#show ip route 172.16.4.0
Routing entry for 172.16.4.0/24
  Known via "bgp 65005", distance 20, metric 0
  Tag 65001, type external
  Last update from 192.168.25.2 00:00:19 ago
  Routing Descriptor Blocks:
  * 192.168.35.3, from 192.168.35.3, 00:00:19 ago
      Route metric is 0, traffic share count is 37
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.25.2, from 192.168.25.2, 00:00:19 ago
      Route metric is 0, traffic share count is 240
      AS Hops 1
      Route tag 65001
      MPLS label: none
    192.168.15.1, from 192.168.15.1, 00:00:19 ago
      Route metric is 0, traffic share count is 240
      AS Hops 1
      Route tag 65001
      MPLS label: none

以上只是部份比較常用的 Best Path 機制,如果希望了解更多,你可以到 這裡 查看更詳細的教學。

Community

Community 是一個 BGP 的 Attribute,作用就好像在發佈的 Prefix 上加一個 Label,當其他 BGP Router 收到這條 Prefix 時,就可以檢測這個 Label 的值來做某些動作,我們用以下的網絡做一個實驗:

bgp

假設所有 IP 和 BGP 都已經設定好,R1 把 1.1.1.0 / 24 發佈出去,我們先看看 R2 的 BGP Table 裡關於 1.1.1.0 Prefix 的資料:

R2#show ip bgp 1.1.1.0
BGP routing table entry for 1.1.1.0/24, version 2
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Not advertised to any peer
  65000
    192.168.12.1 from 192.168.12.1 (192.168.12.1)
      Origin IGP, metric 0, localpref 100, valid, external, best

現在我們嘗試在 R1 發佈 1.1.1.0 時貼上一個 Community,可以用 Route Map 簡單完成,但要留意的是,BGP 預設是不會傳送 Community 這個 Attribute,需要用 neighbor <IP> send-community 這個指令去啟動。

hostname R1
!
router bgp 65000
 network 1.1.1.0 mask 255.255.255.0
 neighbor 192.168.12.2 remote-as 65001
 neighbor 192.168.12.2 send-community  
 neighbor 192.168.12.2 route-map SetComm out
!
access-list 1 permit 1.1.1.0 0.0.0.255
!
route-map SetComm permit 10
 match ip address 1
 set community 1000

現在看看 R2 的 Prefix 1.1.1.0,發現多了一行 Community 顯示值為 1000。

R2#show ip bgp 1.1.1.0
BGP routing table entry for 1.1.1.0/24, version 2
Paths: (1 available, best #1, table Default-IP-Routing-Table)
Flag: 0x820
  Not advertised to any peer
  65000
    192.168.12.1 from 192.168.12.1 (192.168.12.1)
      Origin IGP, metric 0, localpref 100, valid, external, best
      Community: 1000

於是,我們就可以在 R2 使用 Community List 和 Route Map 配合一起做些事情。例如我們想把 Community 是 1000 的 prefix 的 Local Preference 改成 500。

hostname R2
!
router bgp 65001
 neighbor 192.168.12.1 remote-as 65000
 neighbor 192.168.12.1 route-map SetLocal in
 no auto-summary
!
ip community-list 1 permit 1000 
!
route-map SetLocal permit 10
 match community 1
 set local-preference 500
R2#show ip bgp
BGP table version is 2, local router ID is 192.168.12.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24       192.168.12.1             0    500      0 65000 i

另外,利用 Community 也能做一些 Route Filtering 的動作。Community 的值除了可以自己設定外,其實系統有 4 個預設值可以使用,分別是:no-advertise,local-AS,no-export 和 internet,4 個預設值的作用如下:

Keywords 功能
no-advertise 告訴收到這條 Prefix 的 Router 不要將這條 Prefix 發佈出去
local-AS 告訴收到這條 Prefix 的 Router 這條 Prefix 只能發佈給 Confederation 中的同一個 AS
no-export 告訴收到這條 Prefix 的 Router 不要將這條 Router 發佈給其他 AS
internet 告訴收到這條 Prefix 的 Router 這條 Prefix 可以自由發佈

現在用以下網絡來測試不同的 Community。

bgp

首先在 R1 用 Route Map 設定好不同 Prefix 的 Community。

hostname R1
!
router bgp 10
 bgp confederation identifier 65000
 bgp confederation peers 20
 network 1.1.1.0 mask 255.255.255.0
 network 2.2.2.0 mask 255.255.255.0
 network 3.3.3.0 mask 255.255.255.0
 network 4.4.4.0 mask 255.255.255.0
 neighbor 192.168.12.2 remote-as 10
 neighbor 192.168.12.2 send-community
 neighbor 192.168.12.2 route-map TuneComm out
!
access-list 1 permit 1.1.1.0 0.0.0.255
access-list 2 permit 2.2.2.0 0.0.0.255
access-list 3 permit 3.3.3.0 0.0.0.255
access-list 4 permit 4.4.4.0 0.0.0.255
!
route-map TuneComm permit 10
 match ip address 1
 set community no-advertise 
!
route-map TuneComm permit 20
 match ip address 2
 set community local-AS 
!
route-map TuneComm permit 30
 match ip address 3
 set community no-export 
!
route-map TuneComm permit 40
 match ip address 4
 set community internet

到 R2 看看各 Prefix 的 Community:

R2#show ip bgp 1.1.1.0
BGP routing table entry for 1.1.1.0/24, version 2
Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised to any peer)
  Not advertised to any peer
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: no-advertise 
R2#show ip bgp 2.2.2.0
BGP routing table entry for 2.2.2.0/24, version 3
Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised outside local AS)
  Advertised to update-groups:
     1
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: local-AS 
R2#show ip bgp 3.3.3.0
BGP routing table entry for 3.3.3.0/24, version 4
Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised to EBGP peer)
  Advertised to update-groups:
     1
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: no-export 
R2#show ip bgp 4.4.4.0
BGP routing table entry for 4.4.4.0/24, version 5
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Advertised to update-groups:
     1
  Local, (Received from a RR-client)
    192.168.12.1 from 192.168.12.1 (4.4.4.4)
      Origin IGP, metric 0, localpref 100, valid, confed-internal, best
      Community: internet

在 R3 查看 BGP Table,發現沒有收到 1.1.1.0 / 24,因為 R2 看見這條 Prefix 是 no-advertise 因此不發給 R3。

R3#show ip bgp
BGP table version is 4, local router ID is 192.168.34.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*>i2.2.2.0/24       192.168.12.1             0    100      0 i
*>i3.3.3.0/24       192.168.12.1             0    100      0 i
*>i4.4.4.0/24       192.168.12.1             0    100      0 i

在 R4 查看 BGP Table,發現沒有收到 2.2.2.0 / 24,因為 R3 看見 Prefix 的 Community 是 local-AS,這條 Prefix 只能存在於 Confederation 的 Local AS 之中,R4 位於另一個 AS,因此 R3 不把這條 Prefix 發出去。

R4#show ip bgp
BGP table version is 3, local router ID is 192.168.45.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 3.3.3.0/24       192.168.34.3             0    100      0 (10) i
*> 4.4.4.0/24       192.168.34.3             0    100      0 (10) i

最後,在 R5 不會看到 3.3.3.0 / 24,因為這條 Prefix 的 Community 是 no-export,因此 R4 不會發給位於其他 AS 之內的 R5。至於 4.4.4.0 / 24 的 Community 是 internet 則沒有此限制。

R5#show ip bgp
BGP table version is 2, local router ID is 192.168.45.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 4.4.4.0/24       192.168.45.4                           0 65000 i

Aggregate-address

所有Routing Protocol 都提供 Summary 功能。在 BGP 裡面稱為 Aggregate Address,意思就是把多條 Route 組合成一條來發佈。由於每條 BGP Route 都涉及不同 Attribute 值,令 BGP 的 Summery Address 發佈變得複雜。

現在使用以下網絡作例子,R3 發佈 10.0.0.0/24 及 10.0.1.0/24,R1 及 R2 都收到這兩條 Route。

bgp

Aggregate-address 指令可以發佈 Summary,大前題是負責發佈的 Router 的 BGP Table 必需擁有此 Summary 內的最少一個 Subnet,不能無中生有。如在 R2 執行 Aggregate-address,R1 就會收到 Summary Route。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0
R1#show ip bgp              
BGP table version is 8, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/24      192.168.12.2             0    100      0 65023 1000 2000 i
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 i
 *>i 10.0.1.0/24      192.168.12.2             0    100      0 65023 2000 4000 i

在 R1 的 BGP Table 中,除了 /23 Summary Route 外,仍然收到 /24 Route,如想 R1 只收 /23 Summary Route,可在 Aggregate-address 加上 Summary-only 選項。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 summary-only
R1#show ip bgp              
BGP table version is 8, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 i

如想保留部份 Route,可用 Suppress-map,使用方法如下。

R2(config-router)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 as-set summary-only suppress-map SUPP
R2(config-router)#exit
R2(config)#ip prefix-list P1 seq 5 permit 10.0.0.0/24
R2(config)#route-map SUPP permit 10
R2(config-route-map)#match ip address prefix-list P1
R1#show ip bgp              
BGP table version is 8, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 i
 *>i 10.0.1.0/24      192.168.12.2             0    100      0

留意 Summary Route 失去了 AS Path 資訊,AS Path 是防止 Route Loop 的機制,建議在 Aggregate-address 增加 As-set 選項保留 AS Path 資訊。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 summary-only as-set
R1#show ip bgp      
BGP table version is 15, local router ID is 192.168.12.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 10.0.0.0/23      192.168.12.2             0    100      0 {65023,1000,3000,2000,4000} i

留意 As-set 除了保留 AS Path 資訊,也幫 Summary Route 繼承所有 Community 屬性。

R1#show ip bgp 10.0.0.0/23  
BGP routing table entry for 10.0.0.0/23, version 25
Paths: (1 available, best #1, table default, not advertised to EBGP peer)
  Not advertised to any peer
  Refresh Epoch 2
  {65023,1000,3000,2000,4000}, (aggregated by 65012 192.168.23.2)
    192.168.12.2 from 192.168.12.2 (192.168.23.2)
      Origin IGP, metric 0, localpref 100, valid, internal, best
      Community: no-export local-AS
      rx pathid: 0, tx pathid: 0x0

如不想繼承所有 Community 屬性,可以使用 Advertise-map 去幫 Summary Route 選擇繼承那一條 Route 的屬性。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 as-set advertise-map ADV
R2(config-router)#exit
R2(config)#ip prefix-list P1 seq 5 permit 10.0.0.0/24
R2(config)#route-map ADV permit 10
R2(config-route-map)#match ip address prefix-list P1

也可以使用 Attribute-map 直接去改變 Summary Route 的屬性。

R2(config)#router bgp 65012
R2(config-router)#aggregate-address 10.0.0.0 255.255.254.0 as-set attribute-map ATTR
R2(config-router)#exit
R2(config)#route-map ATTR permit 10
R2(config-route-map)#set metric 9999
R2(config-route-map)#set local-preference 999
R2(config-route-map)#set community internet
R1#show ip bgp 10.0.0.0/23
BGP routing table entry for 10.0.0.0/23, version 10
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  {65023,1000,3000,2000,4000}, (aggregated by 65012 192.168.23.2)
    192.168.12.2 from 192.168.12.2 (192.168.23.2)
      Origin IGP, metric 9999, localpref 999, valid, internal, best
      Community: internet
      rx pathid: 0, tx pathid: 0x0

筆者用 GNS3 測試 Advertise-map 和 Attribute-map 時需要 clear ip bgp * 才能生效,未知是否 bug。

Route Injection

Aggregate address 可以把 Route 組合成 Summary Route,Route Injection 剛好相反,可把 Summary 拆散成不同的 Route。但 Route Injection 設定比較嚴謹,必需用 Exist-map 確定 Summary Route 存在而且來自附合的 Source Address。以下例子把 10.0.0.0/24 拆成 10.0.0.0/25 和 10.0.0.128/25。

router bgp 60512
 bgp inject-map INJECT exist-map EXIST
!
ip prefix-list P24 permit 10.0.0.0/24
!
ip prefix-list P25 permit 10.0.0.0/25
ip prefix-list P25 permit 10.0.0.128/25
!
ip prefix-list PSOURCE permit 192.168.23.3/32
!
route-map EXTIST permit 10 // Exist-map 必需包含以下兩個 Match
 match ip address prefix-list P24 // 要分拆解的 Summary Route
 match ip route-source prefix-list PSOURCE // 由誰發佈這 Summary Route
!         
route-map INJECT permit 10
 set ip address prefix-list P25 // 要分拆成這些 Route,緊記這裡是 Set 不是 Match

Backdoor

Backdoor 的概念其實十分容易理解,請看以下這個網絡。網絡同時存在 EIGRP 和 BGP,假設 R2 把 2.2.2.0 / 24 透過 EIGRP 和 BGP 發佈。

bgp

由於 R1 同時執行了 EIGRP 和 BGP,它會分別收到 BGP 傳來的 2.2.2.0 / 24 和 EIGRP 傳來的 2.2.2.0 / 24,由於 EGIRP 的 AD 是 90,而 BGP 的 AD 是 20 (這是 EBGP),因此 R1 會選擇 R1>R3>R2 的路徑到達 R2,這顯然不是最好的路徑。

R1#show ip bgp
BGP table version is 6, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
r> 2.2.2.0/24       192.168.13.3                           0 65001 i
R1#
R1#show ip eigrp topology
IP-EIGRP Topology Table for AS(1)/ID(1.1.1.1)

Codes: P - Passive, A - Active, U - Update, Q - Query, R - Reply,
       r - reply Status, s - sia Status

P 2.2.2.0/24, 1 successors, FD is 409600
        via 192.168.12.2 (409600/128256), Ethernet0/0
P 192.168.12.0/24, 1 successors, FD is 281600
        via Connected, Ethernet0/0
R1#
R1#show ip route | begin Gateway
Gateway of last resort is not set

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback0
C    192.168.13.0/24 is directly connected, Ethernet0/1
     2.0.0.0/24 is subnetted, 1 subnets
B       2.2.2.0 [20/0] via 192.168.13.3, 00:00:02

要解決這個問題,除了改 AD 之外,我們還可以在 R1 的 BGP 設定 backdoor,告訴 R1 BGP 只用作「後備路徑」,這樣 R1 便會優先使用 EIGRP 的 Route,設定方法如下。

R1(config)#router bgp 65000
R1(config-router)#network 2.2.2.0 mask 255.255.255.0 backdoor 
R1(config-router)#end
R1#show ip route | begin Gateway
Gateway of last resort is not set

C    192.168.12.0/24 is directly connected, Ethernet0/0
     1.0.0.0/24 is subnetted, 1 subnets
C       1.1.1.0 is directly connected, Loopback0
C    192.168.13.0/24 is directly connected, Ethernet0/1
     2.0.0.0/24 is subnetted, 1 subnets
D       2.2.2.0 [90/409600] via 192.168.12.2, 00:00:22, Ethernet0/0

Dampening

我們都知道一個 BGP Update 可以改變世界!由於 Route 不穩定而產生的 Update 可能會影響地球上其他 BGP Router 的路徑選擇。Dampening 設定可以容忍 Route 在短時間內的迅速改變從而減少不必要的 BGP Update,要了解 Dampening,請先用 bgp dampeing 啟動 Dampering,然後用 show ip bgp dampening parameters 看看預設的參數。

R1(config)#router bgp 65001
R1(config-router)#bgp dampening 
R1(config-router)#exit
R1#show ip bgp dampening parameters 

 dampening 15 750 2000 60 (DEFAULT)
  Half-life time      : 15 mins       Decay Time       : 2320 secs
  Max suppress penalty: 12000         Max suppress time: 60 mins
  Suppress penalty    :  2000         Reuse penalty    : 750

現在解釋每一個參數的意思。

Suppress Penalty

話說 Dampening 設定一旦被啟動後,Route 的狀態改變會讓該 Route 的 Penalty 值提升,Update/Withdraw 會讓 Penalty 值增加 1000,而 Attribute 改變則會增加 500。如 Route 的 Penalty 值大於 Suppress Penalty 值則會觸發 Suppress,即 BGP Router 認為此 Route 不穩定暫時不會發佈給其他 Router。

Max Suppress Penalty

然而 Penalty 值並不會無限量增加下去,Max Suppress Penalty 為 Penalty 的最大值,預設為 12000。

Half-life Time

Route 的 Penalty 值又會随著時間慢慢下調,預設每 15 分鐘就會減去一半。由此可見,如 Route 開始穩定而沒有再發生狀態改變,Penalty 值必然慢慢減少。

Reuse Penalty

當 Penalty 值減至小於 Reuse Penalty,BGP Router 覺得這條 Route 終於穩定下來了,又會開始向外發佈這條 Route。

Max Suppress Time

Max Suppress Time 是一條 Route 被 Suppress 的最長時間,預設為 60 分鐘。即是說 Route 由被 Suppress 開始算起如果過了 60 分鐘,無論 Penalty 是多少都必需被釋放。

我們可以使用以下指令改變 Dampening 的幾個參數,bgp dampening <Half-life> <Reuse Penalty> <Suppress Penalty> <Max Suppress Time>,Max Suppress Penalty 會被自動計算出來。

R1(config)#router bgp 65001
R1(config-router)#bgp dampening 10 1000 2000 30
R1(config-router)#exit
R1#show ip bgp dampening parameters 

 dampening 10 1000 2000 30
  Half-life time      : 10 mins       Decay Time       : 1200 secs
  Max suppress penalty:  8000         Max suppress time: 30 mins
  Suppress penalty    :  2000         Reuse penalty    : 1000

相關主題

發佈留言

2014-07-24

Posted In: Layer 3 網絡技術, menu-tall-3-zh-hant

Leave a Comment