任意播 DNS 概述

本主题提供有关任意播 DNS 工作原理的信息。

什么是任意播?

任意播是一种为一组终结点提供多个路由路径的技术,每个终结点都分配有相同的 IP 地址。 组中的每个设备在网络上播发相同的地址,并使用路由协议来选择最佳目标。

通过任意播,你能够缩放无状态服务(如 DNS 或 HTTP),方法是将多个节点放置在同一 IP 地址后,并使用成本相等的多路径 (ECMP) 路由来定向这些节点之间的流量。 任意播不同于单播,单播中的每个终结点都有自己单独的 IP 地址。

为什么要将任意播与 DNS 配合使用?

使用任意播 DNS,可以启用 DNS 服务器或一组服务器,以根据 DNS 客户端的地理位置响应 DNS 查询。 这可以增强 DNS 响应时间并简化 DNS 客户端设置。 任意播 DNS 还提供额外的冗余层,有助于防范 DNS 拒绝服务攻击。

任意播 DNS 的工作原理

任意播 DNS 的工作原理是使用边界网关协议 (BGP) 等路由协议将 DNS 查询发送到首选 DNS 服务器或 DNS 服务器组(例如:负载均衡器管理的一组 DNS 服务器)。 这种设计可以通过从离客户端最近的 DNS 服务器获取 DNS 响应来优化 DNS 通信。

使用任意播,位于多个地理位置的服务器各自向其本地网关(路由器)播发一个相同的 IP 地址。 当 DNS 客户端启动对任意播地址的查询时,将评估可用路由,并将 DNS 查询发送到首选位置。 通常,根据网络拓扑,此位置是最近的。 请参阅以下示例。

位于不同站点的四台 DNS 服务器向网络宣布相同的任意播 IP 地址

图 1:任意播网络示例

  • 位于网络上不同站点的四个 DNS 服务器(蓝色圆圈)各自向其本地路由设备(未显示)宣布相同的任意播 IP 地址。
  • 路由在网络上的设备之间共享(黑色箭头)。
  • DNS 客户端设备(绿色圆圈)向任意播 IP 地址发送 DNS 查询。
  • 客户端的 DNS 请求由网络上的路由设备接收(未显示)。
  • 路由设备分析到任意播 IP 地址的可用路由,并使用最短的可用路由路由 DNS 查询。
  • DNS 查询将发送到最近的 DNS 服务器(蓝色箭头)。

任意播 DNS 目前通常用于路由许多全局 DNS 服务的 DNS 流量。 例如,根 DNS 服务器系统在很大程度上依赖于任意播 DNS。 任意播还适用于许多不同的路由协议,并且只能在 Intranet 上使用。

Windows Server 本机 BGP 任意播演示

以下过程演示如何将 Windows Server 上的本机 BGP 与任意播 DNS 一起使用。

要求

  • 一台装有 Hyper-V 角色的物理设备。
    • Windows Server 2012 R2、Windows 10 或更高版本。
  • 2 个客户端 VM(任何操作系统)。
    • 建议安装用于 DNS 的 BIND 工具,例如 dig。
  • 3 个服务器 VM(Windows Server 2016 或 Windows Server 2019)。
    • 如果 Windows PowerShell LoopbackAdapter 模块尚未安装在服务器 VM(DC001、DC002)上,则暂时需要访问 Internet 才能安装此模块。

Hyper-V 设置

按如下所示配置 Hyper-V 服务器:

  • 配置了 2 个专用虚拟交换机网络
    • 模拟 Internet 网络 131.253.1.0/24
    • 模拟 Intranet 网络 10.10.10.0/24
  • 2 个客户端 VM 附加到 131.253.1.0/24 网络
  • 2 个服务器 VM 附加到 10.10.10.0/24 网络
  • 1 台服务器是双宿主并连接到 131.253.1.0/24 和 10.10.10.0/24 网络。

虚拟机网络配置

使用以下设置在虚拟机上配置网络设置:

  1. Client1、client2
  • Client1:131.253.1.1
  • Client2:131.253.1.2
  • 子网掩码:255.255.255.0
  • DNS:51.51.51.51
  • 网关:131.253.1.254
  1. 网关 (Windows Server)
  • NIC1:131.253.1.254、子网 255.255.255.0
  • NIC2:10.10.10.254,子网 255.255.255.0
  • DNS:51.51.51.51
  • 网关:131.253.1.100(出于演示目的可忽略)
  1. DC001 (Windows Server)
  • NIC1:10.10.10.1
  • 子网:255.255.255.0
  • DNS:10.10.10.1
  • 网关:10.10.10.254
  1. DC002 (Windows Server)
  • NIC1:10.10.10.2
  • 子网 255.255.255.0
  • DNS:10.10.10.2*
  • 网关:10.10.10.254

