2017年9月28日 星期四

32 – BGP 屬性和選路


IGP會影響路徑最常見的是改MetricEIGRPMetric跟頻寬(B)和延遲(D)有關係,OSPF影響Metric最重要的是頻寬(B)

BGP可以通過很多的屬性來控制路徑:
 . 選路屬性:進行路由選路控制
 . 路由控制屬性:用來決定路由能不能被誰接收、被誰發送

官方的標準
BGP路徑屬性

. 公認
 1. 公認必遵 (well-known mandatory)
BGP的路由必需要攜帶公認必遵屬性。
 2. 公認自決 (well-known discretionary)
可選擇BGP的路由是否攜帶,一但攜帶的話公認自決屬性就要被所有廠商所識別。

. 可選
 1. 可選傳遞 (optional transitive)
可選被識別也可不被識別。
 2. 可選非傳遞 (optional non-transitive)
我能識別但是不傳遞


公認屬性

公認屬性是一種所有BGP實施都必需能識別的屬性;這些屬性被傳輸給BGP鄰居。

要點:
1. 公認必決屬性必需出現在路由描述中。
2. 公認自決屬性不是必需出現在路由描述中。


任選屬性

任選屬性不要求所有BGP的實施都必需支持;它可能是一個私有屬性。

要點:
1. 如果任選屬性被支持的話,就可以將它傳輸給BGP鄰居。
2. 任選非傳遞屬性必需被不支持此屬性的路由器刪除。


BGP屬性分類                             08:00

. 公認必決:
  AS-pathNext-hopOrigin
. 公認自決:
  Local preferenceAtomic aggregate
. 任選可傳遞:
  AggregatorComm
. 任選非傳遞:
  Multi-exit discriminator (MED)

AS-pathAS-PATH意思是每經過一個AS,都會把他的AS號放在AS-PATH這個屬性裡面,然後協帶路由表一起轉發。

Next-hop *>

Origin叫起源屬性:用來標示這個路由是通過怎樣的方式放進BGP的。第一可以用network放進去,第二為重分佈放進路由第三為AGG(聚合命令aggregate)

Comm叫社團屬性:做路由控制

(MED) :就像IGPmetric


BGP路由選擇的決策過程                             19:50

思考:選路原則的前提是什麼?
要先解決路由的優化問題


1. 優選最大權重 (Weight)
2. 優選最高本地優先級 (Local Preference)
3. 優選本路由器起源的路由 (Next-hop=0.0.0.0)
4. 優選最短AS-Path
5. 優選最小的起源代碼 (IGP<EGP<incomplete) →重分佈
6. 優選最小的MED
7. eBGP路徑優於iBGP路徑    (20AD優於200AD)
8. 優選最短IGP鄰居的路徑
9. 優選eBGP路徑中最老的路由
10. 優選最小鄰居BGP Router ID的路徑
11. 優選最小鄰居IP地址的路徑


選路原則


傳播範圍
默認值
越大越好?
Weight
本地有效
0/32768
Local preference
一個AS
100
起源本地
XXX
Next-hop 0.0.0.0
XXX
AS-Path
所有的AS

越短越好
Origin
所有的AS
i > e > ?

MED
所有的AS
0

eBGP優於iBGP
XXX
20/200(eBGP/iBGP)

前三個越大越好,第四個以後開始越小越好。

選路原則的前提是什麼?
要先解決路由的優化問題,才考慮BGP的選路。


實驗拓樸


R1(config)# interface loopback 0
R1(config-if)# ip address 11.1.1.1 255.255.255.0
R1(config)# interface eth 0/0
R1(config-if)# ip address 12.1.1.1 255.255.255.0
R1(config-if)# no shut
R1(config)# interface s 1/0
R1(config-if)# ip address 13.1.1.1 255.255.255.0
R1(config-if)# no shut

R2(config)# interface loopback 0
R2(config-if)# ip address 22.1.1.1 255.255.255.0
R2(config)# interface eth 0/0
R2(config-if)# ip address 12.1.1.2 255.255.255.0
R2(config-if)# no shut
R2(config)# interface eth 1/0
R2(config-if)# ip address 23.1.1.2 255.255.255.0
R2(config-if)# no shut

