BGP 的工作原理

今天我们来看看BGP协议。 我们不会很长时间谈论它的原因以及为什么它被用作唯一的协议。 关于这个主题有很多信息,例如 这里.

那么什么是BGP呢? BGP是一种动态路由协议,也是唯一的EGP(外部网关协议)协议。 该协议用于在 Internet 上构建路由。 让我们看看如何在两个 BGP 路由器之间建立邻居。

BGP 的工作原理
考虑 Router1 和 Router3 之间的邻居。 让我们使用以下命令配置它们:

router bgp 10
  network 192.168.12.0
  network 192.168.13.0
  neighbor 192.168.13.3 remote-as 10

router bgp 10
  network 192.168.13.0
  network 192.168.24.0
  neighbor 192.168.13.1 remote-as 10

单个自治系统内的邻居是AS 10。在路由器(例如Router1)上输入信息后,该路由器会尝试与Router3 建立邻接关系。 什么也没发生时的初始状态称为 空闲。 一旦在 Router1 上配置了 bgp,它将开始侦听 TCP 端口 179 - 它将进入状态 分享链接,当它尝试与 Router3 打开会话时,它将进入状态 现有的.

Router1和Router3之间建立会话后,会交互Open消息。 当Router1发送此消息时,将调用此状态 打开发送。 当它收到来自Router3的Open消息时,它会进入状态 打开确认。 让我们仔细看看 Open 消息:

BGP 的工作原理
该消息传达有关路由器使用的 BGP 协议本身的信息。 通过交换 Open 消息,Router1 和 Router3 相互传达有关其设置的信息。 传递以下参数:

  • 版本:这包括路由器正在使用的 BGP 版本。 BGP 的当前版本是 RFC 4 中描述的版本 4271。两个 BGP 路由器将尝试协商兼容的版本,当不匹配时,将不会有 BGP 会话。
  • 我的AS:这包括 BGP 路由器的 AS 编号,路由器必须就 AS 编号达成一致,并且还定义它们是否将运行 iBGP 还是 eBGP。
  • 保持时间:如果 BGP 在保持时间内没有收到来自另一端的任何 keepalive 或更新消息,那么它将声明另一端“死亡”,并将拆除 BGP 会话。 默认情况下,Cisco IOS 路由器上的保持时间设置为 180 秒,每 60 秒发送一次保活消息。 两个路由器必须就保持时间达成一致,否则不会有 BGP 会话。
  • BGP 标识符:这是本地 BGP 路由器 ID,就像 OSPF 一样选举:
    • 使用通过 bgp router-id 命令手动配置的路由器 ID。
    • 使用环回接口上最大的 IP 地址。
    • 使用物理接口上最大的 IP 地址。
  • 可选参数:在这里您将找到 BGP 路由器的一些可选功能。 添加此字段是为了可以将新功能添加到 BGP,而无需创建新版本。您可能会在此处找到以下内容:
    • 支持 MP-BGP(多协议 BGP)。
    • 支持路由刷新。
    • 支持 4 字节 AS 编号。

建立邻里必须满足以下条件:

  • 版本号。 当前版本是4。
  • AS编号必须与您配置的一致 邻居 192.168.13.3 远程-as 10.
  • Router ID 必须与邻居不同。

如果任何参数不满足这些条件,路由器将发送 通知 指示错误的消息。 发送和接收Open消息后,邻居关系进入状态 成立。 此后,路由器可以交换有关路由的信息并使用 更新 消息。 这是 Router1 发送给 Router3 的 Update 消息:

BGP 的工作原理

在这里您可以看到 Router1 报告的网络和 Path 属性,这些属性类似于指标。 我们将更详细地讨论路径属性。 Keepalive 消息也在 TCP 会话中发送。 默认情况下,它们每 60 秒传输一次。 这是一个保活定时器。 如果在保持定时器期间没有收到保活消息,则意味着与邻居的通信丢失。 默认情况下,它等于 180 秒。

有用的标志:

BGP 的工作原理

看起来我们已经弄清楚了路由器之间是如何传递信息的,现在我们来尝试一下BGP协议的逻辑。

