如何在 Linux 上使用 Quagga 执行 BGP 流量工程如何在 Linux 上使用 Quagga 执行 BGP 流量工程如何在 Linux 上使用 Quagga 执行 BGP 流量工程如何在 Linux 上使用 Quagga 执行 BGP 流量工程
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用 Quagga 执行 BGP 流量工程

前面的教程演示了如何将 CentOS 机器变成 BGP 路由器并使用 Quagga 过滤 BGP 前缀。现在我们了解了基本的 BGP 配置,我们将在本教程中研究如何在 Quagga 上执行更高级的流量工程。更具体地说,我们将展示如何通过调整 BGP 属性(例如本地首选项)来影响现有流量的路由路径。

路由和路径选择

在典型的互联网环境中,从源到目的地存在多条路由路径,流量的实际路径是经过精心流量工程的结果,涉及多种因素,包括路径中路由器/AS的跳数、带宽容量、路径可靠性、路径拥塞等。

更具体地说,流量选择的路由路径是由每个中间路由器根据其本地路由表做出的单独路由决策决定的。路由表中存储的路由可以是静态配置的、由IGP(如OSPF或EIGRP)学习的、或者由BGP学习的。一条路由可以由多个协议获知。在这种情况下,首选路由通常取决于某些特定于协议的属性,例如前缀长度和管理距离。在 BGP 世界中,我们可以通过调整 BGP 属性(例如 BGP 路由器中的本地首选项)来影响路径决策过程。

请注意,路由决策会影响转发流量,即由路由器发起的出站流量或由路由器转发的中转流量。

BGP 中的路径选择

在 BGP 中,IPv4 和 IPv6 前缀通过向 BGP 邻居发送和从 BGP 邻居接收的前缀通告在 Internet 上进行全球传播。当收到特定前缀的多条路由时,您的本地 BGP 路由器将决定通过其中一条路由转发发往该前缀的流量。同样,远程路由器将根据从其他路由器学到的前缀做出自己的路由决策,其中一些前缀可能是您自己通告的。如果远程路由器选择您通告的路由作为给定前缀的最佳路由,它将向您发送流量。

如果您仔细观察,可以使用下图来表示前缀通告和流量之间的关系。您可以看到流量的流动方向与前缀通告的相反方向。

BGP 是可定制性最高的路由协议之一。如果从多个邻居(具有不同的路由/路径)接收到相同的前缀,则在为该前缀选择最佳路径时会考虑许多 BGP 属性,如此处所述。

在以下部分中,我们将讨论如何调整其中一些属性以影响 BGP 路径选择过程。

BGP拓扑

对于本教程,我们将考虑以下拓扑。

Rotuer-A 与两个 eBGP 邻居 Router-B 和 Router-C 交换前缀。 Router-D 还与 Router-B 和 Router-C 建立 eBGP 对等互连,并与它们交换前缀。对于 Router-A 和 Router-D 之间的流量,我们将考虑以下要求。

  • 我们只能修改Router-A的配置,其他路由器不受我们控制。

  • 对于流向 Router-D 的传出流量,Router-A 应优先选择通过 Router-C 的路径。如果此路径不可用,则将使用通过 Router-B 的路径。

  • 对于来自 Router-D 的传入流量,Router-A 希望对两条路径之间的流量进行负载平衡。如果一条路径出现故障,所有流量将由另一条链路承载。

为了使本教程简单,我们不会详细介绍 BGP 配置。我提供配置摘要以供参考。

通过本地偏好影响传出流量

来自 Router-A 的出站流量所采用的路由将取决于它从 Router-B 和 Router-C 接收到的前缀。虽然我们假设只允许配置 Router-A,但出于演示目的,我们需要让 Router-D 向 Router-A 通告前缀。我们将首先配置 Router-D 来通告其自己的前缀。


router-d# conf t
router-d(config)# router bgp 400
router-d(config-router)# network  172.16.1.0 mask  255.255.255.0

请注意,AS-200 和 AS-300 是公交网络。由于没有定义活动前缀过滤器,这些网络会将它们学到的所有前缀转发给邻居。

现在,从 Router-A 的角度来看,它通过邻居 AS 200 和 AS 300 接收前缀 172.16.1.0/24。输出中的*>表示首选路径,即经过AS 200、Router-B。

本地优先级是一种 BGP 属性,可用于影响出站流量路径。它也是路径选择期间首先检查的属性之一。根据设计,具有最高本地优先级值的路由是最优选的路由。默认本地首选项为 100。

请注意,本地偏好对于每个自治系统来说都是本地的。也就是说,本地优先级值仅在同一 AS 中的路由器之间共享,并且永远不会暴露给其他相邻自治系统。

现在,我们将从 Router-C 接收的路由的本地优先级增加到 200。我们将在 Router-A 中创建一个 route-map 并使用它来修改本地首选项。


