BGP 的工作原理

今天我們來看看BGP協定。 我們不會很長時間談論它的原因以及為什麼它被用作唯一的協議。 關於這個主題有很多信息,例如 這裡.

那什麼是BGP呢? BGP是一種動態路由協議,也是唯一的EGP(外部網關協定)協定。 該協定用於在 Internet 上建置路由。 讓我們看看如何在兩個 BGP 路由器之間建立鄰居。

BGP 的工作原理
考慮 Router1 和 Router3 之間的鄰居。 讓我們使用以下命令來配置它們:

router bgp 10
  network 192.168.12.0
  network 192.168.13.0
  neighbor 192.168.13.3 remote-as 10

router bgp 10
  network 192.168.13.0
  network 192.168.24.0
  neighbor 192.168.13.1 remote-as 10

單一自治系統內的鄰居是AS 10。在路由器(例如Router1)輸入資訊後,該路由器會嘗試與Router3 建立鄰接關係。 什麼也沒發生時的初始狀態稱為 空閒。 一旦在 Router1 上配置了 bgp,它將開始偵聽 TCP 連接埠 179 - 它將進入狀態 連結,當它嘗試與 Router3 開啟會話時,它將進入狀態 活性.

Router1和Router3之間建立會話後,會互動Open訊息。 當Router1發送此訊息時,將呼叫此狀態 打開發送。 當它收到來自Router3的Open訊息時,它會進入狀態 打開確認。 讓我們仔細看看 Open 訊息:

BGP 的工作原理
該訊息傳達有關路由器使用的 BGP 協定本身的訊息。 透過交換 Open 訊息,Router1 和 Router3 會相互傳達有關其設定的訊息。 傳遞以下參數:

  • 版本:這包括路由器正在使用的 BGP 版本。 BGP 的目前版本是 RFC 4 中所述的版本 4271。兩個 BGP 路由器將嘗試協商相容的版本,當不符時,將不會有 BGP 會話。
  • 我的AS:這包括 BGP 路由器的 AS 編號,路由器必須就 AS 編號達成一致,並且還定義它們是否將執行 iBGP 還是 eBGP。
  • 保持時間:如果 BGP 在保持時間內沒有收到來自另一端的任何 keepalive 或更新訊息,那麼它將聲明另一端“死亡”,並將拆除 BGP 會話。 預設情況下,Cisco IOS 路由器上的保持時間設定為 180 秒,每 60 秒發送一次保活訊息。 兩個路由器必須就保持時間達成一致,否則不會有 BGP 會話。
  • BGP 標識符:這是本地 BGP 路由器 ID,就像 OSPF 一樣選舉:
    • 使用透過 bgp router-id 指令手動設定的路由器 ID。
    • 使用環回介面上最大的 IP 位址。
    • 使用實體介面上最大的 IP 位址。
  • 可選參數:在這裡您將找到 BGP 路由器的一些選用功能。 新增此欄位是為了可以將新功能新增至 BGP,而無需建立新版本。您可能會在此處找到以下內容:
    • 支援 MP-BGP(多協定 BGP)。
    • 支援路由刷新。
    • 支援 4 位元組 AS 編號。

建立鄰裡必須符合以下條件:

  • 版本號。 目前版本是4。
  • AS編號必須與您設定的一致 鄰居 192.168.13.3 遠程-as 10.
  • Router ID 必須與鄰居不同。

如果任何參數不滿足這些條件,路由器將發送 三回目の翻訳結果 指示錯誤的訊息。 發送和接收Open訊息後,鄰居關係進入狀態 ESTABLISHED。 此後,路由器可以交換有關路由的資訊並使用 更新消息 消息。 這是 Router1 發送給 Router3 的 Update 訊息:

BGP 的工作原理

在這裡您可以看到 Router1 報告的網路和 Path 屬性,這些屬性類似於指標。 我們將更詳細地討論路徑屬性。 Keepalive 訊息也在 TCP 會話中發送。 預設情況下,它們每 60 秒傳輸一次。 這是一個保活定時器。 如果在保持定時器期間沒有收到保活訊息,則表示與鄰居的通訊遺失。 預設情況下,它等於 180 秒。

