2.4 I BGP 与 IGP 同步

几乎毫无例外,内部BGP(同一AS中的对等体间的BGP)仅用于多归属场合。IBGP允许边缘路由器共享NLRI及其相关属性,从而增强系统范围内的路由策略。此外,当位于转接(transit)AS中的边缘路由器将学习自外部对等体的路由传递给其他边缘路由器(以便将该路由宣告给外部对等体)时,就可以利用IBGP来作为传递手段。

读者可能会想到,在某些场合下IBGP应该可以被用作IGP。例如,某ISP的AS通常以EBGP方式连接到其他自治系统,且通常承载转接流量,那为什么不在AS内仅运行IBGP,以保持路由协议的一致性呢?问题是每台IBGP路由器都必须与其他IBGP路由器建立全连接的对等关系,也就是说,IBGP互联网络必须是全网状结构。本节将解释为什么必须要有IGP来支持IBGP,以及IGP与IBGP同步的重要性。IBGP必须保持全连接的原因如下。

• 防止在AS内形成BGP路由环路;

• 确保BGP路由路径上的所有路由器都知道如何将数据包转发到目的地。

顾名思义,通过IBGP宣告路由只能在同一个AS内进行宣告,因而AS_PATH并不会发生变化。事实上,只有当路由被宣告给EBGP对等体时,才会在AS_PATH中增加本地AS号。因而,IBGP路由没有EBGP路由所具备的环路预防功能。为了防止路由出现环路,BGP不会将学习自IBGP对等体的路由再宣告给其他IBGP对等体。

图2-32解释了IBGP对等体之间没有建立全连接时的后果。如图所示,在西雅图和塔科马以及塔科马和斯波坎之间配置了IBGP对等会话,西雅图和塔科马之间正在交换各自本地网络的NLRI信息,斯波坎与塔科马也一样,但此时西雅图和斯波坎之间无法相互学习对方的NLRI。

img104

图2-32 在部分网状连接的IBGP环境下,由于学习自某个IBGP对等体的路由不会再被宣告给其他IBGP对等体,因而无法宣告所有NLRI信息

图2-33 显示了如何通过在IBGP对等体之间建立全连接来实现完全的可达性。需要注意的是,尽管西雅图和斯波坎之间不存在直连的数据链路,但它们仍然是对等体,只不过BGP经塔科马用来传递路由的TCP会话是西雅图和斯波坎之间的逻辑点到点会话。这一点非常重要,这是因为,要想建立TCP会话,西雅图和斯波坎就必须了解连接它们的数据链路的地址。

要确保数据链路地址可知看上去似乎非常简单,因为每台路由器的地址都必须包含在BGP的network语句中(将在第3章讨论),但事实并不总是这么简单。

例2-14给出了西雅图的BGP路由表和IGP路由表,对于要转发数据包的路由器来说,目的地必须位于IGP路由表中。

img105a

图2-33 在全网状连接的IBGP环境下,每台IBGP路由器都与其他IBGP路由器建立对等关系,并交换全部NLRI信息

例2-14:尽管BGP路由表中存在少量路由,但这些路由无法自动进入路由器的IGP路由表

img105b

从例2-14的输出结果可以看出,虽然BGP路由表中包含了几条路由,包括西雅图—塔科马以及斯波坎一塔科马间的数据链路地址(192.168.1.0/24和192.168.2.0/24),但仅有西雅图的直连链路进入了IGP路由表。需要注意的是,斯波坎网络206.25.129.0/24,甚至都没出现在BGP路由表中,表示西雅图和斯波坎之间没有建立正确的对等关系。


注意:请注意,BGP路由表中直连链路的权值与学习自塔科马的路由权值一样。


例2-14解释了同步问题:有关同步状态的规则如下。

学习自IBGP邻居的路由在进入IGP路由表或被宣告给BGP对等体之前,必须首先通过IGP来知晓该路由。

如图2-33所示,由于路由器上未运行IGP,因而BGP路由就不能进入IGP,而且同步机制要求BGP路由在进入IGP之前必须通过IGP来了解该路由。

下面以图2-34中的网络为例,解释同步规则的存在原因。该案例中没有使用IBGP作为内部网关协议,而是使用了OSPF作为IGP。盐湖城和普罗沃被连接在两个独立的自治系统上,并通过IBGP连接相互宣告学习自EBGP的路由,而用来承载IBGP连接的TCP会话则穿过了奥勒姆和奥格登节点。

img106

图2-34 该网络在盐湖城和普罗沃之间运行了部分网状IBGP连接并使用OSPF作为IGP