将路由发布到BGP表中,与IGP协议一样,使用network命令,但操作逻辑不同。 如果在IGP中,在network命令中指定路由后,IGP查看哪些接口属于该子网并将它们包含在其表中,那么BGP中的network命令查看路由表并查找 精确 与network命令中的路由匹配。 如果找到,这些路由将出现在 BGP 表中。

在路由器当前的IP路由表中查找与network命令的参数完全匹配的路由; 如果IP路由存在,则将等效的NLRI放入本地BGP表中。

现在让我们将 BGP 提升到所有剩余的 AS,看看如何在一个 AS 内选择路由。 BGP路由器收到邻居发来的路由后,开始选择最佳路由。 在这里,您需要了解可以有什么类型的邻居 - 内部和外部。 路由器是否通过配置了解配置的邻居是内部邻居还是外部邻居? 如果在一个团队中:

neighbor 192.168.13.3 remote-as 10 

其中remote-as参数指定AS,该AS是在router bgp 10命令中在路由器本身上配置的,来自内部AS的路由被认为是内部的,来自外部AS的路由被认为是外部的。 对于每一个,接收和发送的逻辑都不同。 考虑这个拓扑:

BGP 的工作原理

每个路由器都有一个配置有 ip 的环回接口: xxxx 255.255.255.0 - 其中 x 是路由器编号。 在 Router9 上,我们有一个环回接口,地址为 - 9.9.9.9 255.255.255.0。 我们将通过 BGP 公布它,看看它如何传播。 该路由将被发送到Router8和Router12。 从 Router8 出发,该路由将到达 Router6,但到达 Router5 时不会出现在路由表中。 同样,在 Router12 上,该路由将出现在表中,但在 Router11 上,它也不会出现在表中。 让我们试着弄清楚这一点。 让我们考虑 Router9 向其邻居传输哪些数据和参数,报告该路由。 下面的数据包将从 Router9 发送到 Router8。

BGP 的工作原理
路由信息由Path 属性组成。

路径属性分为4类:

  1. 众所周知的强制性 - 所有运行 BGP 的路由器都必须识别这些属性。 必须存在于所有更新中。
  2. 知名全权委托 - 所有运行 BGP 的路由器都必须识别这些属性。 它们可能存在于更新中,但它们的存在不是必需的。
  3. 可选及物 - 可能无法被所有 BGP 实现识别。 如果路由器无法识别该属性,则会将更新标记为部分更新并将其转发给其邻居,同时存储无法识别的属性。
  4. 可选的非传递性 - 可能无法被所有 BGP 实现识别。 如果路由器无法识别该属性,则该属性在传递给邻居时将被忽略并丢弃。

BGP 属性示例:

  • 众所周知的强制性:
    • 自治系统路径
    • 下一跳
    • 起始地

  • 知名全权委托:
    • 当地偏好
    • 原子聚合体
  • 可选及物:
    • 聚合
    • 地区
  • 可选的非传递性:
    • 多出口鉴别器 (MED)
    • 发起者ID
    • 集群列表

在这种情况下,现在我们将对起源、下一跳、AS 路径感兴趣。 由于该路由是在Router8和Router9之间传输的,即在一个AS内部,因此被认为是内部路由,我们要关注Origin。

Origin 属性 - 指示更新中的路由是如何获得的。 可能的属性值:

  • 0 - IGP:原自治系统内收到的NLRI;
  • 1 - EGP:NLRI 使用外部网关协议 (EGP) 获知。 BGP 的前身,未使用
  • 2 - 不完整:NLRI 是通过其他方式学习的

在我们的例子中,从数据包中可以看出,它等于0。当这条路由传输到Router12时,该代码将具有代码1。

下一步,下一跳。 下一跳属性

  • 这是通往目标网络的路径所经过的 eBGP 路由器的 IP 地址。
  • 当前缀发送到另一个AS时该属性会发生变化。

在 iBGP 的情况下,即在一个 AS 内,下一跳将由获悉或告知该路由的那个指示。 在我们的例子中,它将是 192.168.89.9。 但是当这条路由从Router8传输到Router6时,Router8会改变它并用自己的替换它。 下一跳将为 192.168.68.8。 这使我们得出两条规则:

  1. 如果路由器将路由转发到其内部邻居,则不会更改下一跳参数。
  2. 如果路由器将路由传输到其外部邻居,它会将 Next-hop 更改为该路由器传输的接口的 IP。