有用的標誌:

BGP 的工作原理

看起來我們已經弄清楚了路由器之間是如何傳遞訊息的,現在我們來嘗試BGP協定的邏輯。

將路由發佈到BGP表中,與IGP協定一樣,使用network指令,但操作邏輯不同。 如果在IGP中,在network指令中指定路由後,IGP會查看哪些介面屬於該子網路並將它們包含在其表中,那麼BGP中的network指令會檢視路由表並尋找 精確 與network指令中的路由相符。 如果找到,這些路由將出現在 BGP 表中。

在路由器目前的IP路由表中尋找與network指令的參數完全相符的路由; 如果IP路由存在,則將等效的NLRI放入本地BGP表中。

現在讓我們將 BGP 提升到所有剩餘的 AS,看看如何在一個 AS 內選擇路由。 BGP路由器收到鄰居寄來的路由後,開始選擇最佳路由。 在這裡,您需要了解可以有什麼類型的鄰居 - 內部和外部。 路由器是否透過設定了解設定的鄰居是內部鄰居還是外部鄰居? 如果在一個團隊中:

neighbor 192.168.13.3 remote-as 10 

其中remote-as參數指定AS,該AS是在router bgp 10指令中在路由器本身上設定的,來自內部AS的路由被認為是內部的,來自外部AS的路由被認為是外部的。 對於每一個,接收和發送的邏輯都不同。 考慮這個拓撲:

BGP 的工作原理

每個路由器都有一個配置 ip 的環回介面: xxxx 255.255.255.0 - 其中 x 是路由器編號。 在 Router9 上,我們有一個環回接口,位址為 - 9.9.9.9 255.255.255.0。 我們將透過 BGP 公佈它,看看它如何傳播。 該路由將會傳送到Router8和Router12。 從 Router8 出發,該路由將到達 Router6,但到達 Router5 時不會出現在路由表中。 同樣,在 Router12 上,該路由將出現在表中,但在 Router11 上,它也不會出現在表中。 讓我們試著弄清楚這一點。 讓我們考慮 Router9 向其鄰居傳輸哪些資料和參數,報告該路由。 下面的資料包將從 Router9 傳送到 Router8。

BGP 的工作原理
路由資訊由Path 屬性組成。

路徑屬性分為4類:

  1. 眾所周知的強制性 - 所有執行 BGP 的路由器都必須識別這些屬性。 必須存在於所有更新中。
  2. 知名全權委託 - 所有執行 BGP 的路由器都必須識別這些屬性。 它們可能存在於更新中,但它們的存在不是必需的。
  3. 可選及物 - 可能無法被所有 BGP 實作辨識。 如果路由器無法識別該屬性,則會將更新標記為部分更新並將其轉發給其鄰居,同時儲存無法識別的屬性。
  4. 可選的非傳遞性 - 可能無法被所有 BGP 實作辨識。 如果路由器無法識別該屬性,則該屬性在傳遞給鄰居時將被忽略並丟棄。

BGP 屬性範例:

  • 眾所周知的強制性:
    • 自治系統路徑
    • 下一跳
    • 起源

  • 知名全權委託:
    • 當地偏好
    • 原子聚合體
  • 可選及物:
    • 聚合器
    • 社區
  • 可選的非傳遞性:
    • 多出口鑑別器 (MED)
    • 發起者ID
    • 集群列表

在這種情況下,現在我們將對起源、下一跳、AS 路徑感興趣。 由於該路由是在Router8和Router9之間傳輸的,即在一個AS內部,因此被認為是內部路由,我們要關注Origin。

Origin 屬性 - 指示更新中的路由是如何取得的。 可能的屬性值:

  • 0 - IGP:原自治系統內收到的NLRI;
  • 1 - EGP:NLRI 使用外部網關協定 (EGP) 獲知。 BGP 的前身,未使用
  • 2 - 不完整:NLRI 是透過其他方式學習的

在我們的例子中,從資料包中可以看出,它等於0。當這條路由傳輸到Router12時,程式碼將具有代碼1。