*在对 DC002 执行域加入时,最初对 DNS 使用 10.10.10.1,以便可以在 DC001 上找到 Active Directory 域。

配置 DNS

使用服务器管理器和 DNS 管理控制台或 Windows PowerShell 安装以下服务器角色,并在两台服务器上分别创建一个静态 DNS 区域。

  1. DC001、DC002
  • 安装 Active Directory 域服务并提升为域控制器(可选)
  • 安装 DNS 角色(必需)
  • 在 DC001 和 DC002 上创建名为 zone.tst 的静态区域(非 AD 集成)
    • 在类型为“TXT”的区域中添加单个静态记录名称服务器
    • DC001 上 TXT 记录的数据(文本)= DC001
    • DC002 上 TXT 记录的数据(文本)= DC002

配置环回适配器

在 DC001 和 DC002 上的提升的 Windows PowerShell 提示符处输入以下命令以配置环回适配器。

注意

Install-Module 命令需要 Internet 访问权限。 这可以通过在 Hyper-V 中临时将 VM 分配给外部网络来完成。

$primary_interface = (Get-NetAdapter |?{$_.Status -eq "Up" -and !$_.Virtual}).Name
$loopback_ipv4 = '51.51.51.51'
$loopback_ipv4_length = '32'
$loopback_name = 'Loopback'
Install-Module -Name LoopbackAdapter -MinimumVersion 1.2.0.0 -Force
Import-Module -Name LoopbackAdapter
New-LoopbackAdapter -Name $loopback_name -Force
$interface_loopback = Get-NetAdapter -Name $loopback_name
$interface_main = Get-NetAdapter -Name $primary_interface
Set-NetIPInterface -InterfaceIndex $interface_loopback.ifIndex -InterfaceMetric "254" -WeakHostReceive Enabled -WeakHostSend Enabled -DHCP Disabled
Set-NetIPInterface -InterfaceIndex $interface_main.ifIndex -WeakHostReceive Enabled -WeakHostSend Enabled
Set-NetIPAddress -InterfaceIndex $interface_loopback.ifIndex -SkipAsSource $True
Get-NetAdapter $loopback_name | Set-DNSClient –RegisterThisConnectionsAddress $False
New-NetIPAddress -InterfaceAlias $loopback_name -IPAddress $loopback_ipv4 -PrefixLength $loopback_ipv4_length -AddressFamily ipv4
Disable-NetAdapterBinding -Name $loopback_name -ComponentID ms_msclient
Disable-NetAdapterBinding -Name $loopback_name -ComponentID ms_pacer
Disable-NetAdapterBinding -Name $loopback_name -ComponentID ms_server
Disable-NetAdapterBinding -Name $loopback_name -ComponentID ms_lltdio
Disable-NetAdapterBinding -Name $loopback_name -ComponentID ms_rspndr

虚拟机路由配置

在 VM 上使用以下 Windows PowerShell 命令来配置路由。

  1. 网关
Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-RemoteAccess -VpnType RoutingOnly
Add-BgpRouter -BgpIdentifier “10.10.10.254” -LocalASN 8075
Add-BgpPeer -Name "DC001" -LocalIPAddress 10.10.10.254 -PeerIPAddress 10.10.10.1 -PeerASN 65511 –LocalASN 8075
Add-BgpPeer -Name "DC002" -LocalIPAddress 10.10.10.254 -PeerIPAddress 10.10.10.2 -PeerASN 65511 –LocalASN 8075
  1. DC001
Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-RemoteAccess -VpnType RoutingOnly
Add-BgpRouter -BgpIdentifier “10.10.10.1” -LocalASN 65511
Add-BgpPeer -Name "Labgw" -LocalIPAddress 10.10.10.1 -PeerIPAddress 10.10.10.254 -PeerASN 8075 –LocalASN 65511
Add-BgpCustomRoute -Network 51.51.51.0/24
  1. DC002
Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-RemoteAccess -VpnType RoutingOnly
Add-BgpRouter -BgpIdentifier "10.10.10.2" -LocalASN 65511
Add-BgpPeer -Name "Labgw" -LocalIPAddress 10.10.10.2 -PeerIPAddress 10.10.10.254 -PeerASN 8075 –LocalASN 65511
Add-BgpCustomRoute -Network 51.51.51.0/24

