1. 程式人生 > 實用技巧 >bgp 字首列表和路由對映

bgp 字首列表和路由對映

route map類似一張表,其中的每一個表項可以看做是比較複雜的static route。如:
route map TEST permit 10
match A
match B
match C
set A
set B
set C
意思就是在名為TEST的route map中新增一個entry,序號為10,其型別為perimit.
match動作指定了匹配條件,在示例中有3個match動作,也就是有3個匹配條件。
set動作指定了如果匹配成功,應對執行的操作,在示例中有3個set動作,也就是有3個操作。
只有某條路由route,三個match動作(match A,B,C)都匹配成功後,才會進行下面的set動作(是所有操作,即set A,B,C)

match和set動作都是可選的,不是必須的,例如將上面的示例改為下面的形式依然有效:
route map TEST permit 10
match A
match B
match C

route map TEST permit 10
set A
set B
set C

還有route map中的entry還有另一種型別,即deny,如:
route map TEST delay 20
match A
如果某條路由route匹配到指定條件(match A),則該route會被deny掉,不會出現在FIB中。deny型別的entry可以用來過濾掉某些路由。

當某個route map有多個entry時,會根據entry的序號,從小到大進行匹配,匹配到其中任何一個entry就會結束。如:

route map TEST permit 10

route map TEST deny 20

這樣就會先匹配entry 10,匹配不成功再繼續匹配entry 20。
注意!每個route map的最後一個entry都是deny!它是自動隱含在route map中的,當route map中的所有entry都不匹配時,就會自動deny掉對應的路由。
為了防止不匹配的路由被deny掉,應該在每個route map的最後加上一個空的permit entry,如:
route map TEST deny 10

route map TEST permit 20

本文會向你展示如何在 Quagga 中使用字首列表和路由對映。

拓撲和需求

本教程使用下面的拓撲結構。

服務供應商A和供應商B已經將對方設定成為 eBGP 對等體,實現互相通訊。他們的自治系統號和字首分別如下所示。

  • 對等區段: 192.168.1.0/24
  • 服務供應商A: 自治系統號 100, 字首 10.10.0.0/16
  • 服務供應商B: 自治系統號 200, 字首 10.20.0.0/16

在這個場景中,供應商B只想從A接收 10.10.10.0/23, 10.10.10.0/24 和 10.10.11.0/24 三個字首。

安裝 Quagga 和設定 BGP 對等體

之前的教程中,我們已經寫了安裝 Quagga 和設定 BGP 對等體的方法,所以這裡就不再詳細說明了,只簡單介紹下 BGP 配置和字首廣播:

上圖說明 BGP 對等體已經開啟。Router-A 在向 router-B 廣播多個字首,而 Router-B 也在向 router-A 廣播一個字首 10.20.0.0/16。兩個路由器都能正確無誤地收發字首。

建立字首列表

路由器可以使用 ACL 或字首列表來過濾一個字首。字首列表比 ACL 更常用,因為前者處理步驟少,而且易於建立和維護。

  1. ipprefix-listDEMO-PRFX permit192.168.0.0/23

上面的命令建立了名為“DEMO-FRFX”的字首列表,只允許存在 192.168.0.0/23 這個字首。

字首列表的另一個強大功能是支援子網掩碼區間,請看下面的例子:

  1. ipprefix-listDEMO-PRFX permit192.168.0.0/23le24

這個命令建立的字首列表包含在 192.168.0.0/23 和 /24 之間的字首,分別是 192.168.0.0/23, 192.168.0.0/24 和 192.168.1.0/24。運算子“le”表示小於等於,你也可以使用“ge”表示大於等於。

一個字首列表語句可以有多個允許或拒絕操作。每個語句都自動或手動地分配有一個序列號。

如果存在多個字首列表語句,則這些語句會按序列號順序被依次執行。在配置字首列表的時候,我們需要注意在所有字首列表語句之後是隱性拒絕語句,就是說凡是不被明顯允許的,都會被拒絕。

如果要設定成允許所有字首,字首列表語句設定如下:

  1. ipprefix-listDEMO-PRFX permit0.0.0.0/0le32

我們已經知道如何建立字首列表語句了,現在我們要建立一個名為“PRFX-LST”的字首列表,來滿足我們實驗場景的需求。

  1. router-b#conf t
  2. router-b(config)#ipprefix-listPRFX-LST permit10.10.10.0/23le24

建立路由對映

除了字首列表和 ACL,這裡還有另一種機制,叫做路由對映,也可以在 BGP 路由器中控制字首。事實上,路由對映針對字首匹配的微調效果比字首列表和 ACL 都強。

與字首列表類似,路由對映語句也可以指定允許和拒絕操作,也需要分配一個序列號。每個路由匹配可以有多個允許或拒絕操作。例如:

  1. route-map DEMO-RMAP permit10

