与不同 POP 的 iBGP 对等体之间的入站和出站流量工程

网络工程 思科 bgp ospf ios-xe 交通工程
2021-07-25 23:02:08

我们是一家托管服务提供商,在悉尼的单个数据中心运行小型网络。我们最近在墨尔本(都在澳大利亚东海岸)部署了一个新的 POP 州际公路,这是我第一次不得不面对交通工程方面的现实挑战。我希望我能在这里得到一些关于如何对我的 iBGP 路径进行某种程度的控制的指导。

我可能会发布一些相互关联的问题,但在这种情况下,我特别关注内部流量工程。我发现很难弄清楚如何让 iBGP 做出最佳路由决策。

我的主要目标是需要找到一种方法来为 iBGP 提供一些边界和每个 POP 距离的概念。所以我可以区分同一城市的 POP、州际的 POP、东海岸和西海岸的 POP。然后在此基础上优化入站/出站路由。

我知道会有很多逐案场景,但我希望我可以开发一种 iBGP 路由策略,该策略可能在 80% 的时间内都有效,其余的我将不得不处理特殊的边缘情况配置。

语境

  • 我们刚刚购买了 4 台 ASR 1001-X 作为我们在每个 POP 的边缘设备(每个 POP 2 台,但由于切换硬件限制,我目前只专注于在墨尔本部署 1 台边缘设备)
  • 我们还利用瞻博网络来切换硬件。EX4500 作为我们的“核心交换机”,EX4200 作为接入层。
  • 我们现在有 2 家中转供应商。我们只在一个状态下与每个提供商互连。
  • AS 1000 是一个聚合器,并使用 AS 4000 作为其在悉尼的主要上游之一。
  • 这带来了一些挑战,因为通过 AS 1000 接收的所有路径通常比我们从 AS 4000 获得的路径长 1。
  • 我正在使用 Ansible 使用 Jinja2 模板生成 IOS 配置。因此,生成大量的每个 iBGP 对等路由映射逻辑来完成工作不是问题。

我的目标

本质上,我希望能够在部署 POP 时在 POP 之间实现最佳路由。但是现在我无法对 iBGP 如何选择它的路径实现任何级别的控制。

我现在的设计

  • 我目前有 2 个 ASR1K 作为边缘路由器,在悉尼有完整的桌子,在墨尔本有一个。
  • 两种 POP 都使用不同的传输提供商。
  • 我们在两个 POP 之间有一个点对点电路,它由 dot1q 子接口上的边缘设备在两侧终止。
  • 我们在所有边缘设备之间的这条链路上运行 OSPF,链路成本增加,因此这是最低优先级的 OSPF 路径。
  • 我们有一个跨越两个 POP 的 OSPF 区域 0。
  • 边缘设备更像是一个融合的核心/边缘——我们的核心交换机没有做太多的 L3,因为它们不能处理一个完整的表。
  • 在每个 POP 中,ASR1K 充当该 POP 中其他 BGP 设备(防火墙、核心交换机、LNS 等)的路由反射器。
    • 每个都有自己的集群 ID - 不是每个 POP。期待将其更改为 per-POP。
  • 每个 ASR1K 通过 BGP 向路由反射器客户端发起默认路由。
  • 所有 ASR1K 都在 iBGP 网格中。
  • 所有传输在所有站点都具有相同的本地首选项。

