BGP;边界网关协议
使用范围;BGP范围,在AS之间使用的协议。
协议的特点(算法):路径矢量型,没有算法。
协议是否传递网络掩码:传递网络掩码,支持VLSM,CIDR
协议消息数据包封装:基于TCP封装(可靠的),端口号:179
AS:自治系统,自治系统范围:1-65535,分为公有AS(1-64512)和私有AS(64513-65535)
一、BGP协议特点:
1、BGP是一种路径矢量型路由协议。
2、BGP协议版本,当前版本V4(或叫V4+) V1,V2,V3(有类别的路由协议,不传递网络掩码) V4(无类别,支持传递网络掩码,仅仅支持IPV4单播路由传递) V4+(支持IPV4单播路由、IPV6单播IPV4组播,IPV6组播【一般的路由协议没办法运行组播,运行组播的协议叫做PIM(叫做协议无关组播)是一个完全独立的协议,和OSPF等常见的协议是完全不一样的,因为单播和组播干的就不是同一个事,单播我们更关注数据要去哪(关注目标地址),而组播与单播相反,它更多关注的是源地址】,VPNV4,VPNV6等,除了IPV4单播路由之外的其他的都称为MP-BGP——多协议BGP:注意的是,默认仅仅支持传递IPV4单播路由,传递其他方式路由时需要开启(激活) [BGP版本是从版本3和版本4开始直接使用的,跳过了V1,V2,它可以配置的版本只有V3和V4,因为BGP的很多东西都是直接继承的EGP,而EGP当初有EGP1和EGP2,在BGP设计出来的时候直接从版本3开始的。现在很多厂商的设备运行BGP之后,默认允许的版本是V4,但是它具备V4+的功能,V4+就是V4的增强版,除了支持默认的V4的IPV4单播路由外,其他的相关路由都支持,只是默认没有开启,要做的话需要一条命令给激活]
3、更新地址:单播更新(因为BGP是基于TCP的,TCP第一步就是三次握手,三次握手不能与组播,广播三次握手,所以只能是单播更新,不能是组播更新和广播更新等)
4、更新方式:触发更新,增量更新。触发更新(网络稳定时,BGP是不向外发送任何路由信息且是永久不发,只要不变就不发与OSPF不同,它没有三十分钟的链路状态刷新,网络改变时才向外发送的路由信息)。增量更新(网络路由信息改变时,只发送路由信息改变了的路由信息,其他没有改变的不发送,因为BGP中的属性太多了,若是都重新完完全全的发一遍则费时费资源等)。
5、BGP协议中存在大量的属性(是一种基于规则的路由协议)
6、BGP协议支持路由认证(几乎所有的路由协议都支持路由认证,只是BGP的路由认证比较个性,一般的路由认证是在协议本身上实施,BGP的路由认证是做在TCP的可选项里,在TCP的可选项里设置了账号密码,所以BGP的路由认证是基于TCP的)
7、支持BGP路由聚合(汇总)
8、BGP是一种非常消耗资源的路由协议(因为BGP的路由量很大,而且每一条BGP中的属性也很多。如何证明:比如一个路由器上只能运行一个BGP,而一个路由器运行OSPF可以运行多个OSPF,一个路由器上最多起31个OPSF。)
二、适合使用BGP的网络环境
1、传输AS(就是运营商级别的网络,也就是用户通过运行商的这个AS去访问连接这个AS的服务器)
2、多宿主(多出口的意思,比如说一个学校里很多学生老师的用户,在上网时要接入到运行商,也就是进入到另一个不同的AS比如接入的电信的AS,但是不可能只接入电信这一家AS,还要接入其他的AS,比如移动,联通等不同的AS,这种就叫做多宿主。一个网络连接着多个出口,虽然一个学校连接着多出口,多个AS宿主,但是学校是可以不做AS,BGP的,这种对网络的利用率很低,很多情况下,学校对于网络的区域出口划分不合理,对于重要的教学楼什么的地方连接的是稳定性高带宽高的出口,等这个出口挂掉之后再走另一个出口,而对于宿舍一些地方连接的是带宽低的出口,等这个出口挂掉之后再走另一个出口。简而言之就是学校将自己的网络划成了好几部分,某些网络比较重要的时候,就走稳定的出口,稳定的出口挂了,再走别的,对于学校宿舍等对学校无所谓的地方就走一个带宽低的出口,这个出口挂了再去走其他出口,这种就很不合理。合理的是我访问的是谁就走谁的出口,比如访问的服务器是放在电信的机房,而走的是移动或联通的出口去访问,这样的速度势必会很慢。正确的是我访问的服务器机房在电信,就走电信出去,在联通就走联通出去等……为什么不做BGP,是因为BGP对设备性能的要求高之外,对工程师还有足够的一个水平能够支持和维护这样大的一个路由条目数量)
3、需要对进入和离开的流量进行强大的策略控制时(使用BGP的最主要原因,不用IGP是因为IGP的属性很少,来来回回就修改一个metric值。自动化程度越高的协议,它的路由控制越难)
BGP除了速度慢一点,没有什么其他的缺点。
不适合使用BGP的条件:当自己对BGP知之甚少的时候不要使用BGP(说白点就是不懂BGP就不要使用BGP)除了这个之外能使用BGP就使用BGP最好。
三、BGP邻居关系
IBGP:内部BGP邻居
EBGP:外部BGP邻居
如何区分BGP关系,建立邻居的双方都属于同一个AS的就是IBGP,学到的路由叫做IBGP路由。如果建立邻居的双方不属于同一个AS建立的邻居关系就是EBGP,学到的路由叫做EBGP路由。
比如下图的拓扑图中,R1与R2建立的邻居关系就是EBGP,R2与R3建立的邻居关系就是IBGP。R1与R3建立的邻居关系也是EBGP。在IBGP协议里邻居关系建立或路由传递时,只能在直连之间传递(大多数用的组播更新,组播更新地址用的是224.0.0.X,而224.0.0.X的地址用的TTL值默认为1,所以不能跨网段传递路由,而BGP为什么行可以跨网段传递,是因为它是基于TCP的,TCP是要进行三次握手的,即只要两个IP之间能相互通信,就能进行三次握手,能够三次握手BGP就能传路由,跟中间传递的路由器没有关系,对于中间的路由器而言,它们只知道传递的是点对点的TCP数据包,而实质上这里面承载着BGP的路由信息)。
IBGP的防环机制:IBGP水平分割机制(IBGP只传一条规则,通过一个IBGP邻居学习的路由不能传递给其他的IBGP邻居);next-hop(在BGP中这个不是下一跳地址,而是下一跳属性)、起源者属性,簇ID列表。
其详细概述如下图所示:
EBGP邻居的防环机制:AS-Path AS路径防环,不接受AS-Path中包含自身AS号的路由信息。
详细概述如下图所示:
四、BGP的邻居状态机制
idle:初始化
connect:连接 active:活动
opensent:发送open报文 openconfirm:open报文确认
established:邻居状态
五、BGP消息数据包
open、keeplive、updata、notification
现在通过实验来对BGP的消息数据包和BGP的邻居状态机制统一进行一个说明。
拓扑图如下:
IP配置如下:
在R1和R2之间建立BGP邻居:
R1和R2之间建立BGP,BGP在传递路由之前,因为BGP是基于TCP封装,所以会先进行一个TCP三次握手。在BGP邻居关系建立的时候,双方要指定一个IP地址,比如R1和R2建立BGP邻居是用的物理接口R1用12.1.1.1和R2用12.1.1.2建立的,当BGP配置命令敲完之后,就要进入一个BGP的邻居状态机制(BGP邻居状态的切换)。第一个进入的状态是idle(初始化)状态,进入初始化状态尝试进行TCP三次握手,即R1和R2之间进行TCP三次握手并没有发送BGP数据包,TCP三次握手使用时针对BGP服务的端口号为179。所以在R1和R2进行TCP三次握手时,R1的高位端口号可能为10000连接的R2的129号端口,也可能是R2的高位端口10000连接的R1的179号端口。TCP三次握手在网络安全之OSI七层模型详解-CSDN博客该文中有讲解,是一个CS模型,客户端完成三次握手的第一步,然后服务器进行响应,客户端再次进行最终一个ACK的确认。但是目前R1和R2进行三次握手来传递BGP路由这个模型不是CS模型,它们两个都不是客户端或服务器端,它们谁先进行三次握手第一步不确定。可能是R1先发起,也可能是R2先发起(在思科中一般是IP地址大的一方先进行三次握手),谁先发送三次握手,另一方就会被抑制,简而言之,谁先发起三次握手无所谓。
在初始状态要检测到达对方的IP地址,例如该例子中的R1首先要检查自己的路由表,看到达对方R2的12.1.1.1有没有路由。因为是直连,所以12.1.1.1和12.1.1.2可以通信。如果是在非直连建立三次握手,例如R2的环回2.2.2.2和R4的环回4.4.4.4之间要进行TCP的邻居关系建立,首先要进行三次握手不管是R2和R4谁先发起,都要看一下到达对方有没有路由。也就是如果没有到达对方的路由,状态就会一直卡在idle(初始化)状态。
idle:初始化(开始进行一个TCP三次握手,如果进行TCP三次握手的双方没有对方的路由信息【或叫路由条目】的时候就会卡在初始化的状态)
初始化状态完成之后,就进入下一个状态connect(连接)状态和active(活动)状态。
为什么是connect和active状态?
因为双方在进行TCP三次握手建立的时候,总有一方是发起的一方,一方是被动响应的一方。而主动的一方将会进入active(活动)状态,被动响应的一方进入connect(连接)状态。也就是双方在进行三次握手的角色(主动和被动)的不同,到了BGP邻居状态切换的时候它们的状态也会不同。
进入了connect和active状态就意味着TCP三次握手完成,TCP的会话建立。到了connect和active状态依然没有发送BGP的消息数据包。
发起BGP的第一个包叫做open报文。这个open报文就是建立邻居关系,在三次握手完成之后,就知道了在哪两个路由地址之间进行BGP的邻居建立和路由传递。要建立BGP邻居就要发送open报文,open报文只具有建立BGP邻居关系的作用。通过发送open报文,在open报文里面携带了自己相关的一些参数和对方相关的一些参数,如果参数能够匹配,那么双方通过发送open报文就能够建立邻居,如果双方发送的open报文中有参数条件不匹配,则不能建立邻居关系。所以当三次握手完成之后进入了active状态和connect状态,其中有一方发送open报文,另一方很快也会发送open报文。一旦发送open报文,状态也会进入到下一个状态opensent(发送open报文)状态,一方发送open报文之后,对方只能接收open报文,对方接收到了open报文时就要去查看这个open报文中的一些属性和自己能不能建立BGP邻居关系,如果能够建立BGP邻居关系,那么该设备的状态就会进入openconfirm(open报文确认)状态。一般来说是主动发起三次握手的那一方先发送open报文,主动发送open报文的一方会率先进入opensent状态,被动的那一方会进入openconfirm状态,被动的一方不会进入opensent状态,直接进入openconfirm状态。被动的一方收到open报文后也得回一个open报文,主动的一方收到open报文后就从opensent状态进入openconfirm状态。也就是发送open报文的一方进入opensent状态,收到open报文的一方进入openconfirm状态。
比如下图为抓的包中,该包就是12.1.1.2给12.1.1.1发送的关于BGP的三次握手的第一个同步请求包,源端口为随机高位端口50267,目标端口为BGP端口179。
将该包打开后发现源地址为12.1.1.2,目标地址为12.1.1.1,源端口为一个随机高位端口50267,目标端口为179(BGP端口就是179)。根据该包就可以发现,该例中,R2和R1建立BGP邻居关系时,R2是主动发起的一方,R1是被动接收的一方。(一般是IP地址大的一方主动发起,但是也不绝对)
然后就是R1对R2进行的一个同步请求和确认。
然后R2最后对R1进行一个确认,到了这一步就完成了TCP三次握手。
在以上三次握手的过程中,R1和R2的状态依然处于一个idle(初始化)状态。
然后我们从下面接着查看open报文就发现是12.1.1.1先发送的open报文,然后12.1.1.2回给了12.1.1.1一个open报文。R1一旦发送open报文就进入opensent状态,而R2是被动接收open报文的一方就进入openconfirm状态。(一般而言是先发起三次握手的一方先发送open报文,但是不绝对,比如这里R2先发起三次握手,但是是R1先发送的open报文)。
然后我们打开open报文查看一下,可以发现它的TTL值为1,协议号为6,因为是基于TCP封装的,TCP的协议号就是6。
然后再打开下面BGP的open报文进行查看
open报文在BGP邻居关系建立的过程中只发送一次,能不能建立起来邻居就看这一次,但也不是绝对只发送这一次,它会等一个比较长的一段时间再次发送一个open报文,它的内部是有一个扫描周期的,这个扫描周期就是到了一定的时间之后它会重新检测一下哪些邻居关系发送open报文的发open报文,哪些邻居关系发送更新信息的发更新,该发相关配置的发相关配置。
以上就是open报文的一个内容。
对以上报文和状态部分内容进行一些小总结如下:
open报文:建立BGP邻居关系,只发送一次
BGP邻居建立关系(可用于BGP邻居没有建立起来时候的一个排查)
1、router-id必须不同
2、BGP认证一致(没有明文认证,只支持MD5认证)
3、指定正确的AS号
4、建立TCP三次握手的两端路由可达
以上已经进入了opensent状态和openconfirm状态。还有最后一个状态established(邻居状态),邻居状态,在发送keeplive报文时就进入了邻居状态。
通过抓包可以看到发送open报文后就发送keeplive报文了。该报文可以叫做保活报文,这个报文就是用来保持BGP邻居建立的。默认为30秒周期发送,超时时间默认为180秒。
在OSPF中hello包是用来建立邻居和维持邻居,而在BGP中将这个包拆成了两部分(open和keeplive)open用来建立邻居,keeplive用来维持邻居。当收到了对方发来的open报文后就发送回去keeplive报文,当给对方发送了keeplive报文后,对方就进入到邻居关系建立关系。对方收到后再回发一个keeplive报文,让自己也进入邻居关系建立状态。
BGP虽然是基于TCP封装的,TCP是可靠的,BGP后期还会进行一个周期性传输。为什么BGP是基于TCP的,后期还需要一个周期性的保活包?
在回复这个问题时先看看OSPF,OSPF中周期发送hello包是为了确认对方存在,为什么要确认对方存在?最核心的原因就是OSPF是触发更新的,如果是触发更新的,就要担心对方不存在,所以就需要一个hello包来维持邻居的建立,也起到了一个保活包的作用。
而BGP的更新方式也是触发更新的,也得需要一个邻居维持的机制,在BGP中就用的是keeplive报文。(注:除了RIP以外,其他动态路由协议都有触发更新的,所以在这些协议里面都有一个邻居保持机制且都要周期性的发送一个保活包。只不过在IGP协议中叫做hello,BGP中叫做keeplive)
到这里BGP的邻居就建立完成了。
当一个路由器运行了BGP,做了相关配置后。
首先第一步,查看路由,看是否有到达对方的路由。没有路由就持续在初始化状态。有路由就开始三次握手,完成三次握手之后,主动的一方进入active状态,被动的一方进入connect状态。接着发送open报文建立邻居。一旦发送open报文进行opensent状态,一旦收到open报文进入openconfirm状态。当收到open报文并检测其中的邻居建立条件是匹配的则发送keeplive报文,一旦收到keeplive报文则进入邻居状态。在整个BGP邻居建立的过程中,没有传递路由。基本只发送了hello包和keeplive报文,相当于OSPF只发送了hello包。
所以尤其注意的是:在BGP中邻居建立和发送路由是分开的。也就是建立邻居是建立邻居,传路由是传路由,邻居建立后,路由可传不可传。
以上就是BGP的邻居建立,邻居建立之后就要传递路由信息,传递路由信息用的是第三种报文,updata报文。
因为已经建立好了没有updata报文,所以对R1进行一个环回接口改变再改变回去再抓包就发现了有传递了updata报文。
进入其中一个updata报文中查看。
以上查看updata报文,我们就知道这是一条传递路由更新的报文,名字叫做updata,在updata里面包含了网络层可达信息(网络号和网络掩码),以及这条路由对应的相关属性。
由于为了方便查看第四种报文,所以没有通告路由以至于查看不到BGP路由,现在补上查看;
进行查看BGP邻居路由;可以看到12.1.1.1的BGP为版本4,AS号为100,关系为邻居关系,cost为0(也就是MED属性值为0),关系为EBGP。
信息传递完之后,一般是没什么干的了,但是BGP还有第四种报文,notification(报告或叫通告)报文,通告的意思,在IP数据包结构中的ECN(显示拥塞通告)里的通告就是notification。一般我们很多工程师和很多书上将BGP的这个notification不叫作报告,叫做错误报告。因为在BGP正常工作的情况下,是不发送notification的,很多情况下,一个路由器的一生都不会发送一个notification报告,也就是在正常工作情况下,是不发notification,不需要notification的。当配置出现了错误,BGP工作出现了错误的时候,才会发送notification。所以才叫BGP里的notification为错误报告。
现在进行一个错误的配置使之出现notification报告看看。
比如我将对端该为300,出现了错误报告
也就是BGP在出现各种各样的问题时候就会发送notification报告,在notification里包含了错误的主代码和错误的子代码,通过对错误的主代码和错误的子代码进行一个匹配,来分析出BGP为什么会发送notification报告。一般发送错误报告时,通过设备提示的英文错误就可以发现错误在哪,实在不知道就进行抓包,看这两个错误代码X-X去进行一个搜索对应错误在哪。
这就是第四个报文;notification报文
BGP邻居关系建立条件:
1、router-id 必须不同
2、BGP认证一致(只支持MD5认证)
3、指定正确的AS号
4、建立TCP三次插手的两端路由可达
BGP的四个报文;
1、open :建立BGP邻居关系,只収送一次。
2、keepalive :保活,维持BGP邻居关系。周期性収送周期时间keepalive 时间默认为60s,超时时间默认为180s。
3、update :更新包(有通告路由的,和撤销路由的)
4、notification :报告(错误报告)
以上就是BGP的邻居关系建立和它的几种消息数据包以及BGP邻居建立的条件。
六、BGP配置
IBGP:直连物理接口建立,非直连接口建立(环回接口)
EBGP:直连物理接口建立,非直连接口建立(环回接口)
拓扑图如下:下面进行IBGP的直连物理接口建立与非直连接口建立(环回接口)以及EBGP的直连物理接口建立与非直连接口建立(环回接口)
如拓扑所示有三个区域,AS 100、AS 200、AS 300,在AS 100和AS 300中都只有一个路由器,在AS 200中有R2,R3,R4三个路由器,在做BGP之前,我们要先保证区域内的路由器都能通信,也就是先在AS 200中配置一个IGP(RIP、OSPF等)先保证它们内部的通信。
例如这里就在AS 200中配置RIP:
注意AS与AS之间的网段不通告进去,即R1与R2之间的12网段,R4与R5之间的45网段,因为那就是属于外网的了。
接着查看配置的路由:在R2上查看,R3,R4的环回和34网段都学到了,说明R2,R3,R4之间都能进行通信了。
接着配置IBGP邻居。R2和R3之间使用物理接口去建立IBGP邻居:
BGP一定要配置一个peer,是因为BGP不想IGP用的要么单播要么组播,不管是单播还是组播只要IGP的接口一激活就无脑广播推这个接口的路由等信息,所以在IGP中使用的都是同一个命令network,在BGP中建立邻居和传递通告路由是分开的,因为BGP是基于TCP的,所以必须要确保是和对方的哪个IP之间建立准确的单播IP,以跟对方的IP地址之间进行三次握手。所以R2上的peer 23.1.1.2 as-number 200这个命令就是跟对方的23.1.1.2之间进行TCP三次握手,并且在建立BGP邻居的时候对方的AS号为200,在对方给自己发送open报文的时候,携带的AS号必须是200,如果在R3上起的AS号为100,而在R2上认为23.1.1.2的路由器上对应的AS号为200,那么在传递信息的时候会产生错误的AS,会发送notification报文。
现在进行查看它们之间的邻居状态:邻居是建立起来了的。
再查看它们的路由,会发现是空的。因为现在只配置了它们建立邻居的命令。
现在在R3和R4之间使用环回接口去建立邻居。
在R3上进行查看。发现有,且已经进入活动状态了,再等等查看就会发现一直处于active状态,它们建立不了邻居。因为R3,R4两个设备上运行的peer 3.3.3.3 as-number 200与peer 4.4.4.4 as-number 200,都是指的允许对方环回接口可以与自己的BGP 179号端口进行TCP三次握手建立连接,但是它们建立TCP三次握手的源地址是它们互相之间的出接口,比如R3与4.4.4.4建立三次握手的源地址是34.1.1.1而不是3.3.3.3,但是R4上指定的是3.3.3.3可以与自己的179号端口进行三次握手建立连接,所以源地址默认为出接口导致地址不匹配而拒绝三次握手,若是设备运行了BGP之后它的179号端口可以与任何地址进行三次握手建立连接,则BGP的安全性会出现很大的问题。同理R4与3.3.3.3建立TCP三次握手连接也是同理。(也就是说,双方允许的是对方的环回接口,而实际上对方使用的是自己的物理接口,与自己允许的IP地址不匹配而拒绝三次握手)。要解决这个问题就要在R3上或R4上或它们两个同时将它们给对方peer的地址发送数据时的默认源地址从出接口地址改为自己的环回接口地址。这样当它们建立三次握手时的源地址就变为自己的环回地址。若是修改R3的默认源地址为3.3.3.3则R3变为主动的一方,R4变为被动的一方,反之只修改R4的也是亦然。实际上出现双方环回接口地址建立BGP邻居建议双方都要修改。
现在在R3和R4上同时修改。R3的命令的意思就是针对4.4.4.4授权了它可以跟自己建立BGP邻居的时候可以跟自己的环回接口3.3.3.3建立,R4上的命令也是同理。也可以理解为将自己针对这个地址,自己与其建立邻居时自己使用的源地址为自己的环回地址。
现在再进行查看邻居关系。当跳出这个changed日志的时候就说明已经成功建立邻居了。其实只要进行一方的修改即可,只要对方授权自己的地址可以跟他进行三次握手就行。建立BGP邻居只要一方可以与其建立就行。
以上R2,R3,R4之间的IBGP邻居的建立就完成,现在进行EBGP邻居的建立。
现在进行R1与R2之间的EBGP使用物理接口建立。
接着进行邻居查看。发现已经与12.1.1.2建立完成,也就是 EBGP邻居建立与IBGP邻居建立使用物理接口建立一样。
现在进行R4与R5之间的EBGP邻居建立,使用环回接口建立。(使用环回接口建立稳定,一条链路断了只要还能双方通信就还在,而物理接口只有那一条链路,这条物理链路一旦故障断掉则无法继续建立),在进行环回接口建立EBGP邻居前,要保证双方能与对方的环回接口进行通信,启用OSPF,RIP,或写静态等保证其能通信即可。
比如这里就写静态。写完之后再用自己的环回地址去ping一下对方的环回地址进行验证是否能通信。但是不管是什么配置保证它们能互相通信,但就是不能写缺省,虽然写缺省也能通,但是BGP邻居不能建立,不是不能使用缺省,只是使用缺省不能主动发起三次握手。也就是确保两者里面至少有一个是明细路由。比如R4写缺省指向R5,R5写明细路由指向R4也可以,但是这样就是R5就是主动发起的一方,R4是被动的一方,反之亦然。
然后写邻居。
再进行查看BGP邻居。发现依然在active状态,第一个问题与IBGP里一样,更新源地址不同。
修改更新源:
再次查看,发现一直停在了初始化状态。这就说明了EBGP邻居非直连建立与IBGP邻居非直连建立不一样。不一样的原因有两个原因:
1、EBGP邻居建立存在直连检测
2、EBGP邻居建立发送的数据包 TTL值为1
在AS 200中,R2,R3,R4属于同一个区域,AS号都是一样的,它们的非直连建立BGP邻居非常正常,它们的TTL值默认为255。R1与R2和R4与R5之间属于EBGP,EBGP属于两个不同的AS,两个不同的AS之间一般是没有IGP的,正常情况下是不会存在像该例子中R4与R5之间写一个静态的,比如AS 300是运营商300,AS 200是运营商200,两方运营商的工程师一般是不知道与对方连接AS的设备的环回接口号的。所以EBGP就做了一个防护,EBGP默认情况下只能在直连之间建立邻居,所以他们得进行直连检测。我们对R4与R5做了一个源地址得修改,在R5或R4收到对方环回接口发来的TCP数据包时,收到TCP数据包得设备会检测包的源地址与自己收到这个包的接口地址是否在同一个网段,比如这里R5收到了R4的4.4.4.4发来的TCP数据包,R5收到该包的物理接口地址为45.1.1.2,4.4.4.4与45.1.1.2不在同一个网段,这就是直连检测失败,直连检测失败就会不接收这样的TCP数据包,导致一直处于初始化状态。这就是第一个原因。
第二个原因TTL值为1,这里TTL值为1无所谓,因为R4发出来R5就接收到了,只是R5收到之后再给其他设备转的时候TTL值就为0了,当其他设备收到后TTL值为0就不能够再转了。此时R4或R5用TTL值为1去发送是可以的,还不能建立的原因纯纯的就是第一个原因,直连检测了。如果在R4和R5之间还有一个路由器的话,就不止直连检测一个原因了,还有TTL值的原因了。
所以要解决现在R4和R5之间的情况就把EBGP的直连检测关掉(思科里面是可以关的,华为设备没有找到命令,可能关不了)或修改EBGP建立邻居的默认TTL值,改的比1大就行了。改的TTL值比1大有两个作用。
一、相当于把它的直连检测关闭了。
二、把EBGP之间发送的open报文里的TTL值真的改了。
所以在这里只需要去修改TTL值就行了,不必去关闭直连检测。这就是为什么华为设备里面找不到关闭直连检测的命令。修改TTL值既关闭直连检测又修改了直连检测。毕竟像R1与R2之间使用物理接口建立的情况很少,这样建立的稳定性太次,线路故障或有一方的接口出现问题就会导致邻居无法建立,而使用环回接口则只要双方还能通信就会一直建立。实际上两个EBGP设备之间运行一个独立的OSPF,这个OSPF不干任何事,目的就是让两个边界的换回路由可以互相学习,好处就是这样就可以在EBGP邻居之间,用非直连的环回接口建立EBGP邻居了。比如这两个设备中连接了好几根线,只用只要有一根线是通的它们的EBGP邻居依然存在。这其实就是BGP的后门路由,思科中专门有这个东西,华为中没有。
现在修改它们的TTL值。R4上修改了,R5也得修改,因为双方都有直连检测。范围为0-255,也可以不输入具体的TTL值直接回车,这样它修改的默认为255。
现在再查看它们的的BGP邻居。建立成功
以上就是EBGP邻居的环回接口建立的配置。
下面进行BGP的三张表的讲解。
第一张表BGP的邻居表,display bgp peer查看到的只是邻居表的删减版,相当于OSPF的dis peer brief一样。
真正的BGP邻居表为display bgp peer verbose,这里面就是BGP邻居的详细信息。这里面查看的到的就只有两个邻居,R2跟R1的,R2跟R3的。
这张表一般看的不多,当排错实在排不出来的时候才进行查看这张表。大多数看的是dis bgp peer这个BGP邻居表。
第二张表,dis bgp routing-table ,,查看为空。
进行BGP的路由通告。一般的IGP通告路由是激活接口,将激活的接口路由一股脑地给对方塞过去 的,而BGP通告的就是真的路由,也就是想通告什么与是不是自己的接口没有关系,即只要是BGP中有的路由就能进行network引入,且是非常准确的子网掩码引入。在IGP中是匹配范围,反掩码进行匹配,匹配之后激活,激活之后将激活的接口路由通告进去。而BGP则是直接做路由引入,不管这个路由什么情况,有就能直接引入。
比如将路由表中的1.1.1.0/24引入
。
引入完之后进入查看。发现引入进去了,1.1.1.0/24网段的路由。
再在R2上查看也学到了。
并且在R3上查看BGP第三张表也加表了。
进行ping测试也通了
现在在R1和R5上将它们俩的环回路由通告出去。
BGP路由优先级:
EBGP:255
IBGP:255
local BGP:255(这个本地BGP就是自己本地network通告的)当查看路由加表时看的优先级就是本地优先级。
在R2中1.1.1.1是优选并加表了的
在查看R3中的BGP routing-table时1.1.1.1这条路由并不是最优的(没有*>),造成这个的原因为下一跳不可达,即R3不可达12.1.1.1。还有一个是IBGP同步,一般来讲大多厂家的BGP同步是默认关闭的,不是影响路由最优的原因。
这里的undo synchronization就是关闭同步了的。
如果使得R3可达12.1.1.1的话就可以学习并加表了,比如这里做一个静态路由,再查看就发现是最优的了
且也加表
但在实际设备中是不可能这样解决问题的,所以需要解决这个问题,就需要了解下一跳为什么在传递时候就不可达了。
路由不优问题:
1、下一跳不可达。
2、IBGP同步。
下一跳属性规则:
1、network引入默认next-hop属性为0.0.0.0(这里的0.0.0.0不是不可达,而是下一跳本地)
2、network通告路由传递给EBGP邻居时,下一跳默认为更新源地址(即建立TCP三次握手的对方地址)
3、IBGP学习路由传递给EBGP邻居时,下一跳为EBGP邻居建立的更新源地址(EBGP邻居路由传递给EBGP邻居时也一样)
4、EBGP学习路由传递给IBGP邻居时,下一跳不发生改变。
注意:思科中默认将IGP协议通告进入BGP时,将源IGP路由的下一跳地址作为BGP路由的下一跳属性,传递给其他IBGP邻居时,IBGP邻居发现路由的下一跳属性为自己的接口地址,启用下一跳防环机制。阻止路由加表,下一跳属性具有防环功能。在华为中,将所有的路由通告进入BGP时,下一跳属性为0.0.0.0,并且传递给其他IBGP邻居时下一跳属性直接变为更新源地址,下一跳属性不存在防环功能,所有的再修改优先级时可能导致路由环路。(在思科中,若IBGP和EBGP邻居都使用MA 网络进行连接,同时EBGP邻居使用MA物理接口建立邻居,此时将IBGP邻居路由传递给EBGP邻居时,下一跳属性为到达IBGP邻居的MA物理接口地址)
数据层面的路由黑洞(即BGP数据通过没有运行BGP的设备,设备将数据丢弃导致数据一直不通,虽然双方学习到了路由。):
IBGP同步:若通过IBGP邻居学习的路由,必须通过IGP协议也学习到。做IBGP时必须关闭IBGP同步。
解决方案有下面四种:
1、在边界设备上将BGP重发布引入IGP协议(仅仅引入EBGP邻居学习并加表的路由),在实验环境可以这样做,但是在现实中,最好不要这样做,若是要做也得在做了只有进行一个router-policy的匹配,哪些路由可以重发布,哪些路由不能重发布。
2、在AS内建立全互联的BGP邻居关系(两两之间建立BGP邻居)
3、减少IBGP邻居关系的数量,打破IBGP水平分割
路由反射器或EBGP联邦来打破水平分割
4、MPLS(MPLS解决数据层面路由黑洞最好)