黑洞出现场景:
两台非直连路由器可以建立BGP邻居关系,传递BGP路由。如果中间路由器没有运行BGP协议,可能会出现路由黑洞。
在拓扑图中,R1和R2是EBGP邻居关系,R2和R4是IBGP邻居关系,R4和R5是EBGP邻居关系,R3没有运行BGP。

上述拓扑将产生路由黑洞:
R1将网络10.0.0.0/24宣告到BGP进程,传递给R2。R2传递给R4,R4传递给R5。在R5上访问10.0.0.1(10.0.0.0/24网段内任意主机)时:R5给R4,R4给R3,R3上没有学习到10.0.0.0/24的路由,由于目的地址不可达丢弃数据包。这种现象称为路由黑洞。
在配置BGP的时候,最容易遇到的问题就是路由黑洞,那么什么是路由黑洞?
简单地说,它会默默地将数据包丢弃,使数据包有去无回。我们知道传统的IP路由,它是通过逐跳查找路由信息,根据路由信息转发数据包,通俗地说就是当数据包到达路由设备的时候,路由设备首先查找路由表,然后根据路由信息转发数据包,当然,路由设备转发数据包的前提是存在下一跳路由。对BGP来说,由于存在IBGP水平分割规则,这是一种防止环路机制,所以在BGP的设计上有些设备就不会运行BGP。BGP是一种TCP的连接或者说是一种host-to-host的连接,可以跨越设备进行连接,所以路由传递是没有问题的,但是数据包的路由却是有问题的。通常我们会出现是IBGP邻居关系可以正常建立,也就是说控制平面看起来是正常的,但是数据平面确不可达,从而形成路由黑洞。
BGP对等体之间路由通告的原则,其中有一条是:从IBGP对等体设备获得的BGP路由,只发布给它的EBGP对等体。这时,当对等体非直连的时候,就会出现路由黑洞
由于BGP规定无论路由器是否启动BGP都要无条件地转发BGP消息和更新包,违背了"非IGP路由器阻断IGP域"的原则,因而辗转造成了BGP路由器"居然ping不通路由表中的条目"的现象,也就是所谓的路由黑洞。
因此黑洞原因可以总结如下:
1、IBGP设计了水平分割:
建立BGP传递路由的路由器被称为BGP对等体,而根据双方所处AS域是否为同一个可以将BGP对等体分为IBGP和EBGP。对于EBGP而言,当其收到一条路由时,它会检查该路由中路径属性中的AS_PATH值,如果发现含有自己AS号的AS_PATH,就代表自己已经从别的地方学习到这条路由,为了防止环路,那么它就不会将这条路由放入自己的路由表中。而对于IGP而言,为了防止AS内出现环路,IBGP设计了水平分割规则。该规则是指:从IBGP学习到的路由,无法传递给其他的IBGP。这样,就避免了IBGP环路的出现。
2、由于BGP基于TCP建立,因此并不要求IBGP之间必须直线链接:
只要IBGP路由器之间互相存在对方的路由,那么他就可以建立IBGP关系。这种模式,既使得BGP建立更加灵活,但是同时也使得在路由信息的传递与数据包的实际路线之间不完全吻合,即路由黑洞问题。
1、把BGP 路由引入到 IGP
2、full mesh(全互联)
3、路由反射器(RR)
4、BGP 联邦
5、开启 BGP 同步
比如:上述黑洞实例中,R2上将BGP路由引入到IGP协议中,让R3通过IGP学习到10.0.0.0/24的路由。
这是一种很直观的解决思路,但是IGP的路由表大小是有限制的,而BGP路由一般又有很多,如果BGP路由数量比较多时,IGP协议可能承载不了这么多路由。
因此这种办法虽然可以解决问题,但是不适合与实际情景。
IBGP邻居全联接,比如:上述黑洞实例中,让R2 R3 R4两两之间建立IBGP邻居关系,让R2把BGP路由同时也传递给R3。这种解决方案的缺点是AS中如果路由器数量比较多时,路由器上IBGP邻居关系的数量也会很多。
full mesh示意图:







bgp反射路由器配置实例:
1、解决as内的IGP full mesh:Route Reflector

