带有 Quagga BGP 的 DNS 的首选任播路径

网络工程 bgp 域名解析 斑驴 任播
2021-07-16 16:52:30

背景与目标

正在设置基于 Unbound 的高可用性 DNS 服务器。实际上,两个 DNS 服务器都有 12 个针对不同路由器的 BGP 会话,但为了简化此操作,下面仅显示了一个路由器。

两个 DNS 服务器都在 localhost ( 10.100.0.1, 10.100.0.2)上配置了相同的两个地址并且它们都使用 BGP 通告这些地址。问题是,如果其他路由器首选的 DNS 服务器挂起,则在 BGP 切换到两个地址的第二个 DNS 服务器之前会超时。我的目标是让每个 DNS 服务器对这两个地址之一负主要责任,因此 DNS 客户端不必等待 BGP 超时,而是按照他们最了解的方式处理故障转移。我不想在其他路由器上添加配置,只想在 DNS 服务器上添加配置。

                    +------------+
                    |            |
                +---+  Router 1  +---+
                |   |            |   |
                |   +------------+   |
                |                    |
          +-----+----+          +----+-----+
          |          |          |          |
          |  DNS 1   |          |  DNS 2   |
          |          |          |          |
          +----------+          +----------+

(primary) 10.100.0.1          10.100.0.1
          10.100.0.2          10.100.0.2 (primary)

问题与疑问

在下面的配置中,我如何让 DNS 110.100.0.1以更高的本地优先级宣布,以便其他路由器选择此服务器而不是 DNS 2,后者也宣布此 IP 但优先级较低?

router bgp 65002
    bgp router-id 10.0.0.1
    bgp confederation identifier 42xxx
    bgp confederation peers 65001 65002

    network 10.100.0.1/32
    network 10.100.0.2/32

    neighbor 10.0.0.10 remote-as 65001
    neighbor 10.0.0.10 route-map only-local-ASes out
!
ip as-path access-list only-local-ASes permit ^$
!
route-map only-local-ASes permit 10
match as-path only-local-ASes

我应该创建一个只为匹配的前缀 10.100.0.1 添加本地首选项 200 的路由映射吗?我遇到的问题是,这使得路由器只宣布 10.100.0.1 前缀,而不是同时以不同的偏好宣布两者(也是 10.100.0.2)。

软件

Linux kernel 4.4.0
Ubuntu 16.04 server
Quagga 0.99.24.1
2个回答

你所描述的不是任播的工作方式。对于任播,您将所有 DNS 服务器配置为相同的地址(通常在环回接口上),然后它们参与路由协议并从每个 DNS 服务器通告该地址。然后路由器从每个正在运行的服务器(当然,不是来自任何提供健壮性的死服务器)听到广告,并配置为在等成本路由上执行循环。由于 DNS 使用 UDP(至少最好)并且是幂等的,因此这种请求(以及最终负载)的传播不会影响服务。

作为额外的微调,您应该在路由器中设置基于 TCP 的 DNS 规则,其中连接中的所有数据包都需要转到同一服务器。有多种方法可以实现这一点,我见过的一种方法是配置另一台配置了该公共地址的服务器,但它不会将其通告到路由中,并且您将所有 TCP 发送到该服务器(因此它最终获得了所有AXFR 请求,例如)。

更精细的设置也是可能的。我做了一些相当复杂的...

解决方案是直接在 BGP 网络路由上设置一个路由映射。在 Quagga 文档(2016 年 7 月)中没有记录但有效。

network 10.100.0.1/32 route-map localpref150

完整的配置变成

router bgp 65002
    bgp router-id 10.0.0.1
    bgp confederation identifier 42xxx
    bgp confederation peers 65001 65002

    network 10.100.0.1/32 route-map localpref150
    network 10.100.0.2/32

    neighbor 10.0.0.10 remote-as 65001
    neighbor 10.0.0.10 route-map only-local-ASes out
!
ip as-path access-list only-local-ASes permit ^$
!
route-map only-local-ASes permit 10
match as-path only-local-ASes
!
route-map localpref150 permit 10
set local-preference 150
!