R3(config)# interface loopback 0
R3(config-if)# ip address 33.1.1.1 255.255.255.0
R3(config)# interface eth 0/0
R3(config-if)# ip address 23.1.1.3 255.255.255.0
R3(config-if)# no shut
R3(config)# interface s 1/0
R3(config-if)# ip address 13.1.1.3 255.255.255.0
R3(config-if)# no shut

IGP

R2(config)# router ospf 1
R2(config-router)# network 22.1.1.1 0.0.0.0 area 0
R2(config-router)# network 23.1.1.0 0.0.0.255 area 0

R3(config)# router ospf 1
R3(config-router)# network 33.1.1.1 0.0.0.0 area 0
R3(config-router)# network 23.1.1.0 0.0.0.255 area 0

BGP

R1(config)# router bgp 1
R1(config-router)# neighbor 12.1.1.2 remote-as 23
R1(config-router)# neighbor 13.1.1.3 remote-as 23

R2(config)# router bgp 23
R2(config-router)# neighbor 12.1.1.1 remote-as 1
R2(config-router)# neighbor 33.1.1.1 remote-as 23
R2(config-router)# neighbor 33.1.1.1 update-source loopback 0

R3(config)# router bgp 23
R3(config-router)# neighbor 13.1.1.1 remote-as 1
R3(config-router)# neighbor 22.1.1.1 remote-as 23
R3(config-router)# neighbor 22.1.1.1 update-source loopback 0

R3# show ip bgp summary

R1# show ip bgp summary
R2# show ip bgp summary


放路由進去
R1# show ip router

R1(config)# router bgp 1
R1(config-router)# network 11.1.1.0 mask 255.255.255.0

R1# show ip bgp
R1可以通過這條路由傳給R2R3
R1可以通過這條路由傳給R2R2在通過iBGP傳給R3
R3可以通過兩個方向學到同一條路由(R1→R2→R3R1→R3)
R3是要通過誰來傳給R3呢?這就叫選路

先把R1R3down
R1(config)# interface s 1/0
R1(config-if)# shut
R1# clear ip bgp * so

R3# show ip bgp
R1R3段掉後只能走R1→R2→R3,這時候從R3上就看的出來這條路由不優

因為R1把路由傳給R2的時候,R2所偕帶的下一跳是R1(12.1.1.1)R2在把路由傳給R3的時候,就沒有在R2上對R3next-hop-self,所以路由傳給R3R3看到這條路由的下一跳還是12.1.1.1,在R3上就沒有路由可逹到12.1.1.1這個網段,不優的話就不可能看到 *>

解決路由優化問題
R2(config)# router bgp 23
R2(config-router)# neighbor 33.1.1.1 next-hop-self

同樣的R3也有可能把路由傳給R2,所以R3也要對R2
R3(config)# router bgp 23
R3(config-router)# neighbor 22.1.1.1 next-hop-self

R3# clear ip bgp * so
R3# show ip bgp
 

R1R3給連起來
R1(config)# interface s 1/0
R1(config-if)# no shut

怎麼看R3路由
R3# show ip bgp
11.1.1.0這條路由可以通過兩個方向學到,一個從13.1.1.1也能通過22.1.1.1,路由從哪傳來就看 > 在什麼地方。

每條路由都必需偕帶公認必遵屬性,AS-pathPathNext-hopOrigin起源屬性為最後面的i,標示這條路由是從哪個起源進來的。

Network進來的是i,前面的i是通過iBGP學過來的。

默認是通過第7條選路進來eBGP路徑優於iBGP路徑,同時也有兩個AD值。

通過eBGP學過來的路由他的AD值是20,通過iBGP學過來的路由他的AD值是200。所以選AD(通告距離)小的。


. 通過Weight (重量)值來改選路                                52:00
 1. 他是cisco私有的      
 2. 有兩個默認值 0/32768   
 3. 越大越好  
 4. 本地有效   
 5. 只可以在in方向上去修改

R1# show ip bgp
這條路由是本地產生的他的Weight值為默認32768,這條路由是我通過我的鄰居學過來的那他的默認值是0

要在R2發給R3in方向修改

Router-map是一個工具:
1. BGP修改屬性
2. 重分佈
3. PBR → 策略路由 (負載均衡)


