BGP-community /peer-group/allowas-in
Community
翻譯成中文後,為團體,
可以將一些特定的條目歸到一個團體裡,而進入這個團體的依據就是community值
我的理解有點兒像ospf中的tag,和mstp的多例項,
當然,community和他們兩個沒有任何的關係,只是意思大概相同而已
Community好處
為什麼非要加community值呢?
假設你有100條個路由條目,來自於各地 如果是定義acl+prefix來進行匹配的話,是否要進行逐一設定,這樣的話工作量是不是很大?而且想一下,擴充套件性有嗎,肯定是沒有的,
連最基本的上下游關係都沒有,只能在本地生效。
那麼此時我們就需要一個能夠貫穿整個鏈路的屬性,即使你不支援,也要進行轉發。這樣一來,我就可以在整條鏈路上的任何一個節點,針對於這條路由做屬性的修改了,變得非常的靈活,且擴充套件性極其的高。
Community值的呈現形式
AA:NN
AA:用於填寫AS號
NN : 用於自定義填寫,當然,在一個超大的網路中,每一個編號都有期特定的含義,也不是亂定的
Community的幾個眾所周知的值
no-advertise
Local-as
No-export
Additive
Internet
No-advertise, 當裝置接收到一條帶有no-adv屬性的條目時,將不會再把這個條目傳遞給任何一個鄰居,不管你是什麼關係、
Local-as,當收到一個帶有local-as屬性的條目時,將把這個條目限制本裝置所在的AS內部進行傳遞,如果定義了不聯邦的話,將會在成員
No-export,當接收到一個帶有no-export屬性的條目時,裝置不會把這個條目傳遞給任何一個EBGP鄰居,但是,聯邦的EBGP關係除外
Additive 增加,一個條目可以攜帶多個community屬性值 ,但是需要在設定的時候新增上後面的關鍵字,這也充分說明了community屬性有多麼的靈活,當起始裝置對其設定了屬性值,到下游的某一臺裝置上都可以對其進行修改,如果配置時不加additive,那麼將把原有的屬性覆蓋。
Internet,只要你收到攜帶了community的條目,預設就是都屬於internet ,
這個有點兒像擴充套件ACL裡的IP 協議,你只要permit community internet 的話,那麼就是匹配了所有的條目。
Community的實際作用
在我看來,community屬性的存在是有絕對意義的,
就拿ACL、prefix-list來和community做個比較,
對於ACL,prefix-list來講,他們只能應用在本地,如果你想要在下一臺裝置也影響的話,就必須在下一臺也要去抓取條目,它是不會跟隨之BGP的update資訊傳遞出去的
而community這個屬性相比之下最大的好處是可以隨著update資訊進行傳遞,它是一個可選傳遞屬性,你可以不支援這個屬性,但是當你不支援的時候你一樣要原封不動的進行傳遞,
So,在一整條完整的鏈路上我可以將這個值從頭一直傳到尾,
然後再到鏈路中適合的節點,做相應的策略,而且是將不同的條目繫結在一個community值,我對這個值部署策略,受影響的將是所有攜帶這個值的字首。是不是要比前兩個方便很多?~這就是community屬性的絕妙之處
Community-list
Community-list,一個很像acl的列表,
但是它所抓取的是攜帶有特定community屬性值,裡面包含著一個或多個路由字首,
這就是我們之前一直提到的,為什麼community可以簡化我們的配置。
Community-list包含 標準,擴充套件,命名式的
標準1-99 ,可以直接進行定義
擴充套件100-500,可以使用正則表示式來相結合(後面的課程中會有所涉及)
命名式的標準和擴充套件,和ACL意思是一樣的,可以取一個相對有意義的名字,方便我們在部署或檢視時候提供方便。
和route-map中的二元一樣,在community-list中,也可以匹配多個項
但是邏輯關係有些不同,
在route-map 中 match X , Y 這樣寫成一行的邏輯關係是“或”
或的關係是兩個條件滿足一個即可
Match x
Match y //這樣寫成兩行的邏輯關係是“且” ,且的關係是兩個條件都要滿足才可以被匹配住
而community-list中,正好相反,
如:Ip community-list xx per 100:1111 no-advertise
此時就是“且”的關係,只有一個條目同時擁有100:1111 和no-advertise時,才被匹配
2如:ip community-list xx per 100:1111
Ip community-list xx per no-advertise時
此時就是“或”的關係,當兩個條件滿足一個,即可以匹配
例
如果說,現在有兩個條目攜帶的屬性值分別是這樣的
100:1111 local-as
100:2222 no-advertise
我寫 ip community-list 11 per 100:1111
那麼我可以匹配第一條
我寫成ip community-list 11 per no-advertise
那麼我可以匹配第二條,
只要是我的屬性中有其它一個值是匹配的,就能匹配住
例2
如果說我有三個條目攜帶的屬性值是這樣的
100:1111no-advertise
100:2222 no-export
100:1111
我是這樣寫的
Ip community-list 1 per 100:1111
Route-map 1 per 10
Match community 1
Set xxxx
那麼部署策略,受影響的就是第一條和第三條,
但是如果我這樣寫
Ip community-list 1 per 100:1111
Route-map 1 per 10
Match community 1exact-match
那麼將被我匹配住的,只有第三條,策略部署後受影響的也只有第三條
這就是我們要說的精確匹配,不可以多,也不可以少,我要的就是正好的,一模一樣的。
說了這麼多,上個例項看看吧,都亂了
實驗1
詳細瞭解community的三個常見屬性值 local-as no-export no-advertise
實驗要求:
1AS100中有4個字首 192.168.1.0 2.0 3.0 4.0
現要求在R1上配置community屬性值,使他們傳遞到不同的AS內,
R2可以收到4條
R3可以收到3條
R4可以收到2條
R5可以收到1條
分析環境,
分析1 在AS200處,為一個聯邦AS,其成員as有64512、64513
分析2R2上可以收到4條,那對於R2來講是不做任何的限制的
R3上可以收到3條,那麼說明在R2上有一條被幹掉了,那分析R2-R3之間是IBGP關係,且為聯邦的IBGP,再想一個什麼屬性是不傳給IBGP鄰居的呢?
好像只有no-advertise可以實現,當R2收到這樣的屬性的條目時不會傳遞給任何人,
這樣一來,第一條和第二條要求滿足
分析3 R3收到3條,R4收到2條,說明在R3上又幹掉一條出來的條目,由於是聯邦IBGP,想一下,哪個屬性是不會被傳出IBGP的,且包括聯邦IBGP? local-as,
分析4R4上有兩條,R5只有一條,還是一樣的套路,在R4上幹掉了一條,他們是EBGP的鄰居關係,那麼不傳出EBGP就OK 了,那就不用想了,這裡不是聯邦的EBGP,而是普通 的EBGP,所以我們可以使用no-export,
分析完成,如何進行配置呢?
1ACL抓取條目
2route-map匹配不同的條目做不同的community值
3對peer應用route-map out方向
4針對於完整的鏈路,要一路由上游裝置向下遊裝置傳送community
實際的配置(confederation就不在這裡詳細說明了,可以看一下之前的配置)
R1(config)#access-list 1 per 192.168.1.0 R1(config)#access-list 2 per 192.168.2.0 R1(config)#access-list 3 per 192.168.3.0 R1(config)#access-list 4 per 192.168.4.0 //使用不同的ACL號碼抓取不同的條目 R1(config)#route-map wfy per 10 R1(config-route-map)#ma ip add 1 //使用permit 10 匹配acl 1 R1(config-route-map)#set community no-advertise //匹配上的就設定值為no-advertise R1(config-route-map)#exit R1(config)#route-map wfy per 20 R1(config-route-map)#ma ip add 2 //使用permit 20 匹配ACL 2 R1(config-route-map)#set community local-AS //匹配上就設定屬性為local-as R1(config-route-map)#exit R1(config)#route-map wfy per 30 R1(config-route-map)#ma ip add 3 //使用permit30 匹配ACL 4 R1(config-route-map)#set community no-export //匹配上就設定屬性為no-export R1(config-route-map)#exit R1(config)#route-map wfy per 40 //使用permit 40放行其它條目 R1(config-route-map)#exit //可以看到 192.168.4.0 條目我們沒有設定任何的值,要放行 R1(config)#router bgp 100 R1(config-router)#nei 2.2.2.2 send-community //針對於鄰居下發community,必須手動指定,預設是不傳遞community值的,因為是可選傳遞的 R1(config-router)#nei 2.2.2.2 route-map wfy out //在out方向應用策略
效果
在沒有應用策略前,所有的裝置上都是同樣的條目 4條
但是當我們將策略應用在裝置上時,就要發生這樣的事情
R2上有四條,R3上有三條,R4上有兩條,R5上只有一條
R2上有4 條,一點兒毛病沒有,
但是在R3上看只有了三條,哪裡去了,?被R2給攔下了,
這一點,我們可以在R2上檢視一下1.0的詳細資訊,community值為no-advertise
R4上只有兩個條目,被R3給拒發了,
在R5上只有一個條目,被R4拒發一條
實驗完全達到我們的要求, 完美
實驗2
實驗要求:
192.168.1.0 攜帶community 值為100:1111
192.168.2.0 攜帶community 值o 100:2222
在AS200中,針對100:1111的條目新增加屬性no-advertise
針對100:2222的條目新增加屬性 local-as
讓100:1111的條目在到達AS300後metric為1000,這條要求使用精確匹配
讓100:2222的條目在到達AS300後as-path 多出三個200
最後在AS300中刪除100:1111的no-advertise屬性
實驗分析
想要擁有不同的community屬性,就要使用不同的ACL抓取條目,然後使用一個route-map來定義兩個不同的值
在AS200中要使用ip community-list,來結合 additive增加額外值
在AS200中使用ip community-list 結合route-map部署策略,修改med和as-path
具體配置及分析
R1(config)#access-list 1 per 192.168.1.0 R1(config)#access-list 2 per 192.168.2.0 R1(config)#route-map com per 10 R1(config-route-map)#ma ip add 1 R1(config-route-map)#set community 100:1111 //設定community值 R1(config-route-map)#exit R1(config)#route-map com per 20 R1(config-route-map)#ma ip add 2 R1(config-route-map)#set community 100:2222 //同一個route-map使用兩個序列號針對於不同的ACL序號,定義不同的community值 R1(config-route-map)#exit R1(config)#route-map com per 30 //放行其它不做配置 R1(config-route-map)#exit R1(config)#router bgp 100 R1(config-router)#nei 2.2.2.2 route-map com out //對peer應用策略out方向 R1(config-router)#nei 2.2.2.2 send-community //向下遊peer傳送community R1(config-router)#exit R1(config)#ip bgp-community new-format //將community的呈現形式改成RFC標準 R2(config-router)#nei 3.3.3.3 send-community //R2對於R3來講,也是上游裝置 R2(config)#ip bgp-community new-format R3(config)#ip bgp-community new-format //為了檢視效果,我們先把R2和R3都配置上RFC呈現形式
那麼此時,對於R2來講,在上游R1上配置了community屬性,在本地就應該可以看到得到,具體有沒有呢?
沒問題,是有的,看來實驗第一步完成
第二步是要求針對不同的community值再增加額外的屬性值,
這時就要用到ip community-list了,
針對於實驗的第二個條件,我們就要在R2上做,因為上游定義了屬性,其意義就在於我們可以在下游裝置上任何一個地方針對這個屬性的條目進行再修改
如何做呢? community-list
R2(config)#ip community-list 11 per 100:1111 R2(config)#ip community-list 22 per 100:2222 //使用不同的列表抓取不同的屬性值 R2(config)#route-map 1122 per 10 //定義名字為1122的route-map R2(config-route-map)#match community 11 //匹配community-list 11 R2(config-route-map)#set community no-advertise additive //設定community 屬性為no-adv,為額外增加的 R2(config)#route-map 1122 per 20 R2(config-route-map)#match community 22 R2(config-route-map)#set community local-AS additive R2(config-route-map)#exit R2(config)#router bgp 200 R2(config-router)#nei 3.3.3.3 route-map 1122 out //對下游裝置應用route-map
那麼在R3上能不能夠看到額外的屬性值呢?
我們來看一下
同樣是可以看到的
第三個要求是修改特定攜帶具體屬性條目的屬性值 ,med和as-path
因為之前已進行過匹配,所以這裡就不用再進行重新定義community-list了,
我們直接可以使用,
但是有一條需要注意
讓100:1111的條目在到達AS300後metric為1000,這條要求使用精確匹配
何為精確匹配?
前文提到過,
假設我現在的路徑屬性為100:1111 no-advertise,兩個值
如果我現在match 100:1111,完全可以匹配這個條目
但是如果我使用精確匹配則沒有辦法
Match 100:1111 no-advertise exact-match才可以的
使用精準匹配,必須和屬性中的完全一樣才可以,多一點少一點都不行,要一模一樣的才能進行匹配上.
還要將前面的no掉
R2(config)#ip community-list 11 per 100:1111 no-advertise //這裡是且的關係 R2(config)#route-map 11 per 10 R2(config-route-map)#no match community 11 R2(config-route-map)#match community 11 exact-match //精確匹配 R2(config)#route-map 1122 per 10 R2(config-route-map)#set metric 1000 R2(config-route-map)#exit R2(config)#route-map 1122 per 20 R2(config-route-map)#set as-path prepend 200 200 200
因為之前已經向3.3.3.3應用過route-map ,現在我們使用相同的名稱,所以不用再應用一次了
而且對於route-map來說,一個裝置上只允許執行一個,你可以設定不同的序列號
(當然,這一步也可以在R3上來做,,最後針對於2.2.2.2 做route-map in方向應用策略,)
此時 ,我們再到R3上來看一下
還是OK的
最後一個要求 ,
我們要在R3上刪除一個特定的屬性,因為看著它太煩人了,我還要傳遞給我的IBGP鄰居呢
現在刪除no-advertise
R3(config)#ip community-list standard del permit no-advertise //我們可以定義一個命名式的community-list來匹配no-adv屬性值 R3(config)#route-map 1111 per 10 //使用route-map R3(config-route-map)#set comm-list del delete //使用comm-list * 來delete屬性值 R3(config-router)#nei 2.2.2.2 route-map 1111 in //在in方向對上游來的條目進行策略部署 此時我們再到R3上看一下這個條目的屬性還在不在~
開始還在
當我們呼叫策略以後
R3(config-router)#nei 2.2.2.2 route-map 1111 in
至此實驗全部完成
總結,
對於ip community-list的應用,要結合route-map來做,此時community-list負責的就是抓取攜帶相應屬性值的條目,然後再由route-map來定義具體的策略,最後再呼叫即可.
在我看來,對於community而言,只要掌握那幾個常用的特性,以及它的一個community-list和route-map的關係即可。
Peer-group
Peer group對等體組,(鄰居組)可以實現相同命令的整合,其最主要的是就可現簡化配置,使得重複的配置更加的簡單。
主要用於擁有相同鄰居時,
實驗1IBGP
共有五臺裝置,其中R5做為路由反射器,1234不需要它們之間再建立任何的BGP關係,
只和R5建立IBGP即可就OK
分析,可以看到在R5上如果想要和1234建立 peer,那麼需要輸入的重複命令有哪些呢
比如現在AS號為100
R5正常是否要配置
#nei 1.1.1.1 remote 100
#nei 1.1.1.1 up lo 1
#nei 1.1.1.1 route-reflector-client //這一步考慮到是IBGP關係,要將R5設定反射器
#nei 2.2.2.2 remote 100
#nei 2.2.2.2 up lo 1
#nei 2.2.2.2 route-reflector-client
#nei 3.3.3.3 remote 100
#nei 3.3.3.3 up lo 1
#nei 3.3.3.3 route-reflector-client
#nei 4.4.4.4 remote 100
#nei 4.4.4.4 up lo 1
#nei 4.4.4.4 route-reflector-client
可以看到,和這4個peer建立 的過程中,輸入的命令除了對端的ip不同,其它的都相同,
顯然,做為一個技術人員,做重複的工作是沒有任何的意義的。
那麼該怎麼辦呢?
思路
建立一個對等體組
把相同的命令敲到對等體組中
把peer放到對等體組中
只需要這三個步驟就可以完成了
那麼具體應該怎麼做呢?來看一下
R5(config)#router bgp 100 R5(config-router)#neighbor wfy peer-group //建立名為wfy的對等體組 R5(config-router)#nei wfy remote 100 //對等體組中的第一個相同命令,指定所在as R5(config-router)#nei wfy update-source lo 1 //第二個相同命令 指定更新源 R5(config-router)#nei wfy route-reflector-client //第三個相同命令 //指定RR的客戶端 R5(config-router)#nei 1.1.1.1 peer-group wfy //程序下針對於peer 呼叫對等體組的命令 R5(config-router)#nei 2.2.2.2 peer-group wfy R5(config-router)#nei 3.3.3.3 peer-group wfy R5(config-router)#nei 4.4.4.4 peer-group wfy //將四個不同的鄰居放入到對等體組中
這樣一來,是不是要方便很多???
沒錯,
Peer-group的用處,就是在當有多個BGP鄰居,都要與他們建立鄰居的時候,這個peer-group才變的那麼的優秀。
實驗2EBGP
R5要和R1.R2.R3.R4分別建立 EBGP的鄰居關係,可否使用peer-group來簡化一下配置呢?
當然可以,但是不能像ibgp那樣 ,完全的進行配置
大同小意的,先來分析一下如果想要和R1.R2.R3.R4都建立關係,那麼相同的命令有哪些呢?
我們使用loopback介面來建立
ebgp-multihop
update-source lo 1
然後也就沒有其它的了。
思路
建立對等體組,設定一個名稱
配置對等體組命令
呼叫對等體組給相應的鄰居
具體的配置如下,
因為EBGP關係相對比較特殊,必須要將不同的命令先行手動輸入
比如 neighbor x.x.x.x remote-as 100/200/300/400
R5(config)#router bgp 500 R5(config-router)#nei ebgp peer-group //建立名為ebgp的對等體組 R5(config-router)#nei ebgp ebgp-multihop //相同命令ebgp 多跳 R5(config-router)#nei ebgp up lo 1 //設定更新源,相同 R5(config)#router bgp 500 R5(config-router)#nei 1.1.1.1 remote 100 R5(config-router)#nei 1.1.1.1 peer-group ebgp //指定neighbor,然後呼叫 R5(config-router)#nei 2.2.2.2 remote 200 R5(config-router)#nei 2.2.2.2 peer-group ebgp R5(config-router)#nei 3.3.3.3 remote 300 R5(config-router)#nei 3.3.3.3 peer-group ebgp R5(config-router)#nei 4.4.4.4 remote 400 R5(config-router)#nei 4.4.4.4 peer-group ebgp 四個鄰居統統都這樣指定,是不是要方便很多, 至少不用你手動的再去一個一個的輸入 ebgp multihop,以及 up lo 1 了
總結: 針對於peer-group一定要靈活掌握。在什麼情況下使用可以節省更多的時間。
BGP Allowas-in
使用allowas-in可以便BGP路由器接收來自於相同AS號的路由更新
如圖
R1-R2=EBGP
R2-R3=IBGP
R3-R4=EBGP
而R1-R4之間並不建立任何的BGP關係,只負責釋出自己的條目,以及接收外部的BGP條目。
那麼此時有一個問題會出現,R1和R4分別向BGP中注入一個條目,看對方能否收到
正常情況下,R1是不可能收到R4傳來的條目的,
為什麼?
因為BGP路由器收到的條目中攜帶自己的AS號,會直接丟棄掉。SO,肯定是收不到的
但有的時候,對方是我的分支機構,必須要使用這樣的AS號,必須相同才可以,
那麼這時,就要用到一條命令。使得BGP路由器可以接收來自相同AS的路由更新。
最開始看到的是這樣兒的
R1(config)#router bgp 100 R1(config-router)#nei 2.2.2.2 allowas-in 1
兩點解釋
1 neighbor,指的是和自己直連的EBGP鄰居
2 後面跟著的數字意思是可以允許接收幾個相同AS的路由更新,範圍是1-10
此時再來檢視,
可以看出來,路由條目有所更新,且這個條目的AS-PATH屬性也記錄著所經過 的AS
另外提示一個小點,
輸入這條命令的意思是接收,不影響傳送。預設本來就是都發的。
BGP的筆記就到這裡啦
--------------------------------------------------------------
CCIE成長之路 ---梅利