下一步,下一跳。 下一跳屬性

  • 這是通往目標網路的路徑所經過的 eBGP 路由器的 IP 位址。
  • 當前綴發送到另一個AS時該屬性會發生變化。

在 iBGP 的情況下,即在一個 AS 內,下一跳將由獲悉或告知該路由的那個指示。 在我們的例子中,它將是 192.168.89.9。 但是當這條路由從Router8傳輸到Router6時,Router8會改變它並用自己的替換它。 下一跳將為 192.168.68.8。 這使我們得出兩條規則:

  1. 如果路由器將路由轉送到其內部鄰居,則不會變更下一跳參數。
  2. 如果路由器將路由傳輸到其外部鄰居,它會將 Next-hop 變更為該路由器傳輸的介面的 IP。

這就讓我們明白了第一個問題——為什麼Router5和Router11的路由表中不會有路由。 讓我們仔細看看。 這樣,Router6 收到了 9.9.9.0/24 路由​​的訊息,並成功將其新增至路由表:

Router6#show ip route bgp
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      9.0.0.0/24 is subnetted, 1 subnets
B        9.9.9.0 [20/0] via 192.168.68.8, 00:38:25<source>
Теперь Router6 передал маршрут Router5 и первому правилу Next-hop не изменил. То есть, Router5 должен добавить  <b>9.9.9.0 [20/0] via 192.168.68.8</b> , но у него нет маршрута до 192.168.68.8 и поэтому данный маршрут добавлен не будет, хотя информация о данном маршруте будет храниться в таблице BGP:

<source><b>Router5#show ip bgp
BGP table version is 1, local router ID is 5.5.5.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
 * i 9.9.9.0/24       192.168.68.8             0    100      0 45 i</b>

Router11-Router12之間也會發生同樣的情況。 為了避免這種情況,需要設定Router6或Router12在向其內部鄰居傳遞路由時,將其IP位址替換為下一跳。 這是使用以下命令完成的:

neighbor 192.168.56.5 next-hop-self

執行此命令後,Router6 將發送一條 Update 訊息,其中介面 Gi0/0 Router6 的 ip 將被指定為路由的下一跳 - 192.168.56.6,之後該路由將已包含在路由表中。

我們再進一步看看Router7和Router10上是否出現了這條路由。 它不會出現在路由表中,我們可能會認為問題與第一個帶有 Next-hop 參數的問題相同,但是如果我們查看 show ip bgp 命令的輸出,我們會看到即使下一跳錯誤,也沒有收到路由,這意味著該路由甚至沒有被傳輸。 這將導致我們存在另一個規則:

從內部鄰居接收的路由不會傳播到其他內部鄰居。

由於 Router5 收到了來自 Router6 的路由,因此不會將其轉送給其他內部鄰居。 為了進行傳輸,您需要配置該功能 路由反射器,或配置全連接鄰居關係(Full Mesh),即Router5-7每個人都會成為每個人的鄰居。 在這種情況下,我們將使用路由反射器。 在 Router5 上,您需要使用以下命令:

neighbor 192.168.57.7 route-reflector-client

當將路由傳遞給內部鄰居時,路由反射器會改變 BGP 的行為。 如果內部鄰居指定為 路由反射器客戶端,然後內部路由將被通告給這些客戶端。

Router7上沒有出現該路由? 也不要忘記下一跳。 經過這些操作後,路由也應該到達 Router7,但這種情況並未發生。 這給我們帶來了另一條規則:

下一跳規則僅適用於外部路由。 對於內部路由,不替換下一跳屬性。

我們遇到這樣一種情況,有必要建立一個使用靜態路由或 IGP 協定的環境來向路由器通報 AS 內的所有路由。 讓我們在 Router6 和 Router7 上註冊靜態路由,然後我們將在路由器表中獲得所需的路由。 在 AS 678 中,我們的做法略有不同 - 我們將在 Router192.168.112.0 上註冊 24/10 的靜態路由,在 Router192.168.110.0 上註冊 24/12 的靜態路由。 接下來,我們將建立Router10和Router12之間的鄰居關係。 我們還將配置 Router12 將其下一跳發送到 Router10:

neighbor 192.168.110.10 next-hop-self