R3上做Router-map
首先針對11.1.1.0這條路由來做,所以要把這條路由抓出來,用簡單的方法寫一條ACL
R3(config)# access-list 1 permit 11.1.1.0

R3(config)# route-map w       (W = 名字)
R3(config-route-map)# match ip address 1    (1 = access-list 1)
配置了route-map名字是W,匹配了這個路由1 (1 = access-list 1)

R3(config-route-map)# set weight 100
R3(config-route-map)# exit
Set他的weight (0-65535)

Permit 10是他自己生成的

他跟ACL一樣的概念:
1.從上到下匹配
2. route-map如果後面沒有任何東西,最後會有一句deny any,其他所有路由全部拒絕。

為了不影響其他所有路由,在設定一個指令
R3(config)# route-map w permit 999

意思是放行其他所有路由,我不去match就是match所有,我不去set就是什麼都不做。
這一句僅只對我關心的路由做一個set,其他默認放行並且什麼都不做。

我僅只對ACL 1weigh值的修改,而其他所有路由都沒做任何的set(就是放行)

如果沒有route-map w permit 999會出現什麼問題

R1上建一個環回口

R1(config)# interface loopback 1
R1(config-if)# ip address 122.1.1.1 255.255.255.0
R1(config-if)# exit
R1(config)# router bgp 1
R1(config-router)# network 122.1.1.0 mask 255.255.255.0

R1# show ip bgp

R3(config)# no route-map w permit 999

Router-map做了要調用才會生效

啟用Router-map
R3(config)# router bgp 23
R3(config-router)# neighbor 22.1.1.1 router-map w in
R2發給R3路由的時候,在進來的方向掛上router-map w,只能在in的方向。


R3# show ip bgp
11.1.1.0weight值變成100,路徑變成R1→R2→R3

122.1.1.0的路由只能從R1學過來,不能從R2學過來,因為router-map設定為只對11.1.1.0的路由在做策略,最後一句deny any11.1.1.0只能從R2收到路由其他路由全部deny掉了,都不能走R2這條路徑。


R3(config)# route-map w permit 999
R3# clear ip bgp * so

R3# show ip bgp
之前122.1.1.0只能從R1傳過來,現在也能從R2傳過來了。

總結:在用router-map修改BGP屬性的時候,如果只是針對某一個路由在做屬性的修改,記得要放行其他沒有修改的路由,否則的話你只會收到已修改的路由,沒做修改的路由將會收不到,因為router-map最後一句為deny any,最後要加一句放行。


2. Local preference (本地優先)                                    1:12:20

還原把調用刪掉R3(config-router)# no neighbor 22.1.1.1 router-map w in

R3# show ip bgp


在其他場商設備Local preference為第一優先,weight只用在cisco設備。

傳播範圍在一個AS內傳遞,默認值100越大越好,可以使用在inout方向。
看到從R1傳過來的Local preference0R2傳過來的為100,其實R1Local preference不是0

看路由的明細
R3# show ip bgp 11.1.1.0

1. 有時候看到LocPrf0並不代表不是100,要show明細才能看到。

2. 為什麼R1Local preference0因為他只能在一個AS傳遞,所以是在不同的AS;不能在eBGP傳遞,對端R1傳給我的路由並沒有偕帶LocPrf,所以LocPrf0

但明細為什麼又能看到LocPrf100

明細的LocPrf100是因為R3默認會把所有eBGP的鄰居傳給我的路由打上LocPrf100

總結:LocPrf0是因為LocPrf不可能在eBGP當中傳遞所以為0,明細裡的LocPrf100是因為默認的LocPrf只能在一個AS傳遞並且他的默認值為100。這時候當我從eBGP收到的路由,我會自己把他打上一個默認的LocPrf100


現在要通過Local preferenceR3學過來的11.1.1.0這條路由從R2
一樣要寫一條ACL
R3(config)# access-list 1 permit 11.1.1.0       

R3(config)# route-map L
R3(config-route-map)# match ip address 1
R3(config-route-map)# set local-preference 101
R3(config-route-map)# exit
R3(config)# route-map L permit 999
R3(config-route-map)# exit


啟用Router-map
R3(config)# router bgp 23
R3(config-router)# neighbor 22.1.1.1 router-map L in
如果out要在R2的出方向做。這時要注意哪個設備的inout