[global.config]
as = 1001
router-id = "172.25.0.7"
[[neighbors]]
[neighbors.config]
neighbor-address = "172.25.0.1"
peer-as = 1001
auth-password = "xxxxxx"
[[neighbors]]
[neighbors.config]
neighbor-address = "172.25.0.6"
peer-as = 1001
auth-password = "xxxxxx"
[neighbors.route-reflector.config]
route-reflector-client = true
route-reflector-cluster-id = "172.25.0.137"
[[neighbors]]
[neighbors.config]
neighbor-address = "172.25.0.8"
peer-as = 1001
auth-password = "xxxxxx"
[neighbors.route-reflector.config]
route-reflector-client = true
route-reflector-cluster-id = "172.25.0.137"
2、解决as间的BGP full mesh:Route Server





[global.config]
as = 64512
router-id = "192.168.255.1"
[[neighbors]]
[neighbors.config]
neighbor-address = "10.0.255.1"
peer-as = 65001
auth-password = "hoge1"
[neighbors.transport.config]
passive-mode = true
[neighbors.route-server.config]
route-server-client = true
[[neighbors]]
[neighbors.config]
neighbor-address = "10.0.255.2"
peer-as = 65002
auth-password = "hoge2"
[neighbors.transport.config]
passive-mode = true
[neighbors.route-server.config]
route-server-client = true
联盟出现的背景:
为保证IBGP对等体之间的连通性(也就是解决一个AS中的条目传递问题),需要在IBGP对等体之间建立全连接(Full-mesh)关系。假设在一个AS内部有n台路由器,那么应该建立的IBGP连接数就为n(n-1)/2。当IBGP对等体数目很多时,对网络资源和CPU资源的消耗都很大。利用联盟和路由反射可以解决这一问题。
BGP联盟可以将AS分割为多个子自治系统,从而让大型转接AS变得更具管理性。被分割的AS本身将成为联盟,而分割后的子自治系统则成为成员自治系统。联盟之外的AS将整个联盟视为一个AS,看不见成员自治系统。由于成员自治系统对外界来说是隐而不见的,因而成员自治系统可以使用公有或私有AS号(建议采用私有AS号)。
联盟可以极大的降低IBGP连接的数量。在联盟中,只需要在成员自治系统内进行IBGP的全连接,而成员自治系统间使用一种特殊的EBGP连接,我们称之为联盟EBGP。
联盟的特点:
1、在联盟内部将会保留联盟外部的next_hop属性。
2、通告给联盟内的路由的MED属性在整个联盟范围内保留。
3、Local Preference属性在整个联盟范围内保留,而不只是在通告的成员AS内。
4、在联盟内将成员的AS号加入AS_ PATH中,但不会将联盟内的AS号通告到联盟之外。5、在联盟中,AS_ PATH属性又添加了两种类型AS-CONFED-SEQUENCE、AS-CONFED-SET,默认联盟将成员的AS号以AS-CONFED-SEQUENCE的形式在AS_ PATH当中列出,如果在联盟内配置了聚合,AS号将以AS-CONFED-SET形式列出。
6、AS_ PATH中的联盟AS号用于避免环路,但是在联盟选择最短的AS_ PATH路径时不会比较联盟AS号。
7、联盟内相关的属性传出联盟时将会被自动删除,无需过滤子AS号等信息操作。
8、当联盟AS内有多个成员AS时,成员AS之间建议使用相同的IGP协议。



BGP的同步规则不是路由黑洞的解决方法,却可以避免BGP路由黑洞。
BGP 同步:
BGP同步规则开启后,从IBGP收到一条路由后,
在IBGP路由加入路由表并发布给EBGP邻居之前,会先检查IGP路由表。
只有在IGP也知道这条IBGP路由时,它才会被加入到路由表,并发布给EBGP邻居。
比如:上述黑洞实例中,在R4开启BGP同步规则,当R4从IBGP邻居R2收到10.0.0.0/24的路由后,因为没有从IGP学到这条路由,所以不会把它加入到路由表,不会发送给R5。
也就避免了BGP路由黑洞。


