目录
概述
BGP AS
BGP 邻居
BGP 更新源
BGP TTL
BGP AS_Path
BGP 路由表
BGP Synchronization
Path Attributes
BGP RIB-Failure
BGP 最优路径选择
BGP 基础实验
BGP 路由聚合
BGP 默认路由
BGP 路由过滤
BGP 条件路由
BGP Peer Group
BGP Community
BGP Reflector(BGP反射器)
BGP Confederation(BGP联邦)
BGP 后门路由
BGP Dampening
BGP 重分布进IGP
概述
在当前所使用的计算机网络中,一个网络,通常使用一个IP网段来表示,要将所有网络连接起来,并且要通信,就需要将这些IP网段连接起来,让每个IP网段都知道其它IP网段的信息,就可以实现全网通信。将网络与网络连接起来的设备是路由器,只要网络中每一台路由器都知道所有IP网段的信息,就可以为全网提供数据转发,如果某一台路由器不能得知所有的IP网段信息,也就表示这台路由器所连接的网络不能与其它网段通信。为了帮助路由器获得全网的IP网段信息,因此路由协议工作在路由器与路由器之间,路由协议将网络中每一条路由(IP网段)在路由器与路由器之间传递,最终让网络中每一台路由器都拥有全网完整的路由信息,从而实现全网可达。
从上可以看出,路由协议在路由器之间传递路由信息,是保证网络通信的基础,如果路由协议传递了错误的路由信息,或者没有传递路由信息,将导致某些网络通信的中断,所以路由协议从一台路由器收到路由更新后,必须毫不保留地传递给其它路由器,而当一个网络失效后,也必须告知其它路由器该网段不可达,需要将相应路由删除。
当全网每一台路由器都拥有所有的路由信息,并且完全一致时,这种状态被称为收敛状态,一个网络只有在收敛状态时,才能保证全网可达。而当今所使用的最庞大的互联网,是由数万台路由器连接起来的,如果每一台路由器都拥有互联网中的每一条路由信息,那么就意味着每一台路由器都将拥有数十万甚至数百万条路由条目,这个数量是惊人的。但是由于路由协议的特征以及互联网全网通信的需求,就必须让互联网中每一台路由器将自己的路由信息与其它路由器互换,最终使整个互联网的达到收敛状态。虽然这是铁定的要求,但是请仔细想一下,这是万万不可能的,因为一个拥有数万台路由器组建起来的超大型网络,永远不可能达到收敛状态,因为当某个网络断开时,最先得知的路由器需要将这个信息告知给其它所有路由器,因为信息是一台传一台传过去的,所以一个网络断开的信息要让数万台路由器都知道,这需要很长的时间,并且可能在这个信息还没有传遍整个网络时,这个之前中断的网络就恢复了正常,那么这时,最先知道的路由器又要重新向网络中通告该网段恢复正常的信息,如此一来,互联网中不断变化的网络,会让所有路由器不停地传递路由信息,结果是导致网络中路由信息的不一致,也将导致庞大的路由更新影响所有路由器的性能。因此,互联网中,一个网络的中断与恢复,实在没有必须通告给数以万计的路由器。而网络的信息,必须向其它路由器通告,那么,一台路由器的路由信息,既然没有必须向网络中每一台路由器通告,那么,它究竟该通告给哪些路由器呢?或者换句话说,它的路由更新通告的范围究竟有多大呢?
基于以上种种原因,所以我们将一台路由器的路由更新限制在一定的范围内,也只有这样,一个被划分为更小范围的网络,才能达到收敛状态。所以现实情况是,我们的互联网被划分成了一个一个更小范围的网络,而任何一台路由器的路由更新,被限制在这个特定的范围内,而这个特定的范围,就是你应该知道的被称为自治系统的网络范围,即autonomous system(AS) 。我们设计了互联网中路由协议的更新只应该在一个AS内部传递,但是互联网是需要全网通信的,所以必须让每一个AS都能够获得其它AS的路由信息才行,因此,路由协议被定义为两种截然不同的种类,即只在一个AS内部更新的路由协议,称为Interior Gateway Protocol (IGP) ,以及在AS与AS之间更新的路由协议,称为Border Gateway Protocol (BGP)。
需要更多的解释,将互联网划分成多个AS,目的并不仅仅是将路由协议的更新限制在特定的范围内,还有一个重要的原因是,将互联网划分成若干个小范围的网络后,那么这每一个小网络就可以单独定义各自的路由策略与安全策略,并且这样不需要干扰其它AS,也不受其它AS干扰。比如网络中若干的ISP,这些ISP对自己的网络需要制定自己的策略,又需要让这些策略保持私有性而不与其它ISP互相干扰,所以划分AS,帮他们实现了这个目的。
只能在一个AS内部传递更新的IGP路由协议有RIP,EIGRP,OSPF,IS-IS,可以在AS之间传递更新的路由协议目前只有BGP。但是有个特别之处是,EIGRP也使用了AS的概念来工作,运行EIGRP的网络也会被划分成多个AS,虽然默认情况下,EIGRP不能在AS与AS之间更新路由信息,但是EIGRP也可以实现AS之间的路由更新。需要说明的是,EIGRP概念中的AS与BGP的AS并无任何关联,它们之间没有任何共同操作性,真正的AS是指BGP的AS,而EIGRP不管有什么样的AS特征,它永远被限制在BGP的单一AS之中。
BGP AS
对于BGP的AS号码的分配,是由Internet Assigned Number Authority (IANA)机构来统一规划和分配的,IOS中运行的BGP,目前最多支持4字节长度的AS号码,但并不表示所有AS号码都能任意配置,在2009年1月之前,只能使用最多2字节长度的AS号码,即1-65535,在2009年1月之后,(IANA)决定使用4字节长度AS,范围是65536 -4294967295。
当前,通常还是使用2字节长度的AS,也就是1-65535,所以不对4字节的AS号码做太多讨论。因为BGP是使用在互联网之中的,互联网由多个BGP AS域组成,所以互联网中不能出现AS号码相同的域,如果一台路由器要接入互联网并运行BGP,那么必须向IANA申请合法的AS号码。为了考虑到某些大型企业需要使用BGP与ISP对接,而又没有足够的AS号码用来分给企业用户,所以将AS号码划分为公有AS和私有AS,公有AS的范围是1-64511,私有AS范围是64512-65534;公有AS只能用于互联网,并且全球唯一,不可重复,而私有AS可以在得不到合法AS的企业网络使用,可以重复。很显然,因为私有AS可以被多个企业网络重复使用,所以这些私有AS不允许传入互联网,ISP在企业用户边缘,需要过滤掉带有私有AS号码的路由条目。
BGP 邻居
如果你在自己的PC上从某个FTP服务器去下载文件,那么你的PC只要和FTP服务器是通畅的即可,也就是说你的PC只要ping得通FTP服务器就行,不管距离有多远,因为不可能每个从FTP服务器上下载文件的PC都与之是直接连在一起的;PC从FTP服务器下载文件时,使用的是TCP传输,当数据在中途出现丢包时,被丢弃的数据包能够得到重新传递,从而保证下载的文件是完整的。由于BGP运行在整个互联网,传递着数量庞大的路由信息,因此需要让BGP路由器之间的路由传递具有高可靠性和高准确性,所以BGP路由器之间的数据传输使用了TCP协议,端口号为179,并且指的是会话的目标端口号为179,而会话源端口号是随机的。
正因为BGP使用了TCP协议传递,所以两台运行BGP的路由器只要通信正常,也就是说只要ping得通,而不管路由器之间的距离有多远,都能够形成BGP邻居,从而互换路由信息。
一个配置了BGP进程的路由器只能称为BGP-Speaker,当和其它运行了BGP的路由器形成邻居之后,就被称为BGP-Peer。如果一个网络中的多台路由器都运行OSPF之后,那么这些路由器会在相应网段去主动发现OSPF邻居,并主动和对方形成OSPF邻居。而一个路由器运行BGP后,并不会主动去发现和寻找其它BGP邻居,BGP的邻居必须手工指定。
BGP和其它路由协议一样,传递的是网络层协议,如IP协议,除此之外,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 模式中配置,在NLRI 模式中配置的参数只对Ipv4单播生效。
IOS支持四个AFI模式,为:IPv4, IPv6, CLNS, VPNv4,并且IPv4和IPv6还有单播和组播之分。
思科路由器运行的BGP为version 4,一台路由器只能运行一个BGP进程,并且整台路由器只能属于一个AS,但是一台路由器可以承载多个address family,而一个支持多个address family的BGP和一个不支持的可以正常通信,但这也仅限于Ipv4。
一台BGP路由器运行在一个单一的AS内,在和其它BGP路由器建立邻居时,如果对方路由器和自己属于相同AS,则邻居关系为internal BGP (iBGP),如果属于不同AS,则邻居关系为external BGP (eBGP)。BGP要求eBGP邻居必须直连,而iBGP邻居可以任意距离,但这些都是可以改变的。
在BGP形成邻居后,最开始会交换所有路由信息,但是之后都采用增量更新,也就是只有在路由有变化时才更新,并且只更新有变化的路由。
BGP建立邻居后,会通过相互发送类似hello包的数据来维持邻居关系,这个数据包称为Keepalive,默认每60秒发送一次,hold timer为180秒,即到达180秒没有收到邻居的Keepalive,便认为邻居丢失,则断开与邻居的连接。
BGP之间建立邻居,需要经历如下几个过程:
Idle—BGP进程被启动或被重置,这个状态是等待开始,比如等于指定一个BGP peer,当收到TCP连接请求后,便初始化另外一个事件,当路由器或peer重置,都会回到idle状态。
Connect—检测到有peer要尝试建立TCP连接。
Active—尝试和对方peer建立TCP连接,如有故障,则回到idle状态
OpenSent— TCP连接已经建立,BGP发送了一个OPEN消息给对方peer,然后切换到OpenSent状态,如果失败,则切换到Active状态。
OpenReceive— 收到对方peer的OPEN消息,并等待keepalive消息,如果收到keepalive,则转到Established状态,如果收到notification,则回到idle状态,比如错误或配置改变,都会发送notification而回到idle状态。
Established— 从对端peer收到了keepalive,并开始交换数据,收到keepalive后,hold timer都会被重置,如果收到notification,就回到idle状态。
BGP 更新源
BGP并不能主动在网络中寻找邻居,必须手工指定BGP邻居的地址,那么BGP才会将数据包发往指定的地址来请求建立邻居,与此同时,BGP发出的请求数据包除了写明目标IP地址外,还要写上自己的IP地址,即BGP源地址。路由器自己产生流量后从接口发出时,流量从哪个接口被发出,那么这些数据包的源IP地址就是哪个接口的地址。因此当BGP发出数据包寻找邻居时,这些数据包从哪个接口被发出,那么BGP源IP地址就是哪个接口的地址。要两台BGP路由器要正常建立邻居,必须双方路由器都相互指定邻居,相互发送数据包才行。当一台BGP路由器收到建立邻居的请求后,如果发现数据包的目标IP不是自己的BGP源地址,那么就拒绝该连接请求,只有当请求数据包的目标IP与自己的BGP源地址相同时,才可建立BGP邻居。需要注意的是,这个条件只在两个邻居之间,任意一个邻居满足条件即可,并不需要双方都满足,也就是说一方收到的数据包目标IP与自己的BGP源地址相同即可,另一方收到的数据包目标IP与它的BGP源地址不同也没关系,只要单方面符合条件就行,但我们通常都将BGP两端的源与目标保持一致。BGP的源地址是可以随意更改的,但只能是路由器上的接口地址。
如下图
在上图中,R1与R2之间有两条链路,当配置BGP邻居时,如果R1指定邻居地址为12.1.1.2,R2指定邻居地址为12.1.1.1,那么在建立邻居过程中,R1将请求数据包从接口F0/0发出,数据包的目标IP为12.1.1.2,BGP源地址为F0/0的接口地址12.1.1.1, 当R2将请求数据包从接口F0/0发出时,数据包的目标IP为12.1.1.1,BGP源地址为F0/0的接口地址12.1.1.2,由于R1发出的数据包目标IP12.1.1.2与R2的BGP源地址12.1.1.2完全相同,所以最终能够正常建立BGP邻居。R1在检测地址时,R2的目标IP与R1的源也完全相同,通常我们都保证双方一致。
当R1与R2之间的直连接口F0/0中断后,如果双方将数据包从S0/0发出,那么R1的源地址就是10.1.1.1,R2的源地址就是20.1.1.2,由此可以看出,双方发出的数据包的目标IP都与对方的源地址不符,所以无法建立BGP邻居。虽然在上面的网络环境中,双方路由器之间都拥有多条链路,在中断某条链路之间,仍然可以通信,但是这并不能保证BGP邻居的永久连接。为了使拥有多条链路的BGP邻居之间永远保持连接,考虑到路由器的loopback口在设备正常工作的情况下,不会像物理接口那样出现中断,所以建议在BGP邻居之间使用loopback接口的地址来建立TCP连接,当指定邻居时,不再将邻居的地址指定为对方物理接口地址,而改为指定对方的loopback地址,这样一来,既然物理接口中断,只要还有通畅的链路,那么BGP邻居仍然可以保持连接。在将BGP邻居地址指定为对方loopback地址时,为了使数据包的目标IP与对方的BGP源地址相同,所以邻居也要将BGP源地址更改为自己的loopback接口地址,从而使得双方正常建立BGP连接。
在上图中,当R1指定邻居地址为2.2.2.2,BGP源地址为1.1.1.1,而R2指定邻居地址为1.1.1.1,BGP源地址为2.2.2.2,这样一来,双方的目标IP都与对方的BGP源地址相同,所以可以正常建立邻居,并且在双方链路中,任何一条链路断开,都不影响邻居的会话,BGP的连接仍然保持而不会中断,实现了连接的冗余性和稳定性。
BGP TTL
一台BGP路由器只属于一个AS,在建立BGP邻居时,如果对方路由器和自己属于相同AS,即在同一自治系统内部,则邻居关系为internal BGP (iBGP),如果属于不同AS,即邻居在自治系统外部,则邻居关系为external BGP (eBGP)。考虑到外部自治系统的路由器对BGP发起DOS攻击,所以BGP要求外部BGP邻居,即eBGP邻居必须与自己直连,而iBGP邻居可以任意距离。这些控制是通过控制BGP数据包的TTL值来实现的,将建立eBGP邻居时发出的数据包的TTL值限制为1,就限制了eBGP邻居必须直连,而由于iBGP邻居可以在任意位置,所以建立iBGP邻居时发出的数据包的TTL值为最大,即255。对于建立eBGP的数据包的TTL值可以随意修改,甚至改为255都行。
BGP AS_Path
BGP的路由可能会从一个AS发往另外一个AS,从而穿越多个AS。但是由于运行BGP的网络会是一个很大的网络,路由从一个AS被发出,可能在经过转发之后,又回到了最初的AS之中,最终形成路由环路,所以出于防止环路的目的考虑,BGP在将路由发往其它AS时,也就是发给eBGP邻居时,需要在路由中写上自己的AS号码,下一个AS收到路由后,再发给其它AS时,除了保留之前的AS号码之外,也要添加上自己的AS号码,这样的写在路由中的AS被称为AS-path,如果BGP收到的路由的AS_PATH中包含自己的AS号码,就认为路由被发了回来,以此断定出现了路由环路,最后就会丢弃收到的路由。BGP只有在将路由发给eBGP时,才会在AS-path中添加自己的AS号码,而在发给iBGP时,是不会添加AS号码的,因为iBGP邻居在同一个AS中,即使要添加,AS号码全是一样的,所以没有必要。
如下图:
在上图中,当路由穿越各个AS时,所有发给eBGP邻居的路由,都会在AS-path中添加自己的AS,自己的AS总是添加在AS-path的最前面。例如一条路由从AS 10被发往AS 20,则AS-path为“10”,当AS 20将路由发往AS 30时,添加上自己的AS号码20之后,AS-path变成“20,10”,当AS 30将路由发往AS 50时,最终AS 50收到的路由的AS-path为“30,20,10”。当AS 30将路由发给AS 40,AS 40再将路由发给AS 10时,路由的AS-path为“40,30,20,10”,由于AS 10在收到路由后,发现AS-path中包含自己的AS号码10,所以认为出现环路,便丢弃收到的所有路由。
在IGP协议中,我们将路由协议分成两大类:距离矢量路由协议和链路状态路由协议,而BGP被划分为路径矢量路由协议(path-vector routing),路径矢量算法结合了距离矢量特性与AS-path防环特性。
因为BGP在将路由发给eBGP邻居时,会将自己的AS号码添加到AS-path中,所以可以以此来防止环路,而在将路由发给iBGP时,是不会往AS-path添加AS号码的,因此在iBGP之间传递路由时,没有防止环路的机制。考虑到为iBGP之间的路由传递也加入防环机制,因而强制将BGP路由在AS内部只传一跳,具体操作为:一台BGP路由器从eBGP邻居收到路由,发给iBGP邻居之后,iBGP邻居收到后就不能再传给其它任何iBGP邻居,只能传递给eBGP邻居。此规则被多数人称为BGP的水平分割,就是一台BGP路由器从iBGP邻居收到的路由,不能传递给其它iBGP邻居,只能传给eBGP邻居。如下图:
在上图中,当R1从eBGP邻居R6那里收到路由后,可以发给任何iBGP邻居,包括R3和R4,当R3从iBGP邻居R1那里收到路由后,不可以转发给任何iBGP邻居,只可以转发给eBGP邻居,所以R3从R1收到路由后,只能转发给eBGP邻居R5。由于R3和R4从R1收到路由后,都不可以转发给iBGP邻居R2,在上图环境中,最终造成R2无法接收任何路由,要让R2收到路由,建议在R1与R2之间再建立一条BGP会话,所以如此一来,在同一个AS中,要将路由全网传递,就需要在iBGP邻居之间配置全互联,最终AS 20内的邻居关系如下图:
在AS内部,除了建立全互联的iBGP邻居关系外,还可以通过BGP Reflector(BGP反射器)和BGP Confederation(BGP联邦)的方式来实现路由全网传递,将在后续介绍。
BGP 路由表
当路由器之间建立BGP邻居之后,就可以相互交换BGP路由。一台运行了BGP协议的路由器,会将BGP得到的路由与普通路由分开存放,所以BGP路由器会同时拥有两张路由器,一张是存放普通路由的路由表,被称为IGP路由表,就时平时我们使用命令show ip route看到的路由表,IGP路由表的路由信息只能从IGP协议和手工配置获得,并且只能传递给IGP协议;另外一张就是运行BGP之后创建的路由表,称为BGP路由表,需要通过命令show ip bgp才能查看,BGP路由表的路由信息只能传递给BGP协议,如果两台BGP邻居的BGP路由表为空,就不会有任何路由传递。在初始状态下,BGP的路由表为空,没有任何路由,要让BGP传递相应的路由,只能先将该路由导入BGP路由表,之后才能在BGP邻居之间传递。默认情况下,任何路由都不会自动进入BGP路由表,BGP路由表的路由获得有多种方式,可以从BGP邻居获得,也可以手工将IGP路由导入BGP路由表,还可以将其它路由重分布进BGP,只要BGP的路由不是从邻居学习到的而是手工导入的,那么这样的路由被称为BGP本地路由。
因为BGP的邻居类型分为两种:eBGP和iBGP,所以BGP路由的AD值也有区分,如果BGP的路由是从eBGP学习到的,AD值为20,可以发现,从eBGP邻居学习到的路由,将优于任何IGP协议;从iBGP学习到的路由的AD值为200,同样可以发现,此类路由的优先级低于任何IGP协议。BGP除了以上两种AD值之外,如果BGP路由是从本地手工导入的,即BGP本地路由,则BGP本地路由的AD值为200,与iBGP路由的AD值相同,优先级低于任何IGP协议。
如果某一条相同的路由同时从eBGP和iBGP以及本地路由学习到,那么究竟哪条路由会被选择为最优路径呢?路由的AD值并不一定会影响到路径选择,因为BGP并不会在一开始,就通过比较AD值来选择最优路径。
BGP Synchronization
BGP邻居之间的通信与交流运行在TCP的基础上,在两个节点之间,只要网络是通的,就能够建立TCP建立,网络的连通,可以是任何IGP路由协议,甚至是静态路由,总之,只要网络是通的,TCP连接就一定能够建立起来。只要让两台路由器之间连通,保证TCP能够正常连接,就能够保证BGP的通信。在一个AS中,除了需要建立BGP连接之外,同时还需要运行IGP协议,其中运行BGP的目的是为了在大型网络中传递庞大的路由表或路由信息,而运行IGP协议的目的可想而知,并不是为了传递庞大的路由信息,在AS中运行IGP的根本目的是为了让BGP路由器之间能够建立TCP连接,从而为BGP的通信服务。因此可以看出,BGP就像是一辆运货的卡车,BGP的路由就是卡车要运的货,而IGP协议就是为了在站与站之间铺平道路,如果没有IGP去让道路连通,那么BGP就无法在站与站之间运送货物。
因为BGP在建立邻居时,BGP的源地址可以是任意地址,这些地址可以不是直连的,只要是能通信的,能建立TCP连接即可。当BGP在向邻居发送流量时,只要将流量发往邻居的对端地址,因为邻居的地址并不一定是直连的,所以要找到去往邻居地址的路径,可能需要查询IGP路由表,因为IGP为BGP的通信与连接提供了保证。由此可见,BGP要将数据发给邻居,BGP在查询去往邻居的路径时,采用的是递归查询,BGP查询去往邻居的过程中,可能要多次查询IGP路由表,只要在IGP路由表中找到了去往邻居地址的相应路径或相应下一跳,那么就会将数据发给这个下一跳。
在上图的网络中,R1与R4建立eBGP连接,R3与R5建立eBGP连接,而R1与R3建立iBGP连接。在R1与R3建立iBGP连接时,R1通过目标地址3.3.3.3找到邻居R3,R1的BGP源地址为1.1.1.1,而R3也通过目标地址1.1.1.1找到邻居R1,R3的BGP源地址为3.3.3.3,为了让1.1.1.1和3.3.3.3能够正常通信,从而建立TCP连接,R1、R2、R3之间启用了IGP协议OSPF,OSPF的目的只是为了使1.1.1.1能够与3.3.3.3通信,并不传递AS中庞大的路由信息。
当AS 10中的R4将网段10.1.1.0/24通告给AS 20中的R1后,因为R1与R3之间是iBGP邻居,所以R1将路由10.1.1.0/24传递给R3,最终R3将路由10.1.1.0/24传递给AS 30中的R5。当R5将目的地为10.1.1.0/24的流量发给R3时,R3在查询路由表后得知,去往10.1.1.0/24的数据包需要发给iBGP邻居1.1.1.1才能够到达,于是R3便执行递归查询,查询如何去往1.1.1.1,正因为R1与R3之间的通信是靠OSPF提供的,所以R3得知去往1.1.1.1必须将数据包交给R2,即交给下一跳23.1.1.2,因为R2只运行了OSPF为BGP服务,所以R2没有BGP的路由10.1.1.0/24,当R2发现数据包的目标地址为10.1.1.0/24后,只能将数据包全部丢弃,这就类似于路由黑洞。
从以上情况中可以看出,当BGP从iBGP收到路由时,因为邻居之间可能跨越了多台IGP路由器,所以BGP在将数据包发往目的地时,通常会发给一台只运行了IGP的路由器,而只运行IGP的路由器并没有BGP的路由,因而最终导致数据包丢失,造成路由黑洞。要杜绝此类问题的发生,其实答案很明了,就是让AS中只运行IGP的路由器同时也拥有BGP的路由表即可。由于以上原因,在BGP路由传递中,有以下一条规则:当BGP要将从iBGP邻居学习到的路由信息传递给其它邻居之前(这个邻居通常是eBGP邻居),这些路由必须在IGP路由表中也能学到,否则认为此路由无效而不能发给其它邻居。
此规则称为iBGP与IGP路由同步。
在上图环境中,在R3将从iBGP邻居R1学习到的路由传递给eBGP邻居R5之前,必须确定这条路由在自己的IGP路由表中也存在,否则不使用该路由。要查看路由在IGP路由表中是否存在,使用命令show ip route即可。
注意,只有从iBGP邻居学习到的路由,才受iBGP与IGP路由同步规则的限制,如果路由是从eBGP邻居学习到的,则不受此规则限制,并且此规则可以手工开启或关闭。
BGP 同步默认是开启的,在IOS 12.2(8)T 以及之后的版本默认都是关闭的。
Path Attributes
在默认情况下,到达同一目的地,BGP只走单条路径,并不会在多条路径之间执行负载均衡。对于IGP路由协议,当有多条路径可以到达同一目的地时,则根据最小metric值来选择最优路径,而BGP存在多条路径到达同一目的地时,对于最优路径的选择,BGP并不会以metric值大小为依据,BGP对于最优路径的选择,需要靠比较路由条目中的Path Attributes,即路径属性,只有在比较多条路由的属性之后,才能决定选择哪条为最优路径。BGP的每条路由都带有路径属性,BGP的路径属性可以划分为以下四类:
公认强制 (Well-Known Mandatory)
公认自选 (Well-Known Discretionary)
可选可传递 (Optional Transitive)
可选不可传递(Optional Nontransitive)
对于各属性的各特征如下:
公认强制 (Well-Known Mandatory)
对于任何一台运行BGP的路由器,都必须支持公认强制属性,并且在将路由信息发给其它BGP邻居时,必须在路由中写入公认强制属性,这些属性是被强制写入路由中的,一条不带公认强制属性的路由被BGP路由器被视为无效而被丢弃,一个不支持公认强制属性的BGP,是不正常的,不合法的BGP。
BGP路由必须携带的公认强制属性有三个:Origin,Next_Hop,AS-path。
公认自选 (Well-Known Discretionary)
公认自选属性并不像公认强制属性那么严格,任何一台运行BGP的路由器都必须支持公认自选属性,必须理解和认识公认自选属性,但是为路由写入公认自选属性并不是必须的,是否要为路由写入公认自选属性可以自由决定,为路由写上公认自选属性之后,所有BGP路由器都能认识和理解,并且都会自动保留和传递该属性。
可选可传递 (Optional Transitive)
并不是所有运行BGP的路由器都能理解和支持可选可传递属性,路由的可选可传递属性是任意写入的,其它BGP路由器并不一定能理解,也并不一定能保留和传递该属性,但是当为路由设置了可选可传递属性后,可以明确要求BGP路由器保留和传递该属性。
可选不可传递(Optional Nontransitive)
只有特定的BGP路由器才理解和支持可选不可传递属性,并且可选不可传递属性理论上是不能手工设置的,即使手工设置了可选不可传递属性,这些属性也不能任意传递,只可以传递到特定的BGP路由器。
以下是一些常用BGP属性的介绍:
1.Origin(公认强制属性):
在路由器之间建立BGP邻居之后,邻居之间只能相互传递BGP路由表中的路由,在初始状态下,BGP的路由表为空,没有任何路由,要让BGP传递相应的路由,只能先将该路由导入BGP路由表,之后才能在BGP邻居之间传递。默认情况下,任何路由都不会自动进入BGP路由表,只能手工导入,对于路由是怎么进入BGP路由表的,这种方式会被记录在路由条目中,称为Origin属性,Origin属性就反映出了路由是如何进入BGP路由表的。要将路由导入BGP路由表,有三种方式,
第一:因为路由器上默认会有IGP路由表,通过命令show ip route可以查看到,这些IGP表中的路由可以被手工导入BGP,通过在BGP进程模式下使用命令network,即可将IGP表中的相应路由导入BGP路由表,并且需要指定掩码,只有network后面的网段和掩码在IGP路由表中能找到时,才会进入BGP路由表,并不能通过这种方式将一条不存在的路由凭空导入BGP,通过命令network被导入BGP的路由的Origin属性为IGP属性。
第二:BGP可以从EGP路由协议中获得路由信息,而EGP已经被淘汰,被BGP所取代,所以我们很难遇见EGP路由协议,从EGP路由协议获得的路由的Origin属性为EGP。
第三:BGP路由表除了从IGP和EGP获得路由外,还可以将路由重分布进BGP路由表,而重分布的路由的Origin属性为Incomplete。
当BGP路由表中到达同一目的地存在多条路径时,会通过比较路由的Origin属性来选择最优路径,它们的优先级为IGP优于EGP,EGP优于Incomplete,即IGP>EGP>Incomplete。
2.AS_Path(公认强制属性):
AS_Path中包含了BGP路由器到达目的地所经过的所有AS的集合,AS_Path中会包含了多个AS号码,号码的多少,逻辑上反映了到达目的地的远近。
AS_Path还能细分为:
AS_SEQUENCE(有序的AS号码,即AS号码在AS_Path中是按一定顺序排列的)
AS_SET(无序的AS号码,即AS号码在AS_Path中的排列是没有顺序的,通常是将多条拥有不同AS_Path的路由汇总后产生的)
当BGP路由表中到达同一目的地存在多条路径时,会优选AS-Path最短的路径。
3.Next_Hop(公认强制属性):
也就是BGP将数据包发往目的地的下一跳,BGP路由的下一跳,就是BGP建立邻居时的地址,也是BGP之间建立TCP连接所使用的地址。因为这个地址可以是路由器上任意接口的地址,是要能通信即可(其连通性由IGP提供保证),所以BGP在将数据包发往下一跳时,通常需要采用递归查询在IGP路由表中查询该下一跳地址。默认情况下,一台BGP路由器将路由传递给eBGP邻居时,会将Next-hop属性改为自己的地址,也就是和对方建立邻居所使用的地址,而在将路由传递给iBGP邻居时,不会改变Next-hop属性。
对于将路由传递给BGP邻居时,是否改变Next-hop属性的功能,可以自由关闭或启用。
BGP路由表中由本地产生的路由而不是从BGP邻居学习来的,即本地发起路由的Next-hop属性都为0.0.0.0。
4.Local_Pref(公认自选属性):
Local_Pref称为本地优先级,其中的(Local)本地就是指本AS,或AS内的意思,所以可以想象得出,Local_Pref属性的传递范围,只在同一个AS内有效,一条路由的Local_Pref属性只能在同一AS内部传递,出了AS后就会被还原成默认值。
Local_Pref属性在BGP邻居之间是自动传递的,只有在将路由发给iBGP时才会传递,而在发给eBGP时,是没有Local_Pref值的,一条路由的Local_Pref属性在一个AS内的所有BGP路由器上是完全相同的。Local_Pref的默认值为100,由此可以看出,一条路由在AS内的所有路由器上默认值为100。
本地优先级属性是用于区分到同一目的地的各个路由优先程度的。本地优先级越高,路由优先级越高。默认值为100。
当BGP路由表中到达同一目的地存在多条路径时,会比较Local_Pref值的大小,Local_Pref值大的会被选为最优路径,如110与100,那么110会被选为最优路径。
Local_Pref值可以被随意修改,修改后将在整个AS内传递,所以推荐使用Local_Pref属性来控制一个AS的路由器去往目的地在其它AS的路径。如下图:
在上图中,AS 10中的BGP路由器R3可以同时通过R1与R2去往目的地在AS 20中的R4上时,可以通过在AS 10内部修改路由的Local_Pref值来影响选路,比如在R1上将路由的Local_Pref值改为110,而路由器R2上不作任何改动,最终R3将选择从R1去往AS 20,因为R1的Local_Pref值为110,而R2的Local_Pref值为100(默认),所以R3选择R1为最优路径。
因为R1和R2在将路由发给iBGP邻居R3时会携带Local_Pref属性,所以R3同时比较iBGP邻居R1与iBGP邻居R2时,才合适使用Local_Pref属性,因为下一跳都是iBGP邻居,如果下一跳不都是iBGP邻居,并不建议修改Local_Pref属性来影响选路。
5.MULTI_EXIT_DISC(MED,可选不可传递属性):
MED就是BGP路由中的metric,是被设计用来影响在多个下一跳都为eBGP邻居时,如何选择最优路径,因为在多个下一跳都为iBGP时,是建议使用修改Local_Pref属性来影响选路的,而多个下一跳都为eBGP时,则使用MED。MED是BGP路由的metric,所以多条路径中拥有最小MED值的路径会被优先使用。MED默认值为0。
Local_Pref属性只在同一个AS内部传递,而MED只能在AS之间传递,只有在将路由发给eBGP邻居时,才会传递MED,在发给iBGP时,是不会传递MED的。当一条路由被设置MED值后传递给eBGP邻居,在eBGP邻居收到后,如果将该路由继续传递给iBGP邻居,那么这个值会被还原为默认值0,也就是说同一个AS内,所有发给iBGP邻居的路由的MED值都为0,这是为了让所有AS内部路由器都能够拥有相同的选路结果。
MED值也是可以随意修改的。
在上图中,当AS 20中的路由器R4要去往目的地为AS 10的网段时,由于下一跳R1与R2都为eBGP邻居,所以可以通过修改MED值来影响R4对于下一跳的选择。比如将R2的MED改为10,而R1的MED保持默认不变,那么最终R4将选择R1去往AS 10中的目的地,因为R1的MED值0小于R2的MED值10,所以被优先使用。
默认情况下,只有当去往目的地的多个下一跳eBGP邻居都为相同AS时,才会比较MED值,如果多个eBGP邻居为不同AS时,是不会比较MED的,若是要强制在多个不同的eBGP邻居之间比较MED值,需要在BGP进程下输入命令:bgp always-compare-med。
6.Weight
Weight属性为Cisco私有属性,只有Cisco的路由器才能认识和理解Weight。路由的Weight属性只在路由器本地起作用,BGP将路由传递给邻居时,并不会保留Weight。Weight值的范围为0~65535,默认为0,如果是BGP本地路由,则Weight值为32768。可以手工任意修改路由的Weight值,可以对路由进行修改,也可以对整个邻居进行修改,但也只能对本地起作用,路由的Weight值并不会传递给邻居。
当BGP路由表中到达同一目的地存在多条路径时,会优选Weight值最大的路径。在Cisco路由器中,比较最优路径的第一条规则就是比较Weight值,所以只要改动Weight值,就绝能够控制Cisco路由器的BGP选路。
其它属性,在应用中继续介绍。
BGP RIB-Failure
在BGP的路由表中,并非所有的路由都会被BGP使用,默认情况下,BGP到任何目的地,只选择单一路径。在BGP路由表中,只有最优路由才会被BGP使用,也只有最优路由才会发给BGP邻居,需要说明的是,思科官方强调BGP会将所有路由发给邻居,请以实际为准。BGP路由要被标为最优路由必须达到以下两个条件:
★下一跳可达
★如果是从iBGP收到的路由,则必须满足IGP与iBGP同步,除非该规则已被关闭。
如果某BGP路由的状态为RIB-Failure,则是不能被使用的,被定为RIB-Failure的原因有:
★该路由在IGP中已经拥有比BGP更高优先级的AD值。
★内存错误
★超出VRF中的路由限制数。
而BGP建立邻居的条件如下:
★双方需要建立邻居的IP地址在网络上是互通的,可以建立TCP会话。
★双方指定的AS号码必须匹配
★双方BGP数据包必须可达(eBGP默认TTL为1,需要注意)。
★对方BGP数据包的目的IP和自己的源IP必须相同(单向满足即可)
略略略
参考
China-CCIE CCIE R&S v4.0 理论→BGPhttp://www.china-ccie.com/ccie/lilun/bgp/bgp.html#66