次优路由示例

  • 如果我的墨尔本和悉尼过境全部在线,则出站路由工作正常。悉尼交通从悉尼出口,墨尔本从墨尔本出口。
  • 问题是,仅仅通过管理员禁用我的主要悉尼公交,我的墨尔本公交现在自动成为首选。而不是通过悉尼的 BDR02 路由器进行二级悉尼过境。
  • 因此,我经常会遇到这样一种情况:流量将通过我们的回程反弹到墨尔本,从墨尔本退出,然后返回悉尼。发生 < 1 毫秒的路径现在大约是 30 毫秒。
  • 更糟糕的是,在这种特殊情况下,我无法弄清楚为什么首选墨尔本。

    • 重量是一样的
    • 本地偏好是相同的
    • AS 路径长度相同
    • 两条路径都不是自发的。
    • 两者都以 IGP 作为原点。
    • 两者的指标 (MED?) 均为 0。
    • 从该路由器的角度来看,两者都是 iBGP 路径。
    • IGP 指标我认为与 OSPF 链路成本相关,因为我们使用 OSPF 作为我们的 IGP。
    • 我已经确认所有 OSPF 设备都设置了 100G 参考带宽。

编辑:30/01:我认为我对 IGP 成本的计算方式有误,也许它们目前是相同的?我所有的 OSPF 路由都是 E2 类型。如果 IGP 成本相同,那么我认为基于 RID 进行最佳路径选择是有意义的,在这种情况下,MEL BDR 的 RID 将低于 SYD。

我已将悉尼之间的 OSPF 链接成本设置为 15,000,远高于默认值。我已经计算出它可以在我们的 100 Gbps 参考带宽下可靠地工作。

在 OSPF 链路成本方面 - 这是 BGP 路由的每个下一跳的 OSPF 首选项:

bdr-01-syd#sh ip route x.x.201.73 (AS 4000 next hop)
Routing entry for x.x.201.72/30
  Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 15000
  Last update from x.x.13.51 on Port-channel1.1125, 14:57:17 ago
  Routing Descriptor Blocks:
  * x.x.13.51, from x.x.13.66, 14:57:17 ago, via Port-channel1.1125
      Route metric is 20, traffic share count is 1
bdr-01-syd#

bdr-01-syd#sh ip route x.x.31.5 (AS 1000 next hop)
Routing entry for x.x.31.4/30
  Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 5
  Last update from x.x.216.67 on Port-channel1.36, 1d00h ago
  Routing Descriptor Blocks:
  * x.x.216.67, from x.x.216.163, 1d12h ago, via Port-channel1.36
      Route metric is 20, traffic share count is 1
bdr-01-syd#


x.x.201.73 is the next hop to 139.130.4.4 via the Melbourne path.

x.x.13.51 is the other end of the inter-state Point to Point. x.x.13.66 is BDR-01-MEL.

x.x.31.5 is the next hop to 139.130.4.4 via the Secondary Sydney transit in the same POP as the primary transit - via BDR-02-SYD.

x.x.216.67 is the local OSPF VLAN for the Sydney POP that both BDR01 and BDR02 are in.

x.x.216.163 is the BDR-02-SYD router.

就这些 OSPF 选择而言,我可以看到选择了较短的 OSPF“转发度量”。我本以为 BGP 应该基于此选择悉尼路径。

您可以从这条跟踪中看到,我们立即通过 Backhaul 跳到墨尔本,因为第一跳是 13 毫秒:(139.130.4.4 是任播的并且在两个州都有路径)。

bdr-01-syd#traceroute 139.130.4.4
Type escape sequence to abort.
Tracing the route to 139.130.4.4
VRF info: (vrf in name/id, vrf out name/id)
  1 x.x.13.51 13 msec 13 msec 13 msec
  2 x.x.201.73 14 msec 14 msec 14 msec
  3 x.x.196.54 [AS 4000] [MPLS: Label 25049 Exp 0] 14 msec 14 msec 14 msec
  4 x.x.196.51 [AS 4000] 14 msec 14 msec 14 msec
  5 139.130.110.29 [AS 1221] 14 msec 15 msec 14 msec
  6 203.50.11.113 [AS 1221] 16 msec 14 msec 16 msec
  7 139.130.4.4 [AS 1221] 13 msec 14 msec 14 msec
bdr-01-syd#