这就让我们明白了第一个问题——为什么Router5和Router11的路由表中不会有路由。 让我们仔细看看。 这样,Router6 收到了 9.9.9.0/24 路由​​的信息,并成功将其添加到路由表中:

Router6#show ip route bgp
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      9.0.0.0/24 is subnetted, 1 subnets
B        9.9.9.0 [20/0] via 192.168.68.8, 00:38:25<source>
Теперь Router6 передал маршрут Router5 и первому правилу Next-hop не изменил. То есть, Router5 должен добавить  <b>9.9.9.0 [20/0] via 192.168.68.8</b> , но у него нет маршрута до 192.168.68.8 и поэтому данный маршрут добавлен не будет, хотя информация о данном маршруте будет храниться в таблице BGP:

<source><b>Router5#show ip bgp
BGP table version is 1, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 * i 9.9.9.0/24       192.168.68.8             0    100      0 45 i</b>

Router11-Router12之间也会发生同样的情况。 为了避免这种情况,需要配置Router6或Router12在向其内部邻居传递路由时,将其IP地址替换为下一跳。 这是使用以下命令完成的:

neighbor 192.168.56.5 next-hop-self

执行此命令后,Router6 将发送一条 Update 消息,其中接口 Gi0/0 Router6 的 ip 将被指定为路由的下一跳 - 192.168.56.6,之后该路由将已包含在路由表中。

我们再进一步看看Router7和Router10上是否出现了这条路由。 它不会出现在路由表中,我们可能会认为问题与第一个带有 Next-hop 参数的问题相同,但是如果我们查看 show ip bgp 命令的输出,我们会看到即使下一跳错误,也没有收到路由,这意味着该路由甚至没有被传输。 这将导致我们存在另一个规则:

从内部邻居接收的路由不会传播到其他内部邻居。

由于 Router5 收到了来自 Router6 的路由,因此不会将其转发给其他内部邻居。 为了进行传输,您需要配置该功能 路由反射器,或者配置全连接邻居关系(Full Mesh),即Router5-7每个人都会成为每个人的邻居。 在这种情况下,我们将使用路由反射器。 在 Router5 上,您需要使用以下命令:

neighbor 192.168.57.7 route-reflector-client

当将路由传递给内部邻居时,路由反射器会更改 BGP 的行为。 如果内部邻居指定为 路由反射器客户端,然后内部路由将被通告给这些客户端。

Router7上没有出现该路由? 也不要忘记下一跳。 经过这些操作后,路由也应该到达 Router7,但这种情况并未发生。 这给我们带来了另一条规则:

下一跳规则仅适用于外部路由。 对于内部路由,不替换下一跳属性。

我们遇到这样一种情况,有必要创建一个使用静态路由或 IGP 协议的环境来向路由器通知 AS 内的所有路由。 让我们在 Router6 和 Router7 上注册静态路由,然后我们将在路由器表中获得所需的路由。 在 AS 678 中,我们的做法略有不同 - 我们将在 Router192.168.112.0 上注册 24/10 的静态路由,在 Router192.168.110.0 上注册 24/12 的静态路由。 接下来,我们将建立Router10和Router12之间的邻居关系。 我们还将配置 Router12 将其下一跳发送到 Router10:

neighbor 192.168.110.10 next-hop-self

结果是 Router10 将收到路由 9.9.9.0/24,该路由将从 Router7 和 Router12 收到。 让我们看看 Router10 会做出什么选择:

Router10#show ip bgp
BGP table version is 3, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network              Next Hop            Metric LocPrf Weight Path
 *>i 9.9.9.0/24       192.168.112.12           0    100       0      45 i

                               192.168.107.7                                0     123 45 i  