router-a# conf t
router-a(config)# route-map SET-LP permit 10
router-a(config-route-map)# set local-preference 200
router-a(config-route-map)# exit

router-a(config)# router bgp 100
router-a(config-router)# neighbor  10.10.13.3 route-map  SET-LP in

上述命令创建一个名为SET-LP的route-map。 route-map 的序列 10 是一个许可语句。由于没有特定的 match 子句,该语句将匹配所有前缀。 set 子句会将所有前缀的本地前缀设置为 200,该值高于默认值。然后,我们在 BGP 配置中调用此路由映射,并将其应用于邻居 10.10.13.3、路由器-C 的入站方向。

让我们验证一下更改是否已生效。

我们可以将上面的输出解释如下。

  • 由于较高的本地优先值,通过 Router-C (AS 300) 的路径是首选路径。

  • 通过 Router-B (AS 200) 的路由仍在学习中,默认本地优先级为 100。

  • 如果由于某种原因,Router-C 出现故障,则通过 Route-B 的路径将用作备份。

这证实我们已成功配置出站流量策略以满足要求。 traceroute 探测应该确认相同的情况。

注意:如果您的 ping/traceroute 不起作用,请确保您已在所有四个路由器中启用数据包转发。

使用选择性前缀通告对传入流量进行负载平衡

就入站流量而言,我们当然不能直接操纵本地AS之外的远程路由器来影响它们发送的入站流量。相反,AS 的传入流量可能会间接受到 AS 向全世界公布的前缀的影响。请记住,远程路由器的路由表中填充有它们收到的前缀通告。因此,通过选择性地通告本地 Router-A 的前缀,我们可以影响相邻 Router-D 的路由决策。

在任何路由协议(RIP、OSPF、BGP、IS-IS)中进行路由选择时的一个关键因素是前缀长度。无论任何协议特定的管理距离、属性或度量如何,具有最长前缀的路由始终是最佳路由。例如,带有 /27 掩码的前缀始终优于 /24 掩码,因为它具有更长的前缀长度。

我们将利用路由选择的这一特性,通过 Router-B 和 Router-C 对 Router-A 的传入流量进行负载平衡。让我们看看 AS 100 拥有的前缀,看看如何分解它。

在实验室环境中,您可以使用任何所需的前缀长度,包括 /32。但是,在公共可路由前缀等生产环境中,允许的前缀最大长度为 /24。对于此模拟,我们将使用以下策略通告 /24 和 /22 前缀。

  • 将前两个 /24 通告到 AS 200

  • 将另外两个 /24 通告给 AS 300

  • 将整个 /22 通告给 AS 200 和 AS 300

1. 负载均衡和回退选择

以下是 Router-A 上的前缀选择过程,该过程导致对其传入流量进行负载平衡。

  • /24 前缀是最具体的路由,因为它们具有最大子网掩码长度。因此,前两个 /24 前缀的首选路径是通过 AS 200,而对于后两个 /24 前缀,则通过 AS 300。

  • /24 前缀是整个 /22 前缀的一部分。如果由于某种原因,Router-D 没有收到来自任一邻居的 /24 通告,它将从其路由表中删除该路由。在这种情况下,对该特定 /24 的唯一可用引用将是通过 /22。例如,如果 Router-D 停止接收前缀 192.168.3.0/24,则该路由将从其路由表中删除。如果路由器有该网络的一些流量,则最接近的可用匹配是从两个邻居接收的 192.168.0.0/22。因此流量仍然可以路由到目标网络。

2. 创建前缀列表


router-a(config)# ip prefix-list  AS200_PRFX_OUT deny  192.168.2.0/23
router-a(config)# ip prefix-list  AS200_PRFX_OUT deny  192.168.2.0/24
router-a(config)# ip prefix-list  AS200_PRFX_OUT deny  192.168.3.0/24
router-a(config)# ip prefix-list  AS200_PRFX_OUT permit  192.168.0.0/22 le 24

上述命令将创建一个名为 AS200_PRFX_OUT 的前缀列表,该列表将拒绝特定的 /23 和 /24 前缀,同时允许 192.168.0.0/22 子网内的所有其他前缀,只要前缀长度不超过 /24。我们将为其他 /24 前缀创建一个类似的 prefix-list。


router-a(config)# ip prefix-list AS300_PRFX_OUT deny 192.168.0.0/23
router-a(config)# ip prefix-list AS300_PRFX_OUT deny 192.168.0.0/24
router-a(config)# ip prefix-list AS300_PRFX_OUT deny 192.168.1.0/24
router-a(config)# ip prefix-list AS300_PRFX_OUT permit 192.168.0.0/22 le 24

3. 创建路线图

我们将调用route-maps 中的prefix-lists 并将它们应用到BGP 配置中。