結果是 Router10 將收到路由 9.9.9.0/24,該路由將從 Router7 和 Router12 收到。 讓我們看看 Router10 會做出什麼選擇:

Router10#show ip bgp
BGP table version is 3, local router ID is 6.6.6.6
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 9.9.9.0/24       192.168.112.12           0    100       0      45 i

                               192.168.107.7                                0     123 45 i  

我們可以看到,兩條路由和一個箭頭 (>) 表示選擇了經過 192.168.112.12 的路由。
讓我們看看路由選擇過程是如何運作的:

  1. 接收路由時的第一步是檢查其下一跳的可用性。 這就是為什麼當我們在Router5上收到一條沒有設定Next-hop-self的路由時,這條路由沒有被進一步處理。
  2. 接下來是權重參數。 此參數不是路徑屬性 (PA),不會在 BGP 訊息中傳送。 它在每個路由器上本地配置,僅用於操作路由器本身的路由選擇。 讓我們來看一個例子。 就在上面,您可以看到 Router10 透過 Router9.9.9.0 (24) 選擇了 12/192.168.112.12 的路由。 若要變更Wieght參數,可以使用route-map設定特定路由,或使用下列指令為其鄰居指派權重:
     neighbor 192.168.107.7 weight 200       

    現在,來自該鄰居的所有路由都將具有此權重。 讓我們看看經過此操作後路線的選擇如何變化:

    Router10#show bgp
    *Mar  2 11:58:13.956: %SYS-5-CONFIG_I: Configured from console by console
    BGP table version is 2, local router ID is 6.6.6.6
    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
     *>  9.9.9.0/24       192.168.107.7                        200      123 45 i
     * i                          192.168.112.12           0          100      0 45 i

    如您所見,現在選擇了通過 Router7 的路由,但這不會對其他路由器產生任何影響。

  3. 第三位是本地偏好。 該參數是眾所周知的任意屬性,這意味著它的存在是可選的。 此參數僅在一個AS內部有效,並且僅影響內部鄰居的路徑選擇。 這就是為什麼它僅在發送到內部鄰居的更新訊息中傳輸的原因。 它不存在於外部鄰居的更新訊息中。 因此,它被歸類為知名全權委託。 我們嘗試在 Router5 上應用它。 在 Router5 上,我們應該有兩個通往 9.9.9.0/24 的路由 - 一條通過 Router6,另一條通過 Router7。

    我們看:

    Router5#show bgp
    BGP table version is 2, local router ID is 5.5.5.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
     *>i 9.9.9.0/24       192.168.56.6             0    100      0 45 i

    但正如我們看到的一條路由通過 Router6。 經過 Router7 的路由在哪裡? 也許Router7也沒有? 我們看看吧:

    Router#show bgp
    BGP table version is 10, local router ID is 7.7.7.7
    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 9.9.9.0/24       192.168.56.6             0     100           0      45 i
    
                                  192.168.107.10                                  0     678 45 i 

    奇怪的是,一切似乎都很好。 為什麼沒有傳輸到Router5? 問題是 BGP 有規則:

    路由器僅傳輸它所使用的那些路由。

    Router7使用經過Router5的路由,因此經過Router10的路由不會被轉送。 讓我們回到本地偏好。 讓我們在 Router7 上設定本地首選項,看看 Router5 對此有何反應:

    route-map BGP permit 10
     match ip address 10
     set local-preference 250
    access-list 10 permit any
    router bgp 123
     neighbor 192.168.107.10 route-map BGP in</b>

    因此,我們創建了一個包含所有路由的路由映射,並告訴 Router7 在收到時將本地首選項參數更改為 250,預設值為 100。讓我們看看 Router5 上發生了什麼:

    Router5#show bgp
    BGP table version is 8, local router ID is 5.5.5.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
     *>i 9.9.9.0/24       192.168.57.7             0          250      0 678 45 i

    現在我們可以看到,Router5 更喜歡通過 Router7 的路由。 同樣的圖片將出現在 Router6 上,儘管選擇通過 Router8 的路由對他來說更有利可圖。 我們還補充說,更改此參數需要重新啟動鄰域才能使變更生效。 讀 這裡。 我們整理了本地偏好。 讓我們繼續討論下一個參數。

  4. 優先選擇下一跳參數為0.0.0.0的路由,即本地路由或​​聚合路由。 輸入網路指令後,這些路由會自動分配一個等於最大值 32678 的權重參數:
    Router#show bgp
    BGP table version is 2, local router ID is 9.9.9.9
    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
     *>  9.9.9.0/24       0.0.0.0                  0            32768    i
  5. 通過 AS 的最短路徑。 選擇最短的 AS_Path 參數。 一條路由經過的AS越少越好。 考慮 Router9.9.9.0 上到 24/10 的路由:
    Router10#show bgp
    BGP table version is 2, local router ID is 6.6.6.6
    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
     *   9.9.9.0/24     192.168.107.7                           0           123 45 i
     *>i                     192.168.112.12           0    100       0       45 i

    可以看到,Router10 選擇了 192.168.112.12 的路由,因為該路由的 AS_Path 參數只包含 45,而在另一種情況下則為 123 和 45。直覺上很清楚。

  6. 下一個參數是原點。 IGP(使用BGP獲得的路由)比EGP(使用BGP的前身所獲得的路由,不再使用)好,而EGP比Incomplete? (透過其他方法獲得,例如透過重新分配)。
  7. 下一個參數是 MED。 我們有 Wiegt,它只能在路由器上本地工作。 有本地偏好,它只在一個自治系統內起作用。 正如您可能猜到的,MED 是將在自治系統之間傳輸的參數。 非常好 文章 關於這個參數。