我们可以看到,两条路由和一个箭头 (>) 表示选择了经过 192.168.112.12 的路由。
让我们看看路由选择过程是如何工作的:

  1. 接收路由时的第一步是检查其下一跳的可用性。 这就是为什么当我们在Router5上收到一条没有设置Next-hop-self的路由时,这条路由没有被进一步处理。
  2. 接下来是权重参数。 该参数不是路径属性 (PA),并且不会在 BGP 消息中发送。 它在每个路由器上本地配置,仅用于操作路由器本身的路由选择。 让我们看一个例子。 就在上面,您可以看到 Router10 通过 Router9.9.9.0 (24) 选择了 12/192.168.112.12 的路由。 要更改Wieght参数,可以使用route-map设置特定路由,或者使用以下命令为其邻居分配权重:
     neighbor 192.168.107.7 weight 200       

    现在,来自该邻居的所有路由都将具有此权重。 让我们看看经过此操作后路线的选择如何变化:

    Router10#show bgp
    *Mar  2 11:58:13.956: %SYS-5-CONFIG_I: Configured from console by console
    BGP table version is 2, local router ID is 6.6.6.6
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
                  x best-external, a additional-path, c RIB-compressed,
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
         Network          Next Hop            Metric LocPrf Weight      Path
     *>  9.9.9.0/24       192.168.107.7                        200      123 45 i
     * i                          192.168.112.12           0          100      0 45 i

    如您所见,现在选择了通过 Router7 的路由,但这不会对其他路由器产生任何影响。

  3. 第三位是本地偏好。 该参数是众所周知的任意属性,这意味着它的存在是可选的。 该参数仅在一个AS内部有效,并且仅影响内部邻居的路径选择。 这就是为什么它仅在发往内部邻居的更新消息中传输的原因。 它不存在于外部邻居的更新消息中。 因此,它被归类为知名全权委托。 我们尝试在 Router5 上应用它。 在 Router5 上,我们应该有两条通往 9.9.9.0/24 的路由 - 一条通过 Router6,另一条通过 Router7。

    我们看:

    Router5#show bgp
    BGP table version is 2, local router ID is 5.5.5.5
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
                  x best-external, a additional-path, c RIB-compressed,
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
         Network          Next Hop            Metric LocPrf Weight Path
     *>i 9.9.9.0/24       192.168.56.6             0    100      0 45 i

    但正如我们看到的一条路由通过 Router6。 经过 Router7 的路由在哪里? 也许Router7也没有? 我们看看吧:

    Router#show bgp
    BGP table version is 10, local router ID is 7.7.7.7
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
                  x best-external, a additional-path, c RIB-compressed,
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
         Network                Next Hop            Metric LocPrf  Weight    Path
     *>i 9.9.9.0/24       192.168.56.6             0     100           0      45 i
    
                                  192.168.107.10                                  0     678 45 i 

    奇怪的是,一切似乎都很好。 为什么没有传输到Router5? 问题是 BGP 有一个规则:

    路由器仅传输它使用的那些路由。

    Router7使用经过Router5的路由,因此经过Router10的路由不会被转发。 让我们回到本地偏好。 让我们在 Router7 上设置本地首选项,看看 Router5 对此有何反应:

    route-map BGP permit 10
     match ip address 10
     set local-preference 250
    access-list 10 permit any
    router bgp 123
     neighbor 192.168.107.10 route-map BGP in</b>

    因此,我们创建了一个包含所有路由的路由映射,并告诉 Router7 在收到时将本地首选项参数更改为 250,默认值为 100。让我们看看 Router5 上发生了什么:

    Router5#show bgp
    BGP table version is 8, local router ID is 5.5.5.5
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
                  x best-external, a additional-path, c RIB-compressed,
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
         Network          Next Hop            Metric LocPrf Weight        Path
     *>i 9.9.9.0/24       192.168.57.7             0          250      0 678 45 i

    现在我们可以看到,Router5 更喜欢通过 Router7 的路由。 同样的图片将出现在 Router6 上,尽管选择通过 Router8 的路由对他来说更有利可图。 我们还补充说,更改此参数需要重新启动邻域才能使更改生效。 读 这里。 我们整理了本地偏好。 让我们继续讨论下一个参数。

  4. 优先选择下一跳参数为0.0.0.0的路由,即本地路由或​​聚合路由。 输入网络命令后,这些路由会自动分配一个等于最大值 32678 的权重参数:
    Router#show bgp
    BGP table version is 2, local router ID is 9.9.9.9
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
                  x best-external, a additional-path, c RIB-compressed,
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
         Network          Next Hop            Metric LocPrf Weight    Path
     *>  9.9.9.0/24       0.0.0.0                  0            32768    i
  5. 通过 AS 的最短路径。 选择最短的 AS_Path 参数。 一条路由经过的AS越少越好。 考虑 Router9.9.9.0 上到 24/10 的路由:
    Router10#show bgp
    BGP table version is 2, local router ID is 6.6.6.6
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
                  x best-external, a additional-path, c RIB-compressed,
    Origin codes: i - IGP, e - EGP, ? - incomplete
    RPKI validation codes: V valid, I invalid, N Not found
    
         Network          Next Hop            Metric LocPrf Weight Path
     *   9.9.9.0/24     192.168.107.7                           0           123 45 i
     *>i                     192.168.112.12           0    100       0       45 i

    可以看到,Router10 选择了 192.168.112.12 的路由,因为该路由的 AS_Path 参数只包含 45,而在另一种情况下则为 123 和 45。直观上很清楚。

  6. 下一个参数是原点。 IGP(使用BGP获得的路由)比EGP(使用BGP的前身获得的路由,不再使用)好,而EGP比Incomplete? (通过其他方法获得,例如通过重新分配)。
  7. 下一个参数是 MED。 我们有 Wiegt,它只能在路由器上本地工作。 有本地偏好,它只在一个自治系统内起作用。 正如您可能猜到的,MED 是将在自治系统之间传输的参数。 非常好 文章 关于这个参数。