上面的語句建立了名為“DEMO-RMAP”的路由對映,新增序列號為10的允許操作。現在我們在這個序列號所對應的路由對映下使用 match 命令進行匹配。

  1. router-a(config-route-map)#match(press?inthe keyboard)

  1. as-pathMatchBGP AS pathlist
  2. communityMatchBGP communitylist
  3. extcommunityMatchBGP/VPN extended communitylist
  4. interfacematch first hopinterfaceofroute
  5. ipIP information
  6. ipv6IPv6information
  7. metricMatchmetric ofroute
  8. origin BGP origin code
  9. peerMatchpeer address
  10. probabilityMatchportion of routesdefinedby percentage value
  11. tagMatchtag ofroute

如你所見,路由對映可以匹配很多屬性,在本教程中匹配的是字首。

  1. route-map DEMO-RMAP permit10
  2. matchipaddress prefix-listDEMO-PRFX

這個 match 命令會匹配之前建好的字首列表中允許的 IP 地址(也就是字首 192.168.0.0/23, 192.168.0.0/24 和 192.168.1.0/24)。

接下來,我們可以使用 set 命令來修改這些屬性。例子如下:

  1. route-map DEMO-RMAP permit10
  2. matchipaddress prefix-listDEMO-PRFX
  3. set(press?inkeyboard)

  1. aggregator BGP aggregator attribute
  2. as-pathTransformBGP AS-path attribute
  3. atomic-aggregate BGP atomic aggregate attribute
  4. comm-listsetBGP communitylist(fordeletion)
  5. community BGP community attribute
  6. extcommunity BGP extended community attribute
  7. forwarding-addressForwardingAddress
  8. ipIP information
  9. ipv6IPv6information
  10. local-preference BGPlocalpreference path attribute
  11. metricMetricvaluefordestination routing protocol
  12. metric-typeTypeof metric
  13. origin BGP origin code
  14. originator-idBGP originator ID attribute
  15. src src addressforroute
  16. tagTagvalueforrouting protocol
  17. vpnv4VPNv4information
  18. weight BGP weightforrouting table

如你所見,set 命令也可以修改很多屬性。為了作個示範,我們修改一下 BGP 的 local-preference 這個屬性。

  1. route-map DEMO-RMAP permit10
  2. matchipaddress prefix-listDEMO-PRFX
  3. setlocal-preference500

如同字首列表,路由對映語句的末尾也有隱性拒絕操作。所以我們需要新增另外一個允許語句(使用序列號20)來允許所有字首。

  1. route-map DEMO-RMAP permit10
  2. matchipaddress prefix-listDEMO-PRFX
  3. setlocal-preference500
  4. !
  5. route-map DEMO-RMAP permit20

序列號20未指定任何匹配命令,所以預設匹配所有字首。在這個路由對映語句中,所有的字首都被允許。

回想一下,我們的需求是隻允許或只拒絕一些字首,所以上面的 set 命令不應該存在於這個場景中。我們只需要一個允許語句,如下如示:

  1. router-b#conf t
  2. router-b(config)#route-map RMAP permit10
  3. router-b(config-route-map)#matchipaddress prefix-listPRFX-LST

這個路由對映才是我們需要的效果。

應用路由對映

注意,在被應用於一個介面或一個 BGP 鄰居之前,ACL、字首列表和路由對映都不會生效。與 ACL 和字首列表一樣,一條路由對映語句也能被多個介面或鄰居使用。然而,一個介面或一個鄰居只能有一條路由對映語句應用於輸入端,以及一條路由對映語句應用於輸出端。

下面我們將這條路由對映語句應用於 router-B 的 BGP 配置,為 router-B 的鄰居 192.168.1.1 設定輸入字首廣播。

  1. router-b#conf terminal
  2. router-b(config)#router bgp200
  3. router-b(config-router)#neighbor192.168.1.1route-map RMAPin

現在檢查下廣播路由和收取路由。

顯示廣播路由的命令:

  1. showipbgp neighbor-IP advertised-routes

顯示收取路由的命令:

  1. showipbgp neighbor-IP routes

可以看到,router-A 有4條路由字首到達 router-B,而 router-B 只接收3條。檢視一下範圍,我們就能知道只有被路由對映允許的字首才能在 router-B 上顯示出來,其他的字首一概丟棄。

小提示:如果接收字首內容沒有重新整理,試試重置下 BGP 會話,使用這個命令:clear ip bgp neighbor-IP。本教程中命令如下:

  1. clearipbgp192.168.1.1

我們能看到系統已經滿足我們的要求了。接下來我們可以在 router-A 和 router-B 上建立相似的字首列表和路由對映語句來更好地控制輸入輸出的字首。

這裡把配置過程總結一下,方便檢視。

  1. router bgp200
  2. network10.20.0.0/16
  3. neighbor192.168.1.1remote-as100
  4. neighbor192.168.1.1route-map RMAPin
  5. !
  6. ipprefix-listPRFX-LST seq5permit10.10.10.0/23le24
  7. !
  8. route-map RMAP permit10
  9. matchipaddress prefix-listPRFX-LST

總結

在本教程中我們演示瞭如何在 Quagga 中設定字首列表和路由對映來過濾 BGP 路由。我們也展示瞭如何將字首列表結合進路由對映來進行輸入字首的微調功能。你可以參考這些方法來設定滿足自己需求的字首列表和路由對映。這些工具是保護網路免受路由毒化和來自 bogon 路由(LCTT 譯註:指不該出現在internet路由表中的地址)的廣播。