BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种:1、使用物理接口建邻 2、使用环回借口建邻,针对不同的BGP对等体选用不同的建邻方式。
·EBGP的建邻主要使用的是物理接口建邻
·IBGP的建邻主要使用的是环回接口建邻
这两种建邻方式只是相对的并非绝对,EBGP也可以使用环回,但是有一定的前提,IBGP也可以使用物理接口,但是有一些缺陷,为了实现网络的稳定,使用环回建邻。
IBGP使用环回建邻原因:
在一个大型的网络中,使用物理接口建邻,那么BGP对等体的连接就和这一条物理线路绑定,一旦物理链路出问题,那么IBGP对等体将会建立失败。而使用环回建立,相当于IBGP对等体和整个路由器进行了绑定,一条链路断开,通过IGP协议就可以实现其他物理链路的联通。
EBGP使用物理链路建邻原因:
在EBGP对等体之间,如果仅有一条物理链路,那么EBGP建邻都靠这一条物理链路,如果依靠环回建邻,还是要靠物理链路,所以除非EBGP对等体之间有多条线路连接,否则物理建邻才是最优解。
通过实验的方式解释建邻。
此图我们仅以R1,R2,R3建邻举例。
首先是R1和R2的EBGP对等体的建立。
[R1]bgp 100 //开启BGP协议
[R1-bgp]router-id 1.1.1.1 //标注RID
[R1-bgp]peer 12.0.0.2 as-number 200 //指定建邻的物理链路地址和对等体AS号
此时我们查看一下目前R1所处状态
R1从IDLE状态转入了Connect状态,原因:连接重传计时器连接超时,自动进入Connect状态
此时R1处于Connect状态,此状态表明:R1试图和R2建邻TCP连接。
抓包查看一下目前的情况
很明显R1一直在发送TCP报文请求和R2建邻TCP连接,但是R2没有任何回应。
可能的原因:R2没有开启TCP端口即179端口。
我们放通179端口再查看
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
BGP协议一启动TCP端口便会开通
查看此时R1的状态
Active状态:TCP建立不成功才进入此状态。表明TCP的建立依然存在问题
再抓包查看
很明显,R1一直发包,而R2此时回复一个RST报文断开连接。
原因:此时R2没有进行指定,所以R2认为建立TCP会话是存在问题的,所以拒绝建立连接,回复RST报文。
进行一下指定
[R2-bgp]peer 12.0.0.1 as-number 100
等待32s----连接重传计时器,查看此时R1状态
此时的EBGP对等体,建立成功。
查看抓包
R1请求建立TCP会话,R2同意后,仅有R1发送Open报文,此时R2再此发送RST断开连接,由R2请求建立TCP会话。
由此我们可以看出:BGP的会话建立,需要经过两次TCP的建立,最终由后指定的建立连接。
BGP的邻居建立不是TCP连接建立后才有,而是手工指定后产生。
所以完整的EBGP对等体建立配置应该是
[R1]bgp 100
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 12.0.0.2 as-number 200
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 12.0.0.1 as-number 100
然后是IBGP对等体的建立
R2和R3
像前面的R1和R2一样
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 3.3.3.3 as-number 200
[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 2.2.2.2 as-number 200
此时查看R3的邻居关系
Active:表明TCP连接建立失败。
抓包查看一下
明显R3在给R2发消息想要建立,但是此时R2发送RST报文阻止建立。
注意:此时R2建立发送的源地址是接口ip地址,我们前面提到针对IBGP建立使用环回,按理应该是使用环回发送,但是却是使用接口,明显不对,需要修正。
[R3-bgp]peer 2.2.2.2 connect-interface LoopBack 0 //表明使用环回建立邻居
此时再查看一下R3的BGP邻居表
邻居建立。此时我只修改了R3的建邻。邻居也是可以建立的。
抓包看一下
R3向R2请求建立TCP会话,然后建立BGP邻居。
似乎已经没有问题了
[R2-bgp]peer 3.3.3.3 connect-interface LoopBack 0
此时状态立即跳转到IDLE状态
等一下又恢复了。
需要抓包查看一下
和建立EBGP对等体相似,也是建立了两次TCP会话。
但是我们前面看到建立一次TCP会话也可以建邻成功,所以BGP建立两次TCP会话没有必要
所以IBGP建邻的基本配置。
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 3.3.3.3 as-number 200
[R2-bgp]peer 3.3.3.3 connect-interface LoopBack 0
[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 2.2.2.2 as-number 200
[R3-bgp]peer 2.2.2.2 connect-interface LoopBack 0
针对BGP建邻做个总结:
抓包后会发现一个问题,就是BGP此时仅建立了一次TCP连接,就完成了BGP会话的建立。这也就意味着,BGP会话的建立仅仅是依靠TCP会话,而并没有对这个TCP会话建立的方式有要求,该TCP会话是由谁发起的,谁是客户端,谁是服务端并不影响BGP对等体的建立。----在BGP协议中,TCP会话建立两次完全是多余的,而建立两次的原因也是因为双方路由器均会指定对等体(均将自己看做是客户端),从而发起建立连接请求。
拓展:EBGP环回建邻
[R1]bgp 100
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 2.2.2.2 as 200
[R1-bgp]peer 2.2.2.2 con l0
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 1.1.1.1 as 100
[R2-bgp]peer 1.1.1.1 con l0
沿用前面IBGP环回建邻。
查看R1建邻状态。
IDLE:空闲状态,说明两者没有收到任何TCP消息
原因:两者根本无法到达对方环回。
IBGP可以实现建邻的原因,可以递归到去环回的路由,而EBGP完全没有,所以我们手动添加两条静态实现,递归。
[R1]ip route-static 2.2.2.2 32 12.0.0.2
[R2]ip route-static 1.1.1.1 32 12.0.0.1
再查看此时R1BGP建邻状态
刷新了,但依然是IDLE。
抓包查看
明显TCP邻居建立成功后又断开,又重新建立,断开,处于震荡。
注意:Notification报文,此时发出,结束BGP建立,回到IDLE。
原因:EBGP对等体之间的TTL值为1,也就意味这,数据包路由器可以收,但是不能转发,所以影响建邻。
[R1-bgp]peer 2.2.2.2 ebgp-max-hop 2 //修改EBGPTTL值为2
[R2-bgp]peer 1.1.1.1 ebgp-max-hop 2
此时可以传送给对方的环回
查看R1建邻状态
所以EBGP环回建邻配置
[R1]bgp 100
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 2.2.2.2 as 200
[R1-bgp]peer 2.2.2.2 con l0
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 1.1.1.1 as 100
[R2-bgp]peer 1.1.1.1 con l0
[R1-bgp]peer 2.2.2.2 ebgp-max-hop 2
[R2-bgp]peer 1.1.1.1 ebgp-max-hop 2