BGP属性
路由器发送关于目标网络的BGP更新消息,更新的度量值被称为路径属性。属性可以是公认的或可选的、强制的或自由决定的、传递的或非传递的。属性也可以是部分的。并非组织的和有组合都是合法的,路径属性分为4类:
1——公认强制 2 ——公认自由决定 3 ——可选传递 4 ——可选非传递
well-known mandatory well-known discretionary optional transitive optional nontransitive
公认属性,指的是公认所有BGP实现都必须能够识别的属性。这些属性被传递给BGP邻居。公认属性总是可传递的。公认强制属性必须出现在路由描述中,公认自由决定属性可以不出现在路由描述中
可选属性,非公认属性被称为可选的,可选属性可以是传递的或非传递的;可选属性不要求所有的BGP实现都支持。对于不支持的可选传递属性,路由器将其原封不动地传递给其他BGP路由器,在这种情况下,属性被标记为部分的。对于可选非传递属性,路由器必须将其删除,而不将其传递给其他BGP路由器。
BGP每条更新消息都有一个长度可变的路径属性序列<属性类型,属性长度,属性值>,如果第1比特是0,则属于是公认属性,如果它是1,则该属性是可选属性,如果第2比特是0,则该属性是不可传递的,如果它是1,则属性是可传递的,属性标志域中的第3个比特指示任选可传递属性中的信息是部分的(值为1)还是完整的(值为0),第4个比特确定该属性长度是1字还是2字节,标志域其他4个比特总为0.属性类型代码字节含有属性代码。如下图所示。
BGP路由几种基本属性和对应的类别
1)AS路径属性(AS-path)
AS_PATH是一个公认必选的属性,它用AS号的顺序来描述AS间的路径或到NLRI(Network Layer Reachability Information,网络层可达信息)所明确的目的地的路由。当每个运行运行BGP的路由器发起一条路由——当它在自己的AS域内公布一个有关目的地NLRI——它将自己的AS号附加到AS_PATH中。当后续的运行BGP的路由器向外部的对端公布路由,它将自己的AS号附加到AS_PATH中。AS_PATH可以描述所有它经过的自治系统,以最近的AS开始,以发起者的AS结束。如下图所示。
AS_PATH有2个值,AS_SET和AS_SEQUENCE。通常主要包含的是AS_SEQUENCE,即每经过一个AS,那么会从左边添加上AS号。show ip bgp,每穿越一个AS,path属性会在左边加上自治系统的号,如依次经过的自治系统号为300 200 100,那么会显示,100,200,300。
AS_SET的作用是将汇总后隐藏的AS号显示出来。
只有将更新消息发送给在另一个AS域内的邻居时,BGP路由器才将它的AS号加到AS_PATH中,也就是说只有在两个EBGP对等体之间公布路由时,AS号才被附加到AS_PATH中。可以通过使用AS附加改变其公布路由的AS_PATH来影响数据流的流向。AS_PATH属性的另一个功能就是避免环路,如果BGP路由器从它的外部邻居收到一条路由,而该路由AS_PATH包含这个BGP路由器自己的AS号,那么该路由器就知道是条环路路由。如下图所示。
AS号进行隐藏,如下配置所示。
下面是AS属性的另一个实例,如下图所示。
R1在发送更新的时候,剥除私有AS号;并且不将AS100的路由传播给其客户路由器R3,配置如下所示。
聚合后继承明细路由的属性,在大括号里面的as-path在计算长度时,只算一个。在联盟内小括号里面的AS号,在选路时,不计算到as-path长度里面。增加as-path的长度,可以用route-map里面的set as-path prepend来做,如:
neighbor 1.1.1.1 route-map AS {in|out} route-map AS set as-path prepend 10 10
在neighbor的入向做as-path prepend。是在as-path靠近我的地方加长度,如:10 10 2i 。10 10是新加的。而在neighbor的出向做as-path prepend。是在AS起源的方向加path长度,如:2 10 10i 。10 10是新加的。在as-path prepend的后面还有一个参数,last-as,如:
route-map AS set as-path prepend last-as ? <1-10> number of last-AS prepends
意思是将离我最近的AS,将它的AS号在as-path里面再重复出现几次。这个10看起来可以和allowas-in里面的10对应起来。假如as-path prepend 与as-path prepend last-as合用的时候,last-as先生效,然后prepend再生效。减小as-path的长度,如用联盟和remove-private-AS等可以实现。注意:Remove-private-as,如果在as-path里交替出现私有和公有的AS号,这样将无法将私有AS号去掉。在起源的时候,连续的时候才有效。
bgp bestpath as-path ignore(隐藏命令),这条命令可以使我们在选路时,跳过as-path的选路,直接往下继续选择最优路径。
2)源头属性(Origin)
ORIGIN是公认强制属性,它定义了路径信息的源头。ORIGIN属性定义路由信息的来源,标记一条路由是怎么成为BGP路由的。它有以下三种类型:
IGP:优先级最高,路由在起始AS的内部,使用network命令通过BGP通告路由时通常属于这种情况。在BGP表中,IGP源头用i表示
EGP:优先级次之,说明路由是通过EGP获悉的,在BGP表中用e表示。
incomplete:优先级最低,它并不是说明路由不可达,而是表示路由的来源无法确定。例如,引入的其它路由协议的路由信息。在BGP表中,不完整源头用?表示
如下示例所示。
3)下一跳属性(NEXT_HOP)
NEXT_HOP为公认必选属性,描述了到公布目的地的路径下一跳路由器的IP地址。由BGP NEXT_HOP属性所描述的IP地址不经常是邻居路由器的IP地址,要遵循下面的规则:
如果正在BGP发言者和接收的路由器在不同的AS中(即EBGP对等体),NEXT_HOP是正在宣告路由器接口的IP地址,如下图所示。
如果BGP发言者和接收的路由器在同一个AS内(即IBGP对等体),并且更新消息的NLRI指明的目的地也在同一个AS内,那么NEST_HOP就是宣告路由的邻居的IP地址。如下图所示。
如果BGP发言者和接收的路由器在同一个AS内(即IBGP对等体),并且更新消息的NLRI指明目的地在不同的AS,则NEXT_HOP就是学习到路由的外部对等实体的IP地址。如下图所示。
从上面图可以知道,在去往192.168.5.0的网段中会出现路径不可达的情况,解决这个问题的方法是保证内部路由器知道与两处自治系统相连的外部网络,可以使用静态路由的办法,但实际的做法是在外部端口上以被动模式运行IGP。但在某种情况下,该方法并不理想。
第二种方法是采用配置选项来做,这个配置选项被称做next-hop-self。
解决下一跳不可达的方法:
※静态路由
※在IBGP邻居所处的IGP中宣告
※将与EBGP直连的网络重分布进IGP
neighbor x.x.x.x next-hop-self(将指向EBGP邻居更新源的地址变为自己的更新源地址)(RR有的版本会将下一跳改变)
一般情况下,在本路由器上将直连的网络引入BGP,下一跳为0.0.0.0,本路由器聚合的路由的下一跳也为0.0.0.0。
在本路由器上将从IGP学来的路由引入BGP时,在本路由器上看BGP的转发表,下一跳为IGP路由的下一跳。在多访问网络环境中,用直连接口建立邻居关系,会产生第三方下一跳。
实例说明:如下图所示,
R2与R1是IBGP邻居,R1与R3是EBGP邻居,当用直连接口建邻居时,R2引入BGP的前缀172.16.2.0/24,在R3的bgp转发表里,将显示为R2的多访问网络接口地址(如:10.1.1.2)。产生第三方下一跳的现象。
如果R1、R2、R3全部用直连接口建邻居时会产生第三方下一跳。
如果R1、 R2用环回口而R1、R3用直连建立邻居时,会产生第三方下一跳。
如果R1、R2用直连而R1、R3用回环口时,不会产生第三方下一跳,如下所示配置。
如果R1、R2、R3都用环回口建立邻居,则不会产生第三方下一跳,如下配置所示。
R3#show ip bgp BGP table version is 4, local router ID is 172.16.3.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.16.1.0/24 10.1.1.1 0 0 100 i *> 172.16.2.0/24 10.1.1.2 0 100 i *> 172.16.3.0/24 0.0.0.0 0 32768 i
R1 router bgp 100 no synchronization bgp log-neighbor-changes network 172.16.1.0 mask 255.255.255.0 neighbor 3.3.3.3 remote-as 200 neighbor 3.3.3.3 ebgp-multihop 2 neighbor 3.3.3.3 update-source Loopback1 neighbor 10.1.1.2 remote-as 100 no auto-summary R3 router bgp 200 no synchronization bgp log-neighbor-changes network 172.16.3.0 mask 255.255.255.0 neighbor 1.1.1.1 remote-as 100 neighbor 1.1.1.1 ebgp-multihop 2 neighbor 1.1.1.1 update-source Loopback1 no auto-summary
R3#sh ip bgp BGP table version is 8, local router ID is 172.16.3.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.16.1.0/24 1.1.1.1 0 0 100 i *> 172.16.2.0/24 1.1.1.1 0 100 i *> 172.16.3.0/24 0.0.0.0 0 32768 i
R1 router bgp 100 no synchronization bgp log-neighbor-changes network 172.16.1.0 mask 255.255.255.0 neighbor 2.2.2.2 remote-as 100 neighbor 2.2.2.2 update-source Loopback1 neighbor 3.3.3.3 remote-as 200 neighbor 3.3.3.3 ebgp-multihop 2 neighbor 3.3.3.3 update-source Loopback1 no auto-summary R2 router bgp 100 no synchronization bgp log-neighbor-changes network 172.16.2.0 mask 255.255.255.0 neighbor 1.1.1.1 remote-as 100 neighbor 1.1.1.1 update-source Loopback1 no auto-summary R3 router bgp 200 no synchronization bgp log-neighbor-changes network 172.16.3.0 mask 255.255.255.0 neighbor 1.1.1.1 remote-as 100 neighbor 1.1.1.1 ebgp-multihop 2 neighbor 1.1.1.1 update-source Loopback1 no auto-summary
R3#sh ip bgp BGP table version is 10, local router ID is 172.16.3.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.16.1.0/24 1.1.1.1 0 0 100 i *> 172.16.2.0/24 1.1.1.1 0 100 i *> 172.16.3.0/24 0.0.0.0 0 32768 i
第三方下一跳:收到路由更新的源地址与将要发出去的接口地址在同一网段的时候,路由的下一跳不改变,为原来路由更新的源地址。有时虽然路由的下一跳可达,但会出现访问网络出现环路的现象。
实例说明:
R5、R3,R1、R2为EBGP邻居关系,R1、R3为IBGP邻居关系。那么R5通过BGP传给R3的路由(如10.1.1.0/24),R3通过IBGP传给R1,R1通过EBGP传给R2,这时R2访问10.1.1.0/24这个网络的下一跳就在R1上。这时R2去访问R5的时候,就会产生环路。则R2(走下一跳)——R1(走物理链路)——R2,这样环路产生了。
解决方法:
neighbor x.x.x.x next-hop-unchanged (此命令只能用在EBGP多跳的环境下,将路由的下一跳,从自己的更新源地址改变为从IBGP学来的下一跳地址)(这时路由的下一跳在路由表里将改变。)
neighbor x.x.x.x route-map XX {in|out}然后在route-map里面set ip next-hop来改变前缀的下一跳。(在路由表里下一跳会改变。)
策略路由PBR,强制命令R2到10.1.1.0/24的时候走R3。(路由表里下一跳不会改变)
4)本地优先属性(Local preference)
本地优先级是公认自由决定的属性,它告诉AS中的路由器,那条路径离开AS的首选路径。本地优先级越高,路径被选中的可能性越大。本地优先级这种属性只能在同一个AS中的路由器之间交换,本是优先级只适用于内部邻居,用于内部对等体之间的Update消息。本地优先级,可以在本AS和大联盟内传递。越大越优先。影响路由器的出站流量。默认情况下,local-preference为100。
使用下面的命令,
Router(config-router)#
bgp default local-preference value
将路由器收到的所有外部BGP路由的默认本地优先级修改为指定值。对IBGP邻居路由器传过来的路由,不会改变它们的local-preference。如果将一个IBGP邻居传来的路由传给另外一个IBGP邻居,那我必须是RR。
实例说明:如下图所示。
优先级操作路径,如下所示路由器C的BGP表。
改本地优先级,如下所示。
查看路由器C 的BGP表。
5)原子聚合属性
原子聚合是一个公认自决的属性。类型代码为6,它告诉邻接AS,始发路由器对路由进行了聚合。可以使用下面的命令进行配置,
Router(config-router)#
aggregate-address ip-address mask [summary-only] [as-set]
命令只聚合已经包含在BGP表中的网络,这与使用network来通告汇总路由要求不同,后者要求网络必须出 现在IP路由选择表中配置命令aggregate-address后,一条与汇总路由对应的指向null0的BGP路由将自动被加入到IP路由表中。如下示例所示。
可以使用show ip bgp命令来查看
6)权重属性
权重属性是cisco私有的参数。本地有效。缺省条件下,本地始发的路径具有相同的WEIGHT值(即32768),所有其他的路径的weight值为0。越大越优选。影响路由器的出站流量。权重只影响当前路由器,指定邻居的权重。使用下面命令来修改权重。
neighbor {ip-address | peer-group-name} weight weight
可以在neighbor的入向设置。范围0-65535。Neighbor 1.1.1.1 weight 10,从对等体1.1.1.1接收过来的所有路由的weight值都设置为10。还可以用route-map来设定,可以将特定路由的weight值改变。如下所示:
Neighbor 1.1.1.1 route-map AA in Route-map AA permit 10 Match ip address prefix AA Set weight 10 Route-map AA permit 20
7)MED属性
MED属性也被称为度量值,是一种可选非传递属性。承载于EBGP的Update消息中。MED用于向外部邻居指出进入AS的首选路径,当入口有多个时,AS可以使用MED来动态地影响其他AS如何选择进入路径,在BGP中,MED是唯一一个可影响数据如何进入AS的属性。度量值越小,路径被选中的可能性越大。与本地优先级不同,MED是在自主系统之间交换的。MED影响进入AS的数据流,而本地优先级影响离开AS的数据流。如下图所示。
Metric和MED:BGP的metric对IBGP同样有效。特指med:从EBGP收到的metric比较的时候才叫MED,MED是借用了BGP的metric在EBGP的时候进行比较。MED(多出口区分)比较EBGP的metric找到最优的出口。
MED相当于IGP路由的metric值,越小越优先。在新的IOS中,将IGP中的路由重分布进BGP,BGP将自动继承IGP路由的metric值。在老的IOS里,如果需要继承需要在重分布时加route-map,如:
Redistribute rip route-map RE Route-map RE set metric-type internal
默认情况下,只有在两条路径的第一个(邻近的)AS相同的情况下才会进行比较:任何联盟内的子自治系统都被忽略。任何多跳路径,只有在AS_SEQUENCE中的第一个AS相同的情况下,才会比较MED;任何打头的AS_CONFED_SEQUENCE都将被忽略。如果激活了bgp always-compare-med,那么对于所有路径都比较MED,而不考虑是否来自同一个AS。如果使用了这个选项,就应该在整个AS中都这样做,以避免路由选择环路。
实例说明:如下拓扑图,下面是一个使用策略路由来实现修改MED值的案例。
实例说明:如下图所示,此实例采用了本地优先级与MED属性
8)共同体属性
BGP团体是一组共享某些共同特性的目的地,用于简化路由策略的执行,一个团体并不被限制在一个网络或一个AS之中。是另一种过滤入站或出站BGP路由的方法。COMMUNITY属性是一组4个8位组的数值,RFC1997规定,前2个8位组表示自治系统,后2个8位组表示出于管理目的而定义的标识符,格式为AA:NN,而思科的默认格式为NN:AA,可以使用命令ip bgpcommunity new-format将思科默认格式改为RFC1997的标准格式。团体属性是一个可传递属性,类型代码为8。
no_export——如果接收到的路由携带该数值,不通告到EBGP对等体。如果配置了联盟,则不能将此路由宣告到联盟之外。值:0xFFFFFF01;
no_advertise——如果接收到的路由携带该数值,不通告给任何对等体,包括EBGP和IBGP。值:0xFFFFFF02;
internet ——无任何值,所有路由器默认情况下都属于该团体,带此属性的路由在被收到后,应该被通告给所有的其他路由器。值:0;
local_as——带有此属性的路由在被收到后,应该被通告给本地AS域内的对等体,但不应该被通告给外部系统中的对等体,包括同一个联盟内其它自治系统中的对等体。值:0xFFFFFF03。
实例说明:如下图所示。