BGP选路原则笔记 Cyrus
BGP的属性就是BGP路由所具有的一些特性
公认必遵:只要是BGP路由就应该拥有特征,Update消息必须包含这些属性
AS-Path、Next-Hop、Origin ID
(1)前缀一开始注入BGP时,下一跳依赖注入的方式
aggregate-address——0.0.0.0 (本地路由器)
network / redistribute——原路由的下一跳地址,如果路由的下一跳地址存在(指向null)本路由器将成为该BGP路由的下一跳!即0.0.0.0
(2)通过EBGP通告出去的前缀,下一跳在自动被重置为正在发送该前缀的EBGP Peer的更新源地址!这里“第三方下一跳”除外
(3)IBGP下一跳不变,也可以使用next-hop-self修改
公认可遵:所有BGP路由器都能识别,但不一定需要,Updata 消息中可以不包括该属性
Local-prefence、Atomtic-aggre
可选传递:不是所有的路由器都能识别,但所有路由器都能传递它,即使此路由器不接受也能传递
Aggregator、Community
可选非传递:不是所有的路由器都能识别,不能识别的路由器丢弃它!如果BGP路由器不接受则立即丢弃此特性,不再传递
MED、Originator ID、Cluster Lister
============================================
BGP每条更新消息都有一个长度可变的路径属性序列<属性类型,属性长度,属性值>,如果第1比特是0,则属于是公认属性,如果它是1,则该属性是任选属性,如果第2比特是0,则该属性是不可传递的,如果它是1,则属性是可传递的,公认属性总是可传递的,属性标志域中的第3个比特指示任选可传递属性中的信息是部分的(值为1)还是完整的(值为0),第4个比特确定该属性长度是1字还是2字节,标志域其他4个比特总为0.属性类型代码字节含有属性代码。如下图所示。
BGP选路属性(位于BGP表中)
(1)Weight——可选非传递属性(越高越优)
本路由器有效(传播范围:思科IOS私有属性)
本地发起的路由32768
学习过来的路由是0(两种默认值)
(2)Local-preference
本AS内传递(传播范围)
默认值为100
可以进程下修改:bgp default local-preference XXX
配置结果说明:本AS内做配置,影响本AS访问外部网络(建议用明细路由查看该属性)
(3)Origination
基于始发地(origination)评估路由
路由器本地始发的路径优先,顺序从高到低为:
default-originate(针对每个邻居)
default-information-originate(针对每个地址簇)
network
redistribute
aggregate-address
(4)AS-Path
全网传播(传播范围)
每经过一个AS号,就在起始AS后(左边)添加(默认值)
默认情况下,AS-PATH列表最短的路径优先。但是,可以通过配置bgp bestpath as-path ignore(隐含命令)来忽略这一步
配置说明:可以在进出方向做添加AS号来影响BGP传递
在进来之前添加上所设置的AS号
在发出之前添加上所设置的AS号
注意事项:
一个AS-PATH被计数为1,而不管“set”中包含多少个AS
AS_CONFED_SQUENCE不包含在AS-Path长度中
(5)Origin-ID(Origin code)
全网传播(传播范围)
默认值看通告路由的方式
配置说明:IGP > EGP > incomplete
EGP的路由在现网上已经不存在了!
前缀被注入BGP时,它的Origin-ID属性是自动被定义的,但可以手工修改
(6)MED(越小越优)[metric]
本AS内传播(传播范围)
默认值为0(默认值)
配置说明:本AS做配置,影响外部访问本AS内的网络
MED应该注意的地方:
默认情况下只有当AS_SEQUENCE中和第一个AS相同的情况下,才会比较MED!如果要比较来自不同AS的MED,必须激活bgp always-compare-med,而且是整个AS中都激活
如果收到的路由没有MED,默认情况下是重置0,除非bgp bestpath med missing-as-worst被激活(默认情况丢失MED的路由条目,将被设置为一个最差MED值)
*任何子联盟自治系统都被忽略,可以使用bgp always-compare-med激活所有路径都比较MED
边界路由器本地发起的条目通告给eBGP邻居的MED属性不会丢失
bgp deterministic-med
Pick the best-MED path among paths advertised from the neighboring AS
另外MED的通告规则:
(1. ebgp在发布从ibgp学来的路由时,会清除MED的值。如果想强制通告,可以在宣告的路由上使用“set metric-type internal”
(2. 如果使用network或redistribute命令将来自IGP的路由通告到BGP中,那么BGP的MED是从IGP的metric导出的。
(3. 如果是aggregate-address命令注入路由,BGP的MED不被设置。
(7)Prefer EBGP path over IBGP path (EBGP > IBGP)
(8)Prefer the path through the closest IGP neighbor(更近的IGP邻居)
这里是指peer的更新源在我的路由表里显示,哪个最近哪个最优。
OSPF是否考虑O、OIA、OE1、OE2?只看cost不看O/OIA/OE。
(9)Prefer the path with the lowest IBGP neighbor router ID(最小的ibgp router-id)
如果配置maximum-paths {IBGP} n<2 - 6>,并且存在多条等成本的路径(对于多条路径,以上1 - 6的比较结果相同,而且AS-Path也相同)
那么BGP会在IGP路由表中插入n条路径,默认只对EBGP有效
BGP默认maximum-path=1,只能有一条最优路径,但可以通过命令来改变,如果没有IBGP参数,默认只能做EBGP的负载均衡。做负载均衡还有一个条件,就是上面的8条都比不出哪条最优的情况下,才有可能出现负载均衡。
(10)当两条路径都是外部路径时,BGP将优先选择最先收到的路径(最老的路径),但如果以下任一条件为真,这一步忽略
启用bgp bestpath compare-routerid
多条路径最优相同的RID(因为从同一外部路由器接收过来)
当前没有最佳路径,缺乏当前最佳路径的例子就是正在通告最佳路径的邻居失效的时候
比较Router-ID对于EBGP来说不生效
(11)选择最小的RID BGP邻居发送的路径(如果路径包含RR属性,则用Originator-ID替代RID)
BGP优选来自具有最低的路由器ID的BGP路由器的路由。Router-id是路由器上最高的IP地址,并且优选环回口。也可以通过bgp router-id命令静态的设定路由器ID。如果路径包含RR属性,那么在路径选择过程中,就用originator-id来替代路由器ID。
(12)如果多条路径Originator-ID或RID都相同,那么选择Cluster-List长度最短的路径
多跳路径的始发路由器ID相同,那么选择CLUSTER_LIST长度短的,因为每经过一个RR,cluster-list会加上这个RR的router-id
如果多条路径的始发router-id相同,那么BGP将优选cluster-list长度最短的路径。这种情况仅仅出现在BGP RR的环境下。
(13)BGP选择来自最低的邻居地址路径
BGP优选来自于最低的邻居地址的路径。是BGP的neighbor配置中的那个地址,如果是环回口,则看环回口地址的高低。
BGP优选来自于最低的邻居地址的路径。这是BGP的neighbor配置中所使用的IP地址,并且它对应于与本地路由器建立TCP连接的远端对等体。
Lab
step1:R2通告两个环回口,R3通过与R1/R4的BGP学到两条路由并且选择了R1作为最优(因为R1 的bgp router-id更小)——选路原则第9步
step2:将R3的s1口的ospf的cost(ip ospf cost 100),这样R3关于R2的两条路由选择了R4作为最优路径(因为R3去往4.4.4.4的cost更小)——选路原则第8步
step3:建立R1和R4的IBGP关系,R1通过与R2/R4的BGP学习到三条路由,并且选择R2作为最优路径(EBGP > IBGP)——选路原则第7步
step4:在R2的BGP进程下针对邻居R1用出方向route-map将两条的MED(即metric)改为100此时R1关于这两条路由选择了R4作为最优路径(因为从R4的metric = 0)——选路原则第6步
ip prefix-list R2 seq 5 permit 100.2.2.0/24
ip prefix-list R2 seq 10 permit 200.2.2.0/24
route-map TR1 permit 10
match ip address prefix-list R2
set metric 100
route-map TR1 permit 20
router bgp 100
neighbor 12.1.1.1 route-map TR1 out
step5:在R1的BGP进程下针对邻居R4进入方向route-map将两条路由的Origin code改为EBG,此时R1关于这两条路由选择了R2作为最优路径(igp > bgp > Incomplete)——选路原则第5步
ip prefix-list R4 seq 5 permit 100.2.2.0/24
ip prefix-list R4 seq 10 permit 200.2.2.0/24
route-map FR4 permit 10
match ip address prefix-list R4
set origin incomplete
route-map FR4 permit 20
router bgp 100
neighbor 3.3.3.3 route-map FR4 in
neighbor 4.4.4.4 route-map FR4 in
step6:在R1的BGP进程下针对邻居R2用入方向route-map将两条路由的AS-path加长,此时R1关于这两条路由选择了R4为最优路径(因为as-path更短)——选路原则第4步
route-map FR2 permit 10
match ip address prefix-list R4
set as-path prepend 2 2 2
route-map FR2 permit 20
router bgp 100
neighbor 12.1.1.2 route-map FR2 in (在进去之前添加 2 2 2 ,即是2 2 2 100)
要在R2进程下进行out方向的时候就是在出去之前添加2 2 2,即是100 2 2 2
step7:在R4的BGP进程下针对邻居R1用出方向route-map将两条路由的local-preference设为10,此时R1关于这两条路由选择了R2为最短路径(local-Pre越高越优)——选路原则第2步
route-map TR1 permit 10
match ip address prefix-list R4
set local-preference 10
route-map TR1 permit 20
router bgp 100
neighbor 1.1.1.1 route-map TR1 out
step8:此时的R3因为学习到R4的cost值更下,所以两条BGP路由优选了R4,在R3上做邻居R1做入口的route-map改两条跌幅weight=100,这样R3关于R2的两条路由选择R1作为最优路径(Weight)
route-map FR1 permit 10
match ip address prefix-list R1
set weight 100
route-map FR1 permit 20
router bgp 100
neighbor 1.1.1.1 route-map FR1 in
权重不能使用out方向,否则提示:% "FF1" used as BGP outbound route-map, set weight not supported
IBGP下一跳默认是不变的
路由器一定是将本地最优条目发给邻居,其他的次优条目不会传递给邻居