router-a(config)# route-map  AS200_RMAP_OUT permit  10
router-a(config-route-map)# match  ip address  prefix-list  AS200_PRFX_OUT
router-a(config-route-map)# exit

router-a(config)# route-map  AS300_RMAP_OUT permit  10
router-a(config-route-map)# match  ip address  prefix-list  AS300_PRFX_OUT
router-a(config-route-map)# exit

上面的命令创建了两个route-maps,允许与我们之前创建的prefix-lists匹配的前缀。


router-a(config)# router bgp 100
router-a(config-router)# neighbor  10.10.12.2 route-map  AS200_RMAP_OUT out
router-a(config-router)# neighbor  10.10.13.3 route-map  AS300_RMAP_OUT out

在上面的 BGP 配置中,我们指定向 AS 200 和 AS 300 中的邻居通告的出站前缀必须通过我们刚刚创建的 route-maps 进行过滤。

4. 公布前缀

现在我们将在 BGP 配置中通告前缀。


router-a(config-router)# router bgp 100
router-a(config-router)# network 192.168.0.0 mask  255.255.255.0
router-a(config-router)# network 192.168.1.0 mask  255.255.255.0
router-a(config-router)# network 192.168.2.0 mask  255.255.255.0
router-a(config-router)# network 192.168.3.0 mask  255.255.255.0
router-a(config-router)# network 192.168.0.0 mask  255.255.252.0

5. 验证广告

我们将使用以下命令验证前缀是否已通告以及是否正确接收。

对于公布的路线:


# show ip bgp <neighbor-IP-address> <advertised-routes>

对于收到的路由:


# show ip bgp <neighbor-IP-address> routes
# show ip bgp 

以下屏幕截图确认路由正在正确通告和接收。

6. 测试 BGP 回退

为了测试回退机制是否有效,我们将关闭 Route-A 和 Router-C 内的 BGP 对等互连。


router-a(config)# router bgp 100
router-a(config-router)# neighbor  10.10.13.3 shutdown

我们可以看到,路由 /22 仍在通过 AS 200 学习。我们可以使用 traceroute 来验证流量是否采用备份路径。

注意:如果您的 ping/traceroute 不起作用,请确保您已在所有四个路由器中启用数据包转发。

7. 概要配置

以下是所有四个路由器的最终配置,供您参考。

路由器-A:


router bgp 100
 network 192.168.0.0/22
 network 192.168.0.0/24
 network 192.168.1.0/24
 network 192.168.2.0/24
 network 192.168.3.0/24
 neighbor 10.10.12.2 remote-as 200
 neighbor 10.10.12.2 route-map AS200_RMAP_OUT out
 neighbor 10.10.13.3 remote-as 300
 neighbor 10.10.13.3 route-map SET-LP in
 neighbor 10.10.13.3 route-map AS300_RMAP_OUT out
!
ip prefix-list AS200_PRFX_OUT seq 5 deny 192.168.2.0/23
ip prefix-list AS200_PRFX_OUT seq 10 deny 192.168.2.0/24
ip prefix-list AS200_PRFX_OUT seq 15 deny 192.168.3.0/24
ip prefix-list AS200_PRFX_OUT seq 20 permit 192.168.0.0/22 le 24

ip prefix-list AS300_PRFX_OUT seq 5 deny 192.168.0.0/23
ip prefix-list AS300_PRFX_OUT seq 10 deny 192.168.0.0/24
ip prefix-list AS300_PRFX_OUT seq 15 deny 192.168.1.0/24
ip prefix-list AS300_PRFX_OUT seq 20 permit 192.168.0.0/22 le 24
!
route-map SET-LP permit 10
 set local-preference 200
!
route-map AS200_RMAP_OUT permit 10
 match ip address prefix-list AS200_PRFX_OUT
!
route-map AS300_RMAP_OUT permit 10
 match ip address prefix-list AS300_PRFX_OUT

路由器-B:


router bgp 200
 neighbor 10.10.12.1 remote-as 100
 neighbor 10.10.24.4 remote-as 400

路由器-C:


router bgp 300
 bgp router-id 10.10.34.3
 neighbor 10.10.13.1 remote-as 100
 neighbor 10.10.34.4 remote-as 400

路由器-D:


router bgp 400
 network 172.16.1.0/24
 neighbor 10.10.24.2 remote-as 200
 neighbor 10.10.34.3 remote-as 300

结论

总而言之,我们演示了一些 BGP 流量工程技术来影响入站和出站流量。如果我们知道如何路由流量或为冗余准备备份路由,则有很多选项可以使用 BGP 使其工作,例如权重、本地首选项、AS 路径前置、社区、MED 等。流量工程也可以使用其他协议来完成。请记住,正确的交通工程的核心是规划。归根结底,规划是最重要的阶段。接下来就是执行计划(如本教程中所示)。

希望这可以帮助。

©2015-2025 艾丽卡 support@alaica.com