![当我的对等体均未直接宣布前缀时,BGP 首选给定前缀的出站对等体(由默认路由处理)](https://linux22.com/image/572455/%E5%BD%93%E6%88%91%E7%9A%84%E5%AF%B9%E7%AD%89%E4%BD%93%E5%9D%87%E6%9C%AA%E7%9B%B4%E6%8E%A5%E5%AE%A3%E5%B8%83%E5%89%8D%E7%BC%80%E6%97%B6%EF%BC%8CBGP%20%E9%A6%96%E9%80%89%E7%BB%99%E5%AE%9A%E5%89%8D%E7%BC%80%E7%9A%84%E5%87%BA%E7%AB%99%E5%AF%B9%E7%AD%89%E4%BD%93%EF%BC%88%E7%94%B1%E9%BB%98%E8%AE%A4%E8%B7%AF%E7%94%B1%E5%A4%84%E7%90%86%EF%BC%89.png)
我连接到 2 个 BGP 对等体;它们都为我提供了一个过滤表,每个表包含一个默认值 + 大约 30K 个前缀(不是完整表)。对于我收到的前缀,我只需让 BGP 使用它的前缀长度算法来选择最佳路由。对于我没有收到的前缀(即:适用“默认值”),我倾向于使用 BGP 对等体 1。问题是,对于我没有从任何 BGP 对等体收到的一个特定前缀(即:将适用默认值),我希望优先使用 BGP 对等体 2,而不是通常的对等体 1。我知道我可以容易地使用静态路由来执行此操作,但这听起来不太正确,因为如果我向对等体 2 的路由器添加静态路由并且路由丢失,则静态路由将“粘住”,并且我将无法将任何流量推送到该前缀。如果我能找到 BGP 机制来执行相同操作,我可以优先选择到 BGP 对等体 2 的路由,但如果该路由不可用,则将使用到 BGP 对等体 1 的路由。
为了操纵我的出站路由,我使用路由图为接收前缀的出站流量设置相同的本地首选项,因此使用 BGP 的默认前缀列表长度算法,并且我使用 BGP 对等体 1 的“默认”路由为出站流量设置更高的首选项。
不幸的是,我不知道如何使用路由图来为我的特殊前缀执行此操作,因为系统中不存在具有该前缀的对象:就两个 BGP 对等体而言,它由“默认”路由处理。
我使用Quagga
BGP 进行路由,因此 BGP 不是唯一可用的协议。思科式的解决方案也不错,因为我怀疑我缺乏一些基本知识,任何正确的指导都会帮助我找到出路。
这是我的 bgpd.conf 文件,已编辑以删除个人信息;希望我没有做得过分:
router bgp 12345
bgp router-id 10.0.0.1
network 10.0.0.0/24
redistribute connected
!
neighbor 10.0.1.1 remote-as 22222
neighbor 10.0.1.1 ebgp-multihop 3
neighbor 10.0.1.1 next-hop-self
neighbor 10.0.1.1 distribute-list distrib-out out
neighbor 10.0.1.1 route-map INBGP1 in
!
neighbor 10.0.2.1 remote-as 11111
neighbor 10.0.2.1 ebgp-multihop 10
neighbor 10.0.2.1 next-hop-self
neighbor 10.0.2.1 distribute-list distrib-out out
neighbor 10.0.2.1 route-map INBGP2 in
!
access-list distrib-out permit 10.0.0.0/24
!
access-list is-default permit 0.0.0.0/0 exact-match
!
route-map INBGP2 permit 10
set metric 2
set ip next-hop 89.121.231.73
on-match next
!
route-map INBGP2 permit 20
match ip address is-default
set local-preference 101
on-match goto 1000
!
route-map INRTC permit 30
set local-preference 110
set metric 1
!
route-map INBGP2 permit 10
set metric 1
on-match next
!
route-map INBGP1 permit 20
match ip address is-default
set local-preference 200
on-match goto 1000
!
route-map INBGP1 permit 30
set local-preference 110
set metric 1
答案1
添加一个静态路由,其下一跳仅因为到对等体 2 的路由而到达对等体 2。这样,只要您接收该路由,静态路由就会指向对等体 2。但是一旦您丢失该路由,您现有的故障转移就会将其翻转。
挑选任何路由将到达对等点 2,但如果无法到达对等点 2,该路由将消失。然后为要覆盖的流量添加静态路由,下一跳由您选择的路由覆盖。这将导致与第二条路由匹配的流量跟踪第一条路由。
例如,假设您要控制流量的前缀是216.152.32.0/24
。您制定一条到的静态路由216.152.32.0/24
并选择其下一跳。由于它是静态路由,因此到的流量216.152.32.0/24
将被路由到该下一跳(假设没有更具体的路由,但实际上没有)。因此,这将问题简化为选择合适的下一跳。
您希望当到对等点 2 的链接正常时,流量朝一个方向流动,而当该链接不工作时,流量朝另一个方向流动。因此,您需要选择具有该属性的下一跳。原则上,您从对等点 2 动态接收的路由中的任何 IP 都可以工作。当您有该路由时,该流量将流向对等点 2,而当您没有该路由时,流量将按照您的默认设置流向对等点 1。(假设您的默认设置已正确设置为故障转移。)
理想情况下,选择一条对等点 2 来说是“核心”的路由,但不要太靠近您的连接点。您希望它成为对等点 2 的“核心”,因为您不希望它永远翻转到对等点 1。您不希望它离您太近,因为如果您的节点被隔离,您希望故障转移到对等点 2。如果您对几个随机站点进行跟踪路由,您可能能够在附近的城市找到其主干上的核心路由器。那就行了。
答案2
有一个直接的解决方案可以解决您的问题,无需使用静态路由。在深入探讨之前,我想谈谈您描述中的一个语义方面。最长前缀匹配规则与 BGP 无关。您应该考虑 BGP 路径选择算法。每个供应商都对此算法进行了自己的调整;但是,大多数都与思科的非常相似算法。
您可以完全控制从您的站点到 ISP 方向的流量。您可以使用本地首选项或多出口鉴别器 (MED) 来影响此方向的路由。为了简单起见,我建议使用其中一种。在 ISP 发送给您的前缀上实施此策略(即您的入站策略)。
1) 本地优先级 - 首选最高的本地优先级(默认本地优先级为 100)。本地优先级在 BGP 最佳路径解决方案中处于较早的位置,并且在 AS_LENGTH 之前进行评估。您的提供商无法向您发送具有本地优先级的前缀;本地优先级不会跨越 AS 边界。
2) MED - 优先选择最低的 MED。您的提供商可能会在其前缀上发送 MED。在 Cisco 路由器上,除非您启用bgp bestpath med 缺失为最差. 在 BGP 路径选择算法中,MED 在 AS_LENGTH 之后进行评估。
您可能想阅读思科的BGP 案例研究我也强烈推荐这本书互联网路由架构由 Sam Halabi 提供有关 BGP 及其用法的详细信息。