bdr-01-syd#sh ip route 139.130.4.4
Routing entry for 139.130.0.0/16
  Known via "bgp 5000", distance 200, metric 0
  Tag 4000, type internal
  Last update from x.x.201.73 06:06:14 ago
  Routing Descriptor Blocks:
  * x.x.201.73, from x.x.13.66, 06:06:14 ago
      Route metric is 0, traffic share count is 1
      AS Hops 2
      Route tag 4000
      MPLS label: none
bdr-01-syd#

bdr-01-syd#sh ip bgp regexp ^1000 1221$
BGP table version is 11307146, local router ID is x.x.216.161
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,
              t secondary path,
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  139.130.0.0      x.x.31.5             0    100      0 1000 1221 i
...

Versus the path via AS 4000:

bdr-01-syd#sh ip bgp regexp ^4000 1221$
 *>i  138.130.0.0      x.x.201.73            0    100      0 4000 1221 i

bdr-01-syd#

在此输出中,二级悉尼公交是有效路径,墨尔本公交也是如此。墨尔本被选为最佳。

bdr-01-syd#sh ip bgp 139.130.4.4
BGP routing table entry for 139.130.0.0/16, version 10794227
Paths: (2 available, best #2, table default)
  Advertised to update-groups:
     66
  Refresh Epoch 1
  1000 1221, (received & used)
    x.x.31.5 (metric 20) from x.x.216.163 (x.x.216.163)
      Origin IGP, metric 0, localpref 100, valid, internal
      Community: 1000:65110 5000:1000 5000:1001 5000:1002
      rx pathid: 0, tx pathid: 0
  Refresh Epoch 2
  4000 1221, (received & used)
    x.x.201.73 (metric 20) from x.x.13.66 (x.x.13.66)
      Origin IGP, metric 0, localpref 100, valid, internal, best
      Community: 4000:5307 4000:6100 4000:53073 5000:1000 5000:1030 5000:1031
      rx pathid: 0, tx pathid: 0x0
bdr-01-syd#

我试过的

我尝试添加 15,000 的 OSPF 链接成本,我根据我的 100 Gbps 参考带宽将其计算为安全数字,因为始终是最不喜欢的 OSPF 成本。我认为这会算作“IGP 成本”,但出于某种原因,BGP 仍然更喜欢墨尔本路径。

在这似乎没有任何影响之后,我的主要计划是在 iBGP 之前使用 AS PATH。计划是每个 POP 都有对等组。在我的模板中,我会根据两个 POP 相距多远来指定要执行多少前置操作。我原以为这将是一个相当常见的目标类型。

例如:

  • 如果是 POP 内,则为 0
  • 1 前置如果州内 POP
  • 2 前置如果州际 POP
  • 3 前置如果东西海岸 POP

我认为这会非常完美,是一个非常优雅的解决方案,并且正是我希望得到的解决方案类型。我在几个小时内编写了配置并进行了部署。但是直到我意识到 iBGP 不支持 AS 路径前置,我才抓了抓头。

即使我可以让它工作,它似乎永远不会成为受支持的解决方案。

我在考虑什么

  • 最后一个链接@ ipspace.net 提到您可以使用 local-pref,因为它保留在 AS 内。但是我已经制定了一个本地偏好策略来更喜欢下游客户路由、IXes、通常的......似乎使用 localpref 不会很好地混合。而伊万不建议这样做!
  • 我确实考虑过使用 BGP Confederations - 但这对于我们的小型网络来说似乎是很多额外的工作。而且我还读到它无论如何都不会在联盟 AS 之间添加 AS 路径跃点。所以我可能会在同一个地方结束。
  • 我会考虑使用 MPLS(我认为是 MPLS TE?)但我对 MPLS 非常敏感,并且已经面临很多挑战。所以我想避免增加的复杂性,除非它是我问题的一个很好的解决方案。

明天我会添加更多细节。现在,这是一个描绘我们当前设置的图表。

州际数据中心图

1个回答

两条路由都是外部类型 2,将路由通告为 OSPF E1,E1 始终优先于 E2,这解决了问题。