如何使用 BGP 和 Quagga 强制执行优先路由?

如何使用 BGP 和 Quagga 强制执行优先路由?

我目前正在设置两个路由器,它们将为我的服务器网络提供数据中心提供的私有 AS 编号。

我想要做的是为网络上的服务器提供 VRRP 故障转移默认路由,同时确保始终通过一条路径优先路由出站和入站,并且仅当主首选路径关闭时才采用另一条路径。即 MASTER/BACKUP 设置。

我已经把 VRRP 的东西整理好了。但我对 BGP 的了解非常基础。

让我画一些拓扑的 ASCII 图以使其更清晰一些。

ISPA (AS 1)               ISPB (AS 1)
  |                         |
  |                         |
  R1 --- P2P (ethernet) --- R2 (AS65007)
  |                         |
  +------- LAN (ipoib) -----+  

ISP A 和 B 路由器是同一数据中心的远程路由器。假设它们有 AS 1。此外,我还有一个私有 AS,即 65007

现在让我们再说一遍。我希望来自 AS 1 的流量始终通过 R1 到达我,而不是通过 R2,除非 R1 到 ISP A 的路径处于离线状态。

假设 ISPA 和 R1 分别有 IP 10.1.1.1/30 和 10.1.1.2/30。假设 ISPB 和 R2 分别有 IP 10.1.1.5/30 和 10.1.1.6/30。

还假设我想要宣传的网络范围是 192.168.1.0/25。

我的当前配置没有偏向路由,目前工作方式如下:

对于 R1(R2 几乎相同)。

ip prefix-list Net:Out seq 5 permit 192.168.1.0/25

router bgp 65007
  bgp router-id 10.1.1.2
  redistribute connected route-map Redist:BGP
  neighbor 10.1.1.1 remote-as 558
  neighbor 10.1.1.1 description Net
  neighbor 10.1.1.1 soft-reconfiguration inbound
  neighbor 10.1.1.1 prefix-list Net:Out out

route-map Redist:BGP permit 10
match ip address prefix-list Net:Out

** 这也存在问题,因为 R1 不知道它可以在 10.1.1.6 到达 R2。没有 IBGP。我该如何解决上面的问题?**

有人告诉我,我可以通过多种方式来偏向数据。我的 NOC 告诉我,我可以使用 localpref 并在备份路由器上添加我的 AS。

如果我理解正确的话,它看起来应该类似于以下内容。其中 R1 配置保持不变。这是 quagga 的正确语法吗?这会起作用吗?

ip prefix-list Net:Out seq 5 permit 192.168.1.0/25

router bgp 65007
  bgp router-id 10.1.1.6
  redistribute connected route-map Redist:BGP
  neighbor 10.1.1.5 remote-as 558
  neighbor 10.1.1.5 route-map Net:In in
  neighbor 10.1.1.5 description Net
  neighbor 10.1.1.5 soft-reconfiguration inbound
  neighbor 10.1.1.5 prefix-list Net:Out out

route-map Redist:BGP permit 10
match ip address prefix-list Net:Out
set as-path prepend 65007 65007

route-map Net:In
set local-preference 10

但是,当我向一位从事网络领域的熟人描述我的问题时,他告诉我数据仍然很有可能通过 R2 端从 ISP 传下来,并介绍了另一种方法。他说,如果 ISP 接受,我也可以使用 MED。或者,由于两条线路都来自同一个 ISP,他告诉我路由非常确定,并且始终会选择最专业的路径。因此,他建议我在主 R1 路由器上宣传两个网络。即两个 /26。这是正确的吗?它会起作用吗?我是否应该结合这两种方法?

ip prefix-list Net:Out seq 5 permit 192.168.1.0/26
ip prefix-list Net:Out seq 10 permit 192.168.1.64/26

router bgp 65007
  bgp router-id 10.1.1.2
  redistribute connected route-map Redist:BGP
  neighbor 10.1.1.1 remote-as 558
  neighbor 10.1.1.1 route-map in Net:In
  neighbor 10.1.1.1 description Net
  neighbor 10.1.1.1 soft-reconfiguration inbound
  neighbor 10.1.1.1 prefix-list Net:Out out

route-map Redist:BGP permit 10
match ip address prefix-list Net:Out

那么,各位 BGP 专家会给我什么建议呢?在进行必要的更改后,如何确定它确实有效。