接下来,假定盐湖城从AS 500学习到了一条去往196.223.18.0/24的路由,在通过IBGP连接将该路由宣告给普罗沃时,利用next-hop-self策略将NEXT_HOP属性更改为自己的路由器ID。之后,普罗沃又将该条路由宣告给AS 700。此时,AS 700中的路由器开始将去往196.223.18.0/24的数据包转发给普罗沃(请记住,路由宣告就是一种传递数据包的承诺),此时将出现差错。普罗沃将查找去往196.223.18.0/24的路由,发现经盐湖城可以到达该网络,之后将查找盐湖城的IP地址,发现可以通过下一跳路由器奥格登到达盐湖城,因而就将去往196.223.18.0/24的数据包转发给奥格登。但是,由于外部路由是通过IBGP在盐湖城和普罗沃之间进行共享的,OSPF路由器无法了解外部路由的信息,因而,当数据包被转发到奥格登之后,奥格登路由器将执行路由查找,但无法发现去往196.223.18.0/24的路由项,则丢弃该数据包以及随后到达的去往该目的地的所有数据包,致使去往网络196.223.18.0/24的流量出现路由黑洞。

当然,如果图2-34中的OSPF路由器知道外部路由,则将不会出现上述的现象——奥格登将知道通过盐湖城可以到达网络196.223.18.0/24,并能正确地转发这些数据包。利用同步机制,就可以防止因IGP信息不足而使得数据包在转接AS中被路由黑洞。

当普罗沃接收到盐湖城发出的196.223.18.0/24路由宣告之后,就将该路由添加到其BGP路由表中,并检查其IGP路由表,以确定IGP路由表中是否存在该路由项。如果该路由项不存在,普罗沃就知道该路由对IGP来说是未知的,那么将无法宣告该路由。如果该路由项存在且IGP在路由表中设置了去往网络196.223.18.0/24的路由项(也就是说,IGP知道该路由),那么普罗沃的BGP路由才与IGP路由实现了同步,此时,路由器才能将该路由宣告给BGP对等体。

回顾图2-33和例2-14所示的案例,即可明白为何同步会让全连接的IBGP无法正确工作。此时塔科马触犯了Catch-22(第22条军规,寓意两难的尴尬境地),它正在接收来自西雅图和斯波坎的路由,但由于这些路由并没有位于塔科马的IGP路由表中,因而塔科马无法让这些路由进入IGP路由表,也就无法对外宣告这些路由。没有任何IGP将这些路由放入到路由表中!

同步属于BGP中较为古老的一种协议机制,可以将路由重分发到IGP中。但是,如上例所示,对全连接的IBGP来说,所有路由器仅通过BGP就能了解所有必需的BGP路由。此时,同步机制将妨碍在BGP中保持BGP路由,并且导致在建立IBGP连接时不能仅使用IGP。

幸运的是,Cisco路由器提供了关闭同步的配置选项。例2-15显示了关闭同步机制之后西雅图的BGP和IGP路由表,此时,塔科马转发了来自斯波坎的路由,数据包也得到了正确转发。

例2-15:图2-33中3台路由器的同步机制被关闭之后,西雅图的BGP和IGP路由表中就有了全部NLRI。

img107

通过上述讨论可以知道,要想保证IBGP能正常工作,就必须实施以下配置选项之一。

• 必须将外部路由重分发到IGP中,以确保IGP能够与BGP实现同步。但该方法的缺陷在于,如果从BGP获取了大量路由(如全部Internet路由表),那么将会给IGP路由器带来巨大的处理和存储负担,在多数情况下,路由器都无法处理如此重负,从而使路由器出现故障。实际上,某些大规模的网络故障就是因疏忽而将全部BGP路由重分发进了OSPF或IS-IS,其中的一次重大事故导致某重要服务提供商的网络曾宕机19个小时。

• 必须在IBGP路由器之间建立全连接关系,且关闭同步机制。此时,每台BGP路由器都可以通过BGP来知晓外部路由,而在关闭了同步机制之后,这些路由在无需首先通过IGP来知晓的情况下即可进入路由表。但该方法的缺陷在于,如果某AS内存在多台IBGP路由器,那么在这些IBGP路由器之间建立全连接关系将是一个非常巨大的管理性挑战。不过即便如此,在处理Internet路由时使用的基本上都是该方法。好在目前有两种措施来控制IBGP的全连接需求,一种是路由反射器,一种是联盟,有关信息将在下一节进行详细讨论。

第3章将提供几个IBGP配置案例,并在回顾这两种配置选项的缺点的同时,给出相应的解决方案。