BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种:1、使用物理接口建邻 2、使用环回借口建邻,针对不同的BGP对等体选用不同的建邻方式。

        ·EBGP的建邻主要使用的是物理接口建邻

        ·IBGP的建邻主要使用的是环回接口建邻

这两种建邻方式只是相对的并非绝对,EBGP也可以使用环回,但是有一定的前提,IBGP也可以使用物理接口,但是有一些缺陷,为了实现网络的稳定,使用环回建邻。

 IBGP使用环回建邻原因:

在一个大型的网络中,使用物理接口建邻,那么BGP对等体的连接就和这一条物理线路绑定,一旦物理链路出问题,那么IBGP对等体将会建立失败。而使用环回建立,相当于IBGP对等体和整个路由器进行了绑定,一条链路断开,通过IGP协议就可以实现其他物理链路的联通。

EBGP使用物理链路建邻原因:

在EBGP对等体之间,如果仅有一条物理链路,那么EBGP建邻都靠这一条物理链路,如果依靠环回建邻,还是要靠物理链路,所以除非EBGP对等体之间有多条线路连接,否则物理建邻才是最优解。

通过实验的方式解释建邻。

ebgp传递给ibgp ebgp ibgp_R3

此图我们仅以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所处状态

ebgp传递给ibgp ebgp ibgp_R3_02

 R1从IDLE状态转入了Connect状态,原因:连接重传计时器连接超时,自动进入Connect状态

 此时R1处于Connect状态,此状态表明:R1试图和R2建邻TCP连接。

抓包查看一下目前的情况

ebgp传递给ibgp ebgp ibgp_ebgp传递给ibgp_03

很明显R1一直在发送TCP报文请求和R2建邻TCP连接,但是R2没有任何回应。

 可能的原因:R2没有开启TCP端口即179端口。

我们放通179端口再查看

[R2]bgp 200
[R2-bgp]router-id 2.2.2.2

BGP协议一启动TCP端口便会开通

查看此时R1的状态

ebgp传递给ibgp ebgp ibgp_R3_04

 Active状态:TCP建立不成功才进入此状态。表明TCP的建立依然存在问题

再抓包查看

ebgp传递给ibgp ebgp ibgp_TCP_05

 很明显,R1一直发包,而R2此时回复一个RST报文断开连接。

原因:此时R2没有进行指定,所以R2认为建立TCP会话是存在问题的,所以拒绝建立连接,回复RST报文。

进行一下指定

[R2-bgp]peer 12.0.0.1 as-number 100

等待32s----连接重传计时器,查看此时R1状态

ebgp传递给ibgp ebgp ibgp_网络_06

 此时的EBGP对等体,建立成功。

查看抓包

ebgp传递给ibgp ebgp ibgp_TCP_07

 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的邻居关系

ebgp传递给ibgp ebgp ibgp_TCP_08

 Active:表明TCP连接建立失败。

抓包查看一下

ebgp传递给ibgp ebgp ibgp_TCP_09

 明显R3在给R2发消息想要建立,但是此时R2发送RST报文阻止建立。

注意:此时R2建立发送的源地址是接口ip地址,我们前面提到针对IBGP建立使用环回,按理应该是使用环回发送,但是却是使用接口,明显不对,需要修正。

[R3-bgp]peer 2.2.2.2 connect-interface LoopBack 0    //表明使用环回建立邻居

此时再查看一下R3的BGP邻居表

ebgp传递给ibgp ebgp ibgp_网络_10

邻居建立。此时我只修改了R3的建邻。邻居也是可以建立的。

 抓包看一下

ebgp传递给ibgp ebgp ibgp_链路_11

 R3向R2请求建立TCP会话,然后建立BGP邻居。

似乎已经没有问题了

[R2-bgp]peer 3.3.3.3 connect-interface LoopBack 0

ebgp传递给ibgp ebgp ibgp_链路_12

此时状态立即跳转到IDLE状态

ebgp传递给ibgp ebgp ibgp_R3_13

 等一下又恢复了。

需要抓包查看一下

ebgp传递给ibgp ebgp ibgp_网络_14

 和建立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建邻状态。

ebgp传递给ibgp ebgp ibgp_链路_15

 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建邻状态

ebgp传递给ibgp ebgp ibgp_ebgp传递给ibgp_16

 刷新了,但依然是IDLE。

抓包查看

ebgp传递给ibgp ebgp ibgp_R3_17

明显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传递给ibgp ebgp ibgp_ebgp传递给ibgp_18

 所以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