本文讨论外部BGP(eBGP),重点介绍路由协议如何学习路由的三个方面中的两个:
- 形成邻居
- 交换存储在BGP表中的可达性或拓扑信息
首先,本文重点介绍eBGP对等方(也称为邻居)的基准配置以及eBGP连接可能需要的一些可选设置。此配置应导致BGP邻居正常工作。然后,它检查BGP表,列出从Internet获知的前缀/长度和路径属性(PA),以及IP路由表。
BGP的一些核心操作概念与EIGRP 和 OSPF的概念相同 。BGP首先与对等体形成邻居关系。然后,BGP从其邻居那里学习信息,并将该信息放在一个表(BGP表)中。最后,BGP会分析BGP表以为BGP表中的每个前缀选择最佳工作路由,并将这些路由放入IP路由表中。
eBGP邻居配置
至少,参与BGP的路由器必须配置以下设置:
- 路由器自己的ASN(路由器bgp asn全局命令)
- 每个邻居及其邻居的ASN的IP地址(邻居ip-address remote-as remote-asn BGP子命令)
例如,考虑一个典型 的企业多宿主Internet设计,如下图所示。在这种情况下,已经确定了以下设计要求,但是您必须确定配置,并且要了解以下列表和图中的信息:
- 企业使用ASN 11
- 到ISP1的连接(两个T-1)被认为是主要连接,到ISP3的连接(一个T-1)是次要连接。
- ISP1通告默认路由以及完整更新。
- ISP1使用ASN 1。
- ISP3发布一条默认路由,以及仅包含ISP3本地客户的部分更新。
- ISP3使用ASN 3。
- 每个ISP将其编号最小的接口的IP地址用于其对等关系。
对于路由器E1,如下例所示,BGP配置仅需要三个命令,至少要将BGP配置到E1与其他两个路由器形成邻居的程度。该示例还显示了仅在路由器I1-1和I3-1上添加的配置,以支持与E1的邻居连接。
输出的灰色部分突出显示了本地ASN和邻居的ASN的配置,这些参数必须匹配才能形成邻居。首先,E1使用router bgp 11命令将其自己的ASN配置为11。
其他路由器必须在引用E1的邻居命令上引用ASN 11;否则,其他路由器必须参考ASN 11。在这种情况下,I1-1使用其邻居10.1.1.1 remote-as 11命令引用ASN 11。相反,在路由器bgp 1全局命令上,I1-1的本地ASN(1)必须与E1在邻居命令中配置的内容匹配-在这种情况下,应与E1的邻居10.1.1.2 remote-as 1命令匹配。
形成eBGP邻居的要求
路由器必须满足几个要求才能成为BGP邻居:
- 本地路由器的ASN(在router bgp asn命令上)必须通过其邻居remote-as asn命令将邻居路由器对该ASN的引用匹配。
- 两个路由器的BGP路由器ID不能相同。
- 如果已配置,则必须通过身份验证。
- 每个路由器必须是与另一个路由器的TCP连接的一部分,并且该TCP连接中使用的远程路由器的IP地址必须与本地路由器在BGP neighbor remote-as命令中配置的地址匹配。
考虑此列表中的前两项。首先,示例1中的重点显示了这四个要求中的第一个。接下来,如果您回想起有关EIGRP和OSPF的路由器ID(RID)的类似详细信息,则列表中的第二个要求仅需考虑一下。
像EIGRP和OSPF一样,BGP定义了一个32位路由器ID,以点分十进制表示。与EIGRP和OSPF一样,路由器上的BGP通过以下步骤按相同的一般方式选择其RID,直到选择了BGP RID为止:
- 配置:使用bgp router-id rid router子命令的设置。
- 最高环回:在BGP进程初始化时,选择任何上行环回接口的最高数字IP地址。
- 最高非环回接口:在BGP进程初始化时,选择任何向上的非环回接口的最高数字IP地址。
列表中的第三个要求,即身份验证检查,仅当已使用neighbor neighbor-ip password key命令在两个路由器中的至少一个路由器上配置了身份验证时,才会发生。如果两个BGP邻居在配置匹配的身份验证密钥值时参考另一台路由器的IP地址配置此命令,则身份验证通过。如果两个都省略此命令,则不会进行身份验证。
第四个邻居要求-用于邻居TCP连接的IP地址匹配-需要更详细的讨论。BGP邻居首先形成TCP连接。后来,BGP消息在该连接上流动,这使BGP路由器知道消息何时到达邻居,何时不到达。
BGP TCP连接
BGP路由器通过尝试与到neighbor neighbor-ip remote-as命令中配置的地址建立TCP连接来创建TCP连接。Cisco路由器不需要BGP配置来明确声明路由器在建立此TCP连接时使用的源地址,如果未显式配置,则Cisco IOS会在本地路由器上选择IP地址。
默认情况下,Cisco IOS选择给定邻居的BGP源IP地址作为用于将数据包转发到该邻居的路由的传出接口的接口IP地址。这是要克服的许多单词,并且在下图中更容易看到,例如下图,该图着重于E1和I1-1之间的eBGP连接。
图中所示逻辑的步骤描述如下:
- E1找到邻居10.1.1.2命令,因此E1在目的IP地址为10.1.1.2的数据包内向该邻居发送BGP消息。
- E1在IP路由表中查找与目的地10.1.1.2。匹配的路由。
- 步骤2中匹配的路由将S0 / 0/0列为传出接口。
- E1的S0 / 0/0的接口IP地址为10.1.1.1,因此E1使用10.1.1.1作为此BGP对等方的源IP地址。
- 另一个路由器I1-1上的邻居命令必须引用E1的源IP地址(在这种情况下为10.1.1.1)。
现在,再次考虑要成为邻居的四个要求中的最后一个。经过重述,为了正常运行,一台路由器上的BGP更新源必须与另一台路由器的neighbor命令上配置的IP地址匹配,反之亦然。
eBGP邻居之间存在冗余时的问题
当两个eBGP邻居之间存在冗余的第3层路径时,如果两条链路中只有一条发生故障,则将基础IP连接使用接口IP地址可能会导致中断。当基础TCP连接失败时,BGP邻居关系失败。TCP使用称为套接字的概念,该套接字由本地TCP端口号和IP地址组成。
该IP地址必须与工作接口关联(根据show interfaces命令,该接口的状态为线路状态为up,线路协议为up )。如果BGP使用IP地址的接口发生故障,则TCP套接字将失败,从而关闭TCP连接。结果,只有在关联接口也同时处于up状态时,BGP邻居才能处于up状态。
在这种情况下,存在两种替代解决方案。一种选择是在每个路由器上配置两个邻居命令,每个命令用于邻居的接口IP地址。这解决了可用性问题,因为如果一个链接失败,则另一邻居可以保持正常工作。但是,在这种情况下,两个邻居都交换BGP路由,从而消耗带宽和更多内存来保存BGP表。
使用环回接口作为TCP连接端点的首选选项可以解决可用性问题,同时又避免了额外的开销。这两个路由器分别配置一个环回接口和IP地址,并将这些环回IP地址用作其单个BGP TCP连接的源。如果多个链接之一发生故障,则回送接口也不会发生故障。只要两台路由器都具有可以到达彼此的环回IP地址的有效路由,TCP连接就不会失败。
下图显示了与通过Loopback接口形成eBGP邻居有关的详细信息。
eBGP多跳概念
缺省情况下,路由器在构建要发送到eBGP对等体的数据包时,会将IP报头中的IP生存时间(TTL)字段设置为值1。使用此默认操作,使用环回时eBGP邻居无法完成接口IP地址。原因是当TTL = 1的数据包到达邻居时,邻居将TTL值递减为0并丢弃该数据包。
丢弃BGP数据包的逻辑可能有点令人惊讶,因此可以提供一个示例。对于此示例,假定使用默认操作TTL = 1,并且尚未配置eBGP多跳。图1中的路由器E1尝试使用I1-1的环回IP地址1.1.1.1建立与I1-1的BGP连接,如图3所示。
尝试形成供BGP使用的TCP连接时,E1发送的IP数据包会发生以下情况:
- E1将数据包发送到目标地址1.1.1.1,TTL = 1。
- I1-1收到数据包。看到数据包不是发往接收接口的IP地址的,I1-1将数据包传递到其自己的IP转发(IP路由)逻辑。
- I1-1的IP路由逻辑将目标(1.1.1.1)与路由表进行匹配,并找到接口环回2作为传出接口。
- I1-1的IP转发逻辑将TTL减1,将TTL减至0,结果I1-1丢弃了该数据包。
简而言之,路由器的数据包转发逻辑在将数据包提供给环回接口之前先将TTL递减,这意味着普通IP转发逻辑会丢弃该数据包。 使用邻居ebgp-multihop 2命令配置路由器将解决此问题。此命令定义路由器在创建BGP数据包时将使用的TTL。 结果,接收路由器会将TTL递减为1,因此不会丢弃该数据包。