原文:http://blog.sina.com.cn/s/blog_be409c2f0102x6sg.html
BGP(Border Gateway Protocol)边界网关协议
BGP(Border Gateway Protocol)边界网关协议是一种运行在TCP上用于AS(Autonomous System,自治系统)之间的动态路由协议,BGP是唯一一个用来处理像因特网大小的网络协议,也是唯一能够妥善处理好不相关路由域间连接的协议。默认不负载(最大负载数量:6)
BGP可以支持classless interdomain routing(CIDR)无类别域间路由
首先介绍一下AS:
目前,通常还是使用2字节长度的AS,也就是0-65535;
公有的AS范围是:0-64511
私有的AS范围是:64512-65535
公有AS只能用于互联网,并且全球唯一,不可以重复;而私有AS可以在得不到合法公有AS的企业网使用,可以重复,私有AS不允许传入互联网,ISP在企业用户的边缘,需要过滤掉带有私有AS号的路由。
2009.1月之后,(IANA)决定使用4字节长度的AS,范围是65536-4294967295
只能在一个AS内部传递更新的IGP路由协议有:RIP、EIGRP、OSPF、IS-IS;可以在AS之间传递路由更新的路由协议只有BGP。
BGP路由器之间的数据传输使用TCP协议的179端口,并且指定回话的目标端口为179,而会话源端口号是随机的
BGP的邻居必须手工指定才可以。
open报文用于发现邻居,只发一次;维持邻居关系的数据包称为Keepalive=60s(默认);Holdtime=180
当全网每一台路由器都拥有所有的路由信息,并且完全一致时,这种状态被称为收敛状态,一个网络只有在收敛状态时,才能保证路由全网可达。
建议使用Lookback接口建立邻居的原因:
为了使拥有多条链路的BGP邻居之间永远保持连接,考虑到路由器的Loopback接口在设备正常工作的情况下,不会像物理接口那样出现中断,所有建议在BGP邻居之间使用Lo接口地址来建立TCP连接。
当指定邻居时,不再将邻居的地址指定为对方物理接口地址,而改为指定对方的Lo地址,即使物理接口中断,只要还有通畅的链路,那么BGP邻居仍然可以保持连接。再将BGP邻居地址指定为对方Lo地址时,为了使数据包的目标IP与对方的BGP源地址相同,所以邻居也要将BGP源地址更改为自己的Lo接口地址,从而使得双方正常建立BGP连接。
BGP的两种AD值:EBGP20、IBGP200
因为BGP的邻居类型分为两种:EBGP和IBGP;所以BGP路由的AD值也有区分,如果BGP路由是从EBGP学习到的,AD=20 EBGP邻居学习到的路由优于任何IGP协议;从IBGP学习到路由AD=200,优先级低于任何IGP协议。 BGP除了以上两种AD值之外,如果BGP路由是从本地手工导入的(本地路由),则BGP本地路由的AD=200,与IBGP路由的AD值相同,优先级低于任何IGP协议。
1、邻居:不需要直连,只要有能到达对方的路由,使用单播TCP建立
2、BGP只传路由不传数据,控制层面(路由)源、目的地址每过一路由器都变;而数据层面源、目的地址一直不变,若中间路由器没有该目的地址,数据层面可能会造成路由黑洞。
解决办法:物理线路全互连、BGP邻居逻辑全互连、MPLS(最好)
3、BGP的水平分割原则:(防环)
1)EBGP:不接受包含自己AS号的BGP路由
2)IBGP:从IBGP学到的路由不会通告给其他的IBGP邻居(BGP路由在AS内部只传一跳),所以IBGP邻居需要全互连(路由反射器、联邦)
4、配置:
router bgp 123
bgp router-id 11.1.1.1
neighbor 22.1.1.1 remote-as 123
neighbor 22.1.1.1 update-source lo 0(自己的回环接口地址,单向就可以建立,建议双向)
neighbor 22.1.1.1 next-hop-self
neighbor 22.1.1.1 ebgp-multihop 2
IBGP邻居之间用环回口建立邻居,默认的源地址是物理接口,如果用环回口建立邻居必须手动指定源地址;而EBGP一般使用物理接口,若用回环口,需要改成多跳,默认是1跳,EBGP间若用环回口建立邻居,因为不通IGP,没有对端环回口路由,所以还必须运行静态路由或者IGP动态路由协议。
5、IGP:network宣告的是接口
BGP:network宣告的是路由,只要是本地AS内的路由,都可以宣告出去,路由表中存在的路由,才能被BGP通告出去,必须精确匹配
network 4.4.4.0 255.255.255.0 宣告前看路由表,精确匹配才能宣告出去
6、非最优路由:不传给其他BGP邻居、也不会放入路由表
造成非最优路由的原因:
1)不同步:
从IGP学到、写静态路由或者关闭同步(保证不存在路由黑洞的前提下,中间路由也运行BGP,建立全互连IBGP邻居)
2)下一跳不可达:
从IBGP学到、写静态路由或者改变下一跳(在边界路由器写)neighbor 3.3.3.3 next-hop-self
7、同步:从IBGP学到的路由,同时也在IGP学到,才能传给其他BGP邻居、放进路由表(防止数据层路由黑洞)
Peer Group(减少Buffer,减少命令行)
router bgp 1
neighbor WOOW peer-group
neighbor WOOW remote-as 1
neighbor WOOW update-source lo 0
neighbor 22.1.1.1 peer-group WOOW
neighbor 33.1.1.1 peer-group WOOW
8、MA网络的下一跳特性:ICMP重定向(自动完成)
9、用r标识的路由:IGP和BGP学到同一条路由,但是IGP学到的路由管理距离更小,该路由就会标识r,不放进路由表,但是会传递给邻居
10、清理和重启BGP:
1)硬清:clear ip bgp *
2)软清:clear ip bgp * soft (in/out) 不断TCP连接
11、BGP聚合:
1)手工写静态路由指向Null0(路由汇总)在用network 发布汇路由
2)network明细路由,一条一条的宣告,再aggregate-address做聚合,默认是把聚合和明细都宣告进去
aggregate-address 192.168.16.0 255.255.252.0 summary-only :仅宣告聚合路由,此时明细路由标识了s,表示抑制路由,不会传给邻居
可选择宣告特定路由,写抑制列表:aggregate-address 192.168.16.0 255.255.252.0 suppress-map WOOW,在调用route map WOOW配合ACL或者prefix-list。
在接收方做聚合:
明细路由来自源方,聚合路由在接受方生成,并反传给源方,可能导致丢包,所以不能让路由回传(把明细路由的属性加入到聚合链路上)
aggregate-address 192.168.16.0 255.255.252.0 summary-only as-set:当汇总路由继承了明细路由的AS-path,源方就不会接受该路由了。
12、在重分布 或者BGP中使用route-map,如果要让明细路由过来,必须写一条空的。
BGP路由要被标为最优路由必须达到以下两个条件:
★下一跳可达
★如果是从iBGP收到的路由,则必须满足IGP与iBGP同步,除非该规则已被关闭。
如果某BGP路由的状态为RIB-Failure,则不能被使用,被定为RIB-Failure的原因有:
★该路由在IGP中已经拥有比BGP更高优先级的AD值。
★内存错误
★超出VRF中的路由限制数。
BGP建立邻居的条件如下:
★双方需要建立邻居的IP地址在网络上是互通的,可以建立TCP会话。
★双方指定的AS号码必须匹配。
★双方BGP数据包必须可达(eBGP默认TTL为1,需要注意)。
★对方BGP数据包的目的IP和自己的源IP必须相同(单向满足即可)。
Weight属性为Cisco私有属性
BGP还能够传递除IP协议之外的其它网络层协议,能够传递的协议如下:
IP Version 4 (IPv4),
IP Version 6 (IPv6),
Virtual Private Networks version 4 (VPNv4),
Connectionless Network Services (CLNS),
Layer 2 VPN (L2VPN).
这些协议被称为address family,配置需要进入相应的协议address family模式,而Ipv4除外。所有命令在address family中独立配置,独立生效,并且都拥有独立的数据库。正常的BGP配置模式被称为NLRI 模式,而address family模式称为AFI模式;MPLS,只能在AFI中配置;在NLRI 模式中配置的参数只对Ipv4单播生效。
BGP的路径属性可以划分为以下四类:
公认强制 (Well-Known Mandatory)
公认自选 (Well-Known Discretionary)
可选可传递 (Optional Transitive)
可选不可传递(Optional Nontransitive)
BGP路由必须携带的公认强制属性有三个:Origin,Next_Hop,AS-path。
1.Origin(公认强制属性):
默认情况下,任何路由都不会自动进入BGP路由表,只能手工导入,对于路由是怎么进入BGP路由表的,这种方式会被记录在路由条目中,称为Origin属性,Origin属性就反映出了路由是如何进入BGP路由表的。
1、将IGP表中的相应路由导入BGP路由表,并且需要指定掩码,只有network后面的网段和掩码在IGP路由表中能找到时,才会进入BGP路由表,并不能通过这种方式将一条不存在的路由凭空导入BGP,通过命令network被导入BGP的路由的Origin属性为IGP属性。
2、BGP路由表除了从IGP和EGP获得路由外,还可以将路由重分布进BGP路由表,而重分布的路由的Origin属性为Incomplete。
3、当BGP路由表中到达同一目的地存在多条路径时,会通过比较路由的Origin属性来选择最优路径,它们的优先级为IGP优于EGP,EGP优于Incomplete,即:IGP>EGP>Incomplete。
2.AS_Path(公认强制属性):
AS_Path还能细分为:
1、AS_SEQUENCE(有序的AS号码,即AS号码在AS_Path中是按一定顺序排列的)
2、AS_SET(无序的AS号码,即AS号码在AS_Path中的排列是没有顺序的,通常是将多条拥有不同AS_Path的路由汇总后产生的)
当BGP路由表中到达同一目的地存在多条路径时,会优选AS-Path最短的路径。
3.Next_Hop(公认强制属性):
1、默认情况下,一台BGP路由器将路由传递给eBGP邻居时,会将Next-hop属性改为自己的地址,也就是和对方建立邻居所使用的地址,而在将路由传递给iBGP邻居时,不会改变Next-hop属性。
2、BGP路由表中由本地产生的路由而不是从BGP邻居学习来的,即本地发起路由的Next-hop属性都为0.0.0.0。
4.Local_Pref(公认自选属性):
1、Local_Pref称为本地优先级,其中的(Local)本地就是指本AS,Local_Pref属性的传递范围,只在同一个AS内有效,一条路由的Local_Pref属性只能在同一AS内部传递,出了AS后就会被还原成默认值。
2、Local_Pref属性在BGP邻居之间自动传递,只有在将路由发给iBGP时才会传递,而在发给eBGP时,没有Local_Pref值,Local_Pref的默认值为100,一条路由在AS内所有路由器上的默认值是100.
3、本地优先级属性是用于区分到同一目的地的各个路由优先程度的。本地优先级越高,路由优先级越高;推荐使用Local_Pref属性来控制一个AS的路由器去往目的地在其它AS的路径。
5.MULTI_EXIT_DISC(MED,可选不可传递属性):
1、MED就是BGP路由中的metric,是被设计用来影响在多个下一跳都为eBGP邻居时,如何选择最优路径;多条路径中拥有最小MED值的路径会被优先使用。MED默认值为0。MED只能在AS之间传递,只有在将路由发给eBGP邻居时,才会传递MED,在发给iBGP时,是不会传递MED的。
2、同一个AS内,所有发给iBGP邻居的路由的MED值都为0,这是为了让所有AS内部路由器都能够拥有相同的选路结果。
6.Weight
1、Weight属性为Cisco私有属性,只有Cisco的路由器才能认识和理解Weight。路由的Weight属性只在路由器本地起作用,BGP将路由传递给邻居时,并不会保留Weight。Weight值的范围为0~65535,默认为0,如果是BGP本地路由,则Weight值为32768。
2、当BGP路由表中到达同一目的地存在多条路径时,会优选Weight值最大的路径。在Cisco路由器中,比较最优路径的第一条规则就是比较Weight值,所以只要改动Weight值,就绝能够控制Cisco路由器的BGP选路。
BGP最优路径选择
在默认情况下,到达同一目的地,BGP只走单条路径,并不希望在多条路径之间执行负载均衡。
1.最高Weight值(选择最高Weight值的路由,Weight值为Cisco私有,并且只有本地有效,默认Weight值为0,本地发起路由为32768。
2.最高LOCAL_PREF值(如果Weight值相同,则选择拥有最高LOCAL_PREF值的路由,默认为100。)
3.本地发起路由
(如果LOCAL_PREF值相同,则选择BGP本地发起的路由: 也就是下一跳为0.0.0.0的路由,本地发起的路由有多种方式,如通过在BGP进程下命令network命令从IGP路由表导入,将其它路由协议重分布进BGP路由表,最后是汇总路由表。而通过命令network和重分布的路由优先于手工汇总的路由。)
4.最短AS_PATH
(如果本地发起路由无法比出最优路径,则选择拥有最短AS_PATH的路由,但是可以跳过这一步,输入命令bgp bestpath as−path ignore后,就会忽略对AS_PATH的比较,而直接比较下一属性。需要更加注意的是,AS_SET被认为是1个AS,而无论AS_SET中包含多少个AS,并且BGP联邦内部AS不被计算。)
5.最低Origin类型
(如果AS_PATH无法比出最优路径,则选择拥有最低Origin类型的路由,Origin表示路由最初是如何进入BGP路由表的,目前有三种进行BGP路由表的方法,从IGP导入,从EGP学习,以及重分布,它们的优先级为IGP优于EGP,EGP优于Incomplete,即IGP>EGP>Incomplete。
6.最小MED值
(如果Origin类型无法比出最优路径,则选择拥有最小MED值的路由,并且只有当多个下一跳邻居在同一AS时才比较MED值。如果要在多个不同AS的下一跳中比较MED,可在BGP进程中输入命令bgp always-compare-med,注意须保证此命令在整个AS的路由器上输入,否则可能产生路由环路。默认的MED值为0,如果收到一条没有MED的路由,也认为是0。)
7.eBGP优于iBGP
(如果MED值无法比出最优路径,则选择下一跳为eBGP的邻居而不选择iBGP邻居。都知道eBGP的路由AD值为20,而iBGP的路由AD值为200,但BGP并不在eBGP与iBGP之间比较AD值,并且在比到此步时,邻居类型才影响了最优路径的选择,这种影响是受邻居类型的影响,而不是受AD值的影响。注意:BGP联邦内部没有此规则。)
8.最小IGP metric到达下一跳的路由
(如果多条路径的下一跳邻居同为eBGP或iBGP,则选择拥有最小IGP metric到达下一跳的路由。)
9.负载均衡(如果开启的话)
(BGP并不是不能负载均衡的,如果之前的属性都无法选出最优路径,则执行负载均衡,但必须是之前的所有属性均完全相同,缺一不可。需要注意:只有负载均衡功能开启了,BGP才会执行负载均衡,否则,继续比较下一属性。)
在开启负载均衡功能时,在BGP进程下输入以下命令:
maximum-paths n (多条路径的下一跳邻居都为eBGP时,输入此命令)
maximum-paths ibgp n(多条路径的下一跳邻居都为iBGP时,输入此命令)
其中n为执行负载均衡的路径数量,最大值为6,默认为1,也就是不执行负载均衡。
如果在eBGP和iBGP邻居之间同时执行负载均衡,输入命令maximum-paths eibgp n,此命令只支持在Ipv4 VRF模式下输入,就是只能支持MPLS VPN下的eBGP和iBGP邻居之间负载均衡。
10.如果下一跳都为eBGP,则选择最早学习到的路由(即时间最长的路由)
(为了避免路由翻动,所以选择最早学习到的路由,如果要忽略比较路由学习到的时间长短,可在BGP进程下输入命令bgp best path compare−routerid,某些IOS已经自动加入此命令,并且不能删除。如果多条路由拥有相同的Router-ID,比如路由是从同一个邻居学习到的,同样也会忽略比较路由学习到的时间长短。)
11.最低Router-ID下一跳
(BGP的Router-ID选举如同OSPF,在此步,拥有最低Router-ID的下一跳路由将被选为最优路径。)
12.最短cluster list(如同AS_PATH)
[cluster list只在BGP reflector (RR)的环境下才有,功能如同AS_PATH]
13.最小下一跳的邻居地址
(如果比较之前的所有属性都无法选出最优路径,最终选择下一跳的邻居地址最小的路由,这个地址就是在建立邻居时所指的地址,也是邻居和自己建立TCP连接所使用的源地址,建立不同邻居,不可能使用相同地址,所以不可能两个不同路径的邻居地址是相同的,在这一步一定能够选出最优路径.)