我们是一家托管服务提供商,在悉尼的单个数据中心运行小型网络。我们最近在墨尔本(都在澳大利亚东海岸)部署了一个新的 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 路径前置,我才抓了抓头。
- https://routerjockey.com/2011/02/28/bgp-essentials-the-art-of-path-manipulation/
- https://lists.gt.net/nsp/juniper/3870
- http://blog.ipspace.net/2008/02/bgp-essentials-as-path-prepending.html
即使我可以让它工作,它似乎永远不会成为受支持的解决方案。
我在考虑什么
- 最后一个链接@ ipspace.net 提到您可以使用 local-pref,因为它保留在 AS 内。但是我已经制定了一个本地偏好策略来更喜欢下游客户路由、IXes、通常的......似乎使用 localpref 不会很好地混合。而伊万不建议这样做!
- 我确实考虑过使用 BGP Confederations - 但这对于我们的小型网络来说似乎是很多额外的工作。而且我还读到它无论如何都不会在联盟 AS 之间添加 AS 路径跃点。所以我可能会在同一个地方结束。
- 我会考虑使用 MPLS(我认为是 MPLS TE?)但我对 MPLS 非常敏感,并且已经面临很多挑战。所以我想避免增加的复杂性,除非它是我问题的一个很好的解决方案。
明天我会添加更多细节。现在,这是一个描绘我们当前设置的图表。