试验拓扑如下(BGP组网 始发端与接收端都各自有路由,但数据包双方收到对方数据(PING不通)):

bgp内网ashao bgp组网_OSPF



这是一个典型的BGP应用组网。图中,有3个AS,AS之间运行BGP协议。 AS65008域内运行OSPF协议。R1和R5上只运行BGP协议,R2和R4上运行OSPF和BGP协议,R3上只运行OSPF协议。这里先解释下EBGP和IBGP。

EBGP:运行于AS之间两台设备的BGP关系。如图中R1和R2、R4和R5

IBGP:运行于AS内部两台设备的BGP关系。如图中R2和R4

这里读者可能会问:AS内部不是有IGP么,为什么还要建立IBGP关系?

这是因为如果R2和R4之间不建立BGP关系,那么如果R1要把路由传递给R5,经过AS65008时,就只能把BGP路由引入到IGP中,通过IGP进行传递。而把数以10万计的BGP路由引入到IGP中的后果是灾难性的。所以上图中,R2和R4之间建立了IBGP的关系。值得一提的是,如上文所提及,由于BGP是通过静态配置的方式建立TCP连接,所以并非只能在两台直连的设备上建立BGP关系,如上图,R2和R4间通过OSPF路由可达,可以建立IBGP关系。

为什么控制面路由已经传递成功,但是数据包却无法发过来呢?

bgp内网ashao bgp组网_R3_02

R1—R2:由于两台设备直连,并且建立EBGP关系,R1可以直接发送update报文至R2。

R2—R4:两台路由非直连,但是两台路由建立了IBGP关系,R2将update报文发送给R4。即该update报文的目的IP是R4,于是R2查询自己的路由表,由于域内运行了OSPF协议,通过OSPF,R2查询到去R4的下一跳是R3,于是将该update报文发给R3,R3收到该报文后,虽然没有运行BGP协议,但是根据报文的目的IP,将该update报文发送给R4。

R4—R5:同样,两台设备直连,并且建立EBGP关系,R4可以直接发送update报文至R5。

这样,路由的传递就完成了。

数据包的传递过程:


bgp内网ashao bgp组网_IP_03


R5—R4:R5发送的数据包,源IP是R5,目的IP是R1,于是R5查询路由表,因为从R4收到一条R1的路由,该路由的下一跳标识为R4。于是将数据包发送给R4。

R4—R2:当R4收到从R5发过来的数据包时,该数据包的源IP是R5,目的IP是R1。于是,R4查询路由表,发现去往R1的路由下一跳是R2(我们假定R2上配置了peer next-hop-local命令),由于下一跳非直连,于是R4查询去R2的下一跳。由于域内运行了OSPF,R4发现,去R2的下一跳是R3,于是将数据包发给了R3。当R3收到该数据包时,由于数据包的目的IP是R1的IP,但是R3并没有运行BGP,所以R3上没有R1的路由。于是R3将该数据包丢弃。

这就是经常说到的数据层面的“路由黑洞”。

交换机带着阵图找到路由老祖,将方才所发生之事告知老祖,老祖微微一笑道:“徒儿,这阵法看似平淡无奇,实则千变万化。你墨守成规,太不知变通。不过这也不能怪你,想当年这创立BGP神功的人,早已料想到这种情况。”

老祖自旁拿出一本封面泛黄的古籍,赫然上书几个大字“BGP神功”。翻开几页,一句心法映入眼帘。

立这BGP神功之初,这个创立BGP的前辈就已料想到你遇到的情况,于是规定了这条心法,有了这条规则,在S67收到S97发来的路由时,发现OSPF路由表里并没有这条路由,就不会将该路由发送给S57。反之,如果你将该路由引入到OSPF路由表中,那么在数据包从S57发给S27时,S27也能通过OSPF将数据包转发出去。”

交换机若有所悟:“但是方才路由明明已经传递成功了啊。”

老祖不急不忙道:“那是因为为师闯荡江湖多年,发现这条心法虽然可以解决路由黑洞的问题,但却必须将BGP路由引入到IGP中,不免非常不切实际。于是为师对BGP心法做了改变,去掉了这条心法,而是用“物理全连接”和“逻辑全连接”来解决这个问题。”