不再使用更多的属性,但如果两条路由具有相同的属性,则使用以下规则:

  1. 选择经过最近的 IGP 邻居的路径。
  2. 为 eBGP 路径选择最旧的路由。
  3. 选择经过具有最小 BGP 路由器 ID 的邻居的路径。
  4. 选择一条经过 IP 地址最小的邻居的路径。

现在我们来看看BGP收敛的问题。

让我们看看如果 Router6 丢失通过 Router9.9.9.0 的路由 24/9 会发生什么情况。 让我们禁用Router0的Gi1/6接口,这会立即了解到与Router8的BGP会话已终止并且邻居已消失,这意味着从其接收的路由无效。 Router6立即发送Update消息,在Withdrawn Routes字段中指明网络9.9.9.0/24。 Router5一收到这样的消息,就会将其发送给Router7。 但由于 Router7 有一条经过 Router10 的路由,因此它会立即以新路由的更新响应。 如果无法根据接口的状态检测到邻居的故障,则必须等待保持计时器触发。

联盟。

如果您还记得,我们讨论过您经常必须使用全连接拓扑的事实。 如果一个 AS 中有大量路由器,这可能会导致大问题,为了避免这种情况,您需要使用联盟。 一个AS被划分为多个子AS,这使得它们无需全连接拓扑即可运行。

BGP 的工作原理

这是一个链接 拉布这里 GNS3 的配置。

例如,使用这种拓扑,我们必须将 AS 2345 中的所有路由器相互连接,但使用联盟,我们只能在直接相互连接的路由器之间建立邻接关系。 我们来详细谈谈这个问题。 如果我们只有 AS 2345,那么 拉福吉 收到了来自的游行 皮卡德 会告诉路由器 时间 и WORF,但他们不会告诉路由器这件事 破碎机 。 还有路由器本身分配的路由 拉福吉, 不会被转移 破碎机 也不 WORF-不好了 时间.

您必须配置路由反射器或完全连接的邻居关系。 通过将一个 AS 2345 分为 4 个子 AS(2,3,4,5、XNUMX、XNUMX、XNUMX)供每个路由器使用,我们最终得到不同的操作逻辑。 一切都被完美描述 这里.

来源:

  1. CCIE 路由和交换 v5.0 官方证书指南,第 2 卷,第五版,Narbik Kocharians,Terry Vinson。
  2. 网站 xgu.ru
  3. 网站 GNS3保险库.

来源: habr.com

添加评论