电子政务 网络管理 网络技术

BGP基础

来源:网络部发布时间:2017-07-11 字体:[] [][关闭][打印]

 

 概述

   在当前所使用的计算机网络中,一个网络,通常使用一个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支持classless interdomain routing (CIDR)

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路由器运行在一个单一的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 路由表

  当路由器之间建立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值来选择最优路径。