R3# show ip bgp
這條路由從R2走,並且其他路由不受影響。

還原把啟用刪掉R3(config-router)# neighbor 22.1.1.1 router-map L in


3. 起源本地優先                                    01:20:00

R1# show ip bgp

只要看到某一條路由的下一跳為0.0.0.0就說明這條路由是起源本地的。

cisco路由器中只要是起源本地他的weight就是32768,從其他地方來的路由他的weight就是0,在cisco中不可能比到起源本地因為第一條weight值就比出來了。  不同品牌路由才會用到


4. AS-Path                                          01:22:20

  1. 傳播範圍為所有的AS 
  2. 每經過一個AS會把AS號放進AS-Path裡面
  3. AS越少越好 
  4. 只能在eBGP的鄰居上設定 
  5. 能在inout方向設定

R3in方向把R1傳給我的路由的AS多加一個path
一樣要寫一條ACL把路由抓出來
R3(config)# access-list 1 permit 11.1.1.0

R3(config)# route-map AS
R3(config-route-map)# match ip address 1
R3(config-route-map)# set as-path prepend 11 111 111
Prepend叫在什麼什麼之前,後面加了三個AS

R3(config-route-map)# exit
R3(config)# route-map AS permit 999
R3(config-route-map)# exit

啟用Router-map
R3(config)# router bgp 23
R3(config-router)# neighbor 13.1.1.1 router-map AS in
只能在eBGP環境下啟用,只能在13.1.1.1建立eBGP鄰居關係後,加上router-map AS(in)進來之前。

總結prepend的過程R3在跟R1建立eBGP鄰居關係的時候,在R1把路由傳給我進來之前加上111111111

R3# clear ip bgp * so
R3# show ip bgp

通過修改在進來之前加了幾個AS,為了控制選路AS-Path最短最優。

增加AS-Path是為了做選路,而本身的AS-Path是在防環路的。

基本觀念:在用AS-Path控制選路時所增加的AS最好跟PathAS要一樣,所以不能隨便加AS號。

正確要這樣設定
R3(config-route-map)# no set as-path prepend 11 111 111
R3(config-route-map)# set as-path prepend 1 1 1
寫幾個1都可以

R3# show ip bgp
同樣做到選路的目的,也不會重複到其他的AS號,同時也做到了eBGP防環路,就不會影響其他的AS


還原把啟用刪掉R3(config-router)# no neighbor 13.1.1.1 router-map AS in



5. Origin (起源屬性)                               01:33:00

1. 傳播範圍為所有的AS  2. 默認值有三個 i > e > ?

通過network進來的是i,通過重分佈進來的是?,通過EGP古老的協定進來的是e

只要把從R1傳過來的13.1.1.1路由起源屬性改成e?,他的優先級就沒有比i高了。

R3(config)# route-map O
R3(config-route-map)# match ip address 1
R3(config-route-map)# set origin incomplete
IGPiincomplete?
R3(config-route-map)# exit

R3(config)# route-map O permit 999
R3(config-route-map)# exit


啟用Router-map
R3(config)# router bgp 23
R3(config-router)# neighbor 13.1.1.1 router-map O in
eBGP建立,你發給我的時候加上router-map O在進來的方向

R3# clear ip bgp * so
R3# show ip bgp


還原把啟用刪掉R3(config-router)# no neighbor 13.1.1.1 router-map O in



6. MED (metric)                                 01:37:30

傳播範圍為所有AS之間傳遞,默認值0越小越好,可以在inout方向設定。

只要把從R1傳過來的metric改大
R3(config)# route-map M
R3(config-route-map)# match ip address 1
R3(config-route-map)# set metric 50
R3(config-route-map)# exit

R3(config)# route-map M permit 999
R3(config-route-map)# exit


啟用Router-map
R3(config)# router bgp 23
R3(config-router)# neighbor 13.1.1.1 router-map M in
R1傳給R3metric改大,掛上router-map M在進來的方向

R3# clear ip bgp * so
R3# show ip bgp


還原把啟用刪掉R3(config-router)# no neighbor 13.1.1.1 router-map M in



7. eBGP優於iBGP                                   01:41:40

R3# show ip bgp
前面的iiBGP,沒寫的為eBGP