不再使用更多的屬性,但如果兩條路由具有相同的屬性,則使用以下規則:

  1. 選擇經過最近的 IGP 鄰居的路徑。
  2. 為 eBGP 路徑選擇最舊的路由。
  3. 選擇經過具有最小 BGP 路由器 ID 的鄰居的路徑。
  4. 選擇一條經過 IP 位址最小的鄰居的路徑。

現在我們來看看BGP收斂的問題。

讓我們看看如果 Router6 遺失通過 Router9.9.9.0 的路由 24/9 會發生什麼情況。 讓我們禁用Router0的Gi1/6接口,這將立即了解到與Router8的BGP會話已終止並且鄰居已消失,這意味著從其接收的路由無效。 Router6立即發送Update訊息,在Withdrawn Routes欄位中指明網路9.9.9.0/24。 Router5一收到這樣的訊息,就會傳送給Router7。 但由於 Router7 有一條經過 Router10 的路由,因此它會立即以新路由的更新回應。 如果無法根據介面的狀態偵測到鄰居的故障,則必須等待保持計時器觸發。

聯盟。

如果您還記得,我們​​討論過您經常必須使用全連接拓撲的事實。 如果一個 AS 中有大量路由器,這可能會導致大問題,為了避免這種情況,您需要使用聯盟。 一個AS被劃分為多個子AS,這使得它們無需全連接拓撲即可運行。

BGP 的工作原理

這是一個連結 拉布這裡 GNS3 的配置。

例如,使用這種拓撲,我們必須將 AS 2345 中的所有路由器相互連接,但使用聯盟,我們只能在直接相互連接的路由器之間建立鄰接關係。 我們來詳細談談這個問題。 如果我們只有 AS 2345,那麼 拉福吉 收到了來自的遊行 皮卡爾 會告訴路由器 數據 и WORF,但他們不會告訴路由器這件事 破碎機 。 還有路由器本身分配的路由 拉福吉, 不會被轉移 破碎機WORF-不好了 數據.

您必須設定路由反射器或完全連接的鄰居關係。 透過將一個 AS 2345 分成 4 個子 AS(2,3,4,5、XNUMX、XNUMX、XNUMX)供每個路由器使用,我們最終得到不同的操作邏輯。 一切都被完美描述 這裡.

來源:

  1. CCIE 路由與交換 v5.0 官方證書指南,第 2 卷,第五版,Narbik Kocharians,Terry Vinson。
  2. Сайт xgu.ru
  3. Сайт GNS3保險庫.

來源: www.habr.com

添加評論