摘要图

本机 BGP 任意播 DNS 的实验室设置演示

图 2:本机 BGP 任意播 DNS 的实验室设置演示

任意播 DNS 演示

  1. 验证网关服务器上的 BGP 路由

    PS C:\> Get-BgpRouteInformation

    DestinationNetwork NextHop LearnedFromPeer State LocalPref MED
    **************************************************************
    51.51.51.0/24 10.10.10.1 DC001 Best
    51.51.51.0/24 10.10.10.2 DC002 Best

  2. 在 client1 和 client2 上,验证是否可以访问 51.51.51.51

    PS C:\> ping 51.51.51.51

    使用 32 字节数据 Ping 51.51.51.51:
    来自 51.51.51.51 的回复:bytes=32 time<1ms TTL=126
    来自 51.51.51.51 的回复:bytes=32 time<1ms TTL=126
    来自 51.51.51.51 的回复:bytes=32 time<1ms TTL=126
    来自 51.51.51.51 的回复:bytes=32 time<1ms TTL=126

    Ping 51.51.51.51 的统计信息:
    数据包:Sent = 4, Received = 4, Lost = 0 (0% loss),
    大约往返时间(以毫秒为单位):
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

    注意

    如果 ping 失败,还要检查是否有防火墙规则阻止 ICMP。

  3. 在 client1 和client2 上,使用 nslookup 或 dig 查询 TXT 记录。 下面显示了二者的示例。

    PS C:\> dig server.zone.tst TXT +short
    PS C:\> nslookup -type=txt server.zone.tst 51.51.51.51

    一个客户端显示“DC001”,另一个客户端显示“DC002”,验证任意播是否正常工作。 还可以从网关服务器进行查询。

  4. 接下来,在 DC001 上禁用以太网适配器。

    PS C:\> (Get-NetAdapter).Name
    环回
    以太网 2
    PS C:\> Disable-NetAdapter "Ethernet 2"
    确认
    是否确实要执行此操作?
    Disable-NetAdapter“以太网 2”
    [Y] 是 [A] 全部是 [N] 否 [L] 全部否 [S] 暂停  [?] 帮助 (默认值为 "Y"):
    PS C:\> (Get-NetAdapter).Status
    向上
    已禁用

  5. 确认以前从 DC001 接收响应的 DNS 客户端已切换到 DC002。

    PS C:\> nslookup -type=txt server.zone.tst 51.51.51.51
    服务器:未知
    地址:51.51.51.51

    server.zone.tst text =

    “DC001”
    PS C:\> nslookup -type=txt server.zone.tst 51.51.51.51
    服务器:未知
    地址:51.51.51.51

    server.zone.tst text =

    “DC002”

  6. 使用网关服务器上的 Get-BgpStatistics 确认 DC001 上的 BGP 会话已关闭。

  7. 再次启用 DC001 上的以太网适配器并确认 BGP 会话已还原并且客户端再次收到来自 DC001 的 DNS 响应。

注意

如果未使用负载均衡器,单个客户端将使用相同的后端 DNS 服务器(如果可用)。 这会为客户端创建一致的 BGP 路径。 有关详细信息,请参阅 RFC4786 的第 4.4.3 节:等价路径

常见问题

问:任意播 DNS 是否适合在本地 DNS 环境中使用?
答:任意播 DNS 可与本地 DNS 服务无缝协作。 但是,DNS 服务不需要任意播即可缩放。

问:在具有大量(例如:>50)域控制器的环境中实施任意播 DNS 会产生什么影响?
答:对功能没有直接影响。 如果使用负载均衡器,则不需要在域控制器上进行其他配置。

问:Microsoft 客户服务是否支持任意播 DNS 配置?
答:如果使用非 Microsoft 负载均衡器转发 DNS 查询,Microsoft 支持与 DNS 服务器服务相关的问题。 有关与 DNS 转发相关的问题,请咨询负载均衡器供应商。

问:具有大量(例如:>50)域控制器的任意播 DNS 的最佳做法是什么?
答:最佳做法是在每个地理位置使用负载均衡器。 负载均衡器通常由外部供应商提供。

问:Anycast DNS 和 Azure DNS 是否具有类似的功能?
答:Azure DNS 使用任意播。 若要将任意播与 Azure DNS 配合使用,请将负载均衡器配置为将请求转发到 Azure DNS 服务器。