更新:上面的子网方法不起作用。我猜我的提供商拒绝任何小于 25 的子网。当我在一个路由器上尝试时确认了这一点。 show ip bgp 根本没有传播路由。也许我可以使用 MED?这会比第一种方法更好吗?

答案1

有几种方法可以实现您想要的效果,是的,将您自己的 AS 添加到您向 ISP 通告的路由(前缀)中,并将 LOCAL_PREF 设置为您(将)在内部重新通告的路由,这是一个好主意。

基本上,你需要:

  1. 使通过 R1 通告的前缀(路由)成为 ISPA 的首选(影响入站路径)。
  2. 将所有从 R1 的 ISPA 收到的前缀(包括默认路由 - 假设您不使用任何静态路由)设置为内部网络的首选(影响出站路径)。这里有一个小提示:因为终端主机使用默认网关并且不执行路由,由 VRRP 将数据包从终端主机驱动到 R1,但无论如何您可以获得即使数据包到达 R2,R2 也会将这些数据包转发到 R1 而不是 ISPB。

对于第 1 点,MED、AS 前置、社区等都是可以调整的指标(即 BGP 属性),但无需从远程端进行修改就能起作用的指标很可能是 AS 前置(例如,MED 可能需要 ISP 路由器中的“bgp always-compare-med”之类的语句,具体取决于它们的配置)。

对于第 2 点,可以使用 LOCAL_PREF 和 WEIGHT(在本例中,我们也不关心社区和其他技术)。WEIGHT 是 Cisco 专有的(但 Quagga 使用它),而且它不包含在 BGP 更新中(本地重要),所以我会选择 LOCAL_PREF(但它适用于您还没有的 iBGP)。

话虽如此,为了按照您的意愿访问 netdc.com,一个选择是:

#
# R1
#
router bgp 65007
  bgp router-id 10.1.1.2
  network 192.168.1.0/25
  neighbor 10.1.1.1 remote-as 558
  neighbor 10.1.1.1 description Net
  neighbor 10.1.1.1 soft-reconfiguration inbound
  neighbor 10.1.1.1 route-map Net:In in
  neighbor 10.1.1.1 route-map Net:Out out

  neighbor iBGP_peers peer-group
  neighbor iBGP_peers remote-as 65007
  neighbor iBGP_peers password $whatyouwant
  neighbor iBGP_peers update-source $IP  #The interface in the common subnet 192.168.1.0/25, otherwise you need an internal routing protocol (IGP) also
  neighbor iBGP_peers next-hop-self      # Otherwise you need to advertise the p2p network between you and ISP

  neighbor $IP_R2_in_192.168.1.0 peer-group iBGP_peers
  neighbor $IP_R2_in_192.168.1.0 description R2

ip prefix-list local-allocations seq 10 permit 192.168.1.0/25

route-map Net:In
  description allow everything

route-map Net:Out
  description announce allocated routes sourced from our AS only (avoid to become a transit AS)
  match ip address prefix-list local-allocations

#
# R2
#
router bgp 65007
  bgp router-id 10.1.1.6
  network 192.168.1.0/25
  neighbor 10.1.1.5 remote-as 558
  neighbor 10.1.1.5 description Net
  neighbor 10.1.1.5 soft-reconfiguration inbound
  neighbor 10.1.1.5 route-map Net:In_backup in
  neighbor 10.1.1.5 route-map Net:Out_backup out

  neighbor iBGP_peers peer-group
  neighbor iBGP_peers remote-as 65007
  neighbor iBGP_peers password $whatyouwant
  neighbor iBGP_peers update-source $IP  #The interface in the common subnet 192.168.1.0/25, otherwise you need an internal routing protocol (IGP) also
  neighbor iBGP_peers next-hop-self      # Otherwise you need to advertise the p2p network between you and ISP

  neighbor $IP_R1_in_192.168.1.0 peer-group iBGP_peers
  neighbor $IP_R1_in_192.168.1.0 description R1

ip prefix-list local-allocations seq 10 permit 192.168.1.0/25

route-map Net:In_backup
  description iBGP will de-prefer all the prefixes
  set local-preference 10

route-map Net:Out_backup
  description announce allocated routes sourced from our AS only
  match ip address prefix-list local-allocations
  set as-path prepend 65007 65007 65007

顺便提一下,如果可以避免,重新分配是件坏事。使用“network”命令来通告你的前缀(在 Quagga 中,你不需要 RIB 中的子网,这与 Cisco 相反,甚至比它更好)。

相关内容