本文介绍如何在 Azure 私有 DNS 中设置 ResolutionPolicy 属性,以便在私有链接区域收到权威 NXDOMAIN 响应时,启用回退至互联网递归。 NXDOMAIN 也称为负响应。 当 DNS 解析程序收到(或缓存)负响应时,它不会向 DNS 客户端发送任何 DNS 响应,查询将失败。
问题
针对不同租户和资源组的 Azure 专用链接和网络隔离方案的专用 DNS 查询具有唯一的名称解析路径。 这可能会影响在租户控制之外访问已启用专用链接的资源的能力。 基于 VM 的解决方法可用于解决此问题,但这些解决方案会增加作复杂性,并与安全风险和更高的成本相关联。
解决方案
Azure 专用 DNS 中的 ResolutionPolicy 属性是全托管的原生解决方案。 当收到来自专用链接区域的权威 NXDOMAIN 响应且专用地址无法解析时,此属性将通过 Azure 的递归解析器集群启用公共递归。 使用 NxDomainRedirect 设置在虚拟网络链接级别启用解析策略。 在 Azure 门户中,通过在虚拟网络链接配置中选择“启用回退到 Internet”来启用 NxDomainRedirect。
策略定义
ResolutionPolicy 属性在 API 版本 2024-06-01 或更高版本中可用。 在以下示例中,resolutionPolicy 在 virtualNetworkLinks 资源级别设置为 NxDomainRedirect:
{
  "id": "'string'",
  "name": '"string'",
  "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
  "location": "global",
  "properties": {
    "provisioningState": "Succeeded",
    "registrationEnabled": bool,
    "resolutionPolicy": "NxDomainRedirect",
    "virtualNetwork": {
      "id": "'string'"
    }
  }
}
此设置在 Azure 门户中提供: 专用 DNS 区域>虚拟网络链接>支持回退到 Internet。
工作原理
NXDOMAIN (RCODE3) 响应表示(专用链接)查询的域名不存在。 此负答案通常阻止解析程序重试查询,直到缓存的负答案过期。
在虚拟网络链接上启用 NxDomainRedirect 解析策略时,Azure 递归解析程序会重试查询。 每当从专用区域范围从 PrivateEdge 接收 NXDOMAIN 响应时,解析程序都会使用公共终结点 QNAME 作为查询标签。
CNAME 链解析中可以看到此更改。
C:\>nslookup remoteprivateendpoint.blob.core.chinacloudapi.cn
Server:  UnKnown
Address:  168.63.129.16
Non-authoritative answer:
Name:    blob.mwh20prdstr02e.store.core.chinacloudapi.cn
Address:  203.0.113.33
Aliases:  remoteprivateendpoint.blob.core.chinacloudapi.cn
          remoteprivateendpoint.privatelink.blob.core.chinacloudapi.cn
局限性
- 此策略仅适用于与专用链接资源关联的专用 DNS 区域。
- ResolutionPolicy 参数仅接受 Default 或 NxDomainRedirect 作为可能的值。
演示降级到 Internet 解析
以下示例演示如何为专用链接区域启用回退到 Internet 解析(例如:privatelink.blob.core.chinacloudapi.cn)。
先决条件
- 至少有两个资源组:每个资源组都有一个虚拟网络和一个专用终结点。
- 资源组可以位于不同的区域或同一区域。
- 在此示例中,存储帐户与专用终结点一起使用,但可以链接其他 PaaS 服务。
 
- 运行 DNS 查询需要其中一个虚拟网络中的至少一个虚拟机。
- 虚拟机所在的虚拟网络应链接到其中一个专用链接区域。
 
本指南假定你已在进行下一步之前预配了必要的资源。 有关详细信息,请参阅 “使用 Azure 专用终结点”。
查看专用 DNS 区域
- 在 Azure 门户 主页 上,搜索并选择 专用 DNS 区域。 
- 查看名称列表,并验证至少有两个专用 DNS 区域具有相同的名称(privatelink.blob.core.chinacloudapi.cn)。 请参阅以下示例: 
- 选择专用链接区域,然后选择 记录集。 
- 验证每个专用区域中是否存在存储帐户的记录。 - 注释 - 同一资源组中的存储帐户在同一专用 DNS 区域中具有资源记录。 
 位于不同资源组中的存储帐户具有不同(同名)专用 DNS 区域中的资源记录。
演示 DNS 解析失败
- 记下在显示的第一个专用链接区域中的存储帐户的完全限定域名(FQDN)和 IP 地址(例如: - myeaststorageacct1.privatelink.blob.core.chinacloudapi.cn,- 10.40.40.5)。
- 另外,请记下具有相同名称的其他专用 DNS 区域的 FQDN 和 IP 地址(例如: - myeaststorageacct2.privatelink.blob.core.chinacloudapi.cn,- 10.10.10.5)。- 至少有一个专用 DNS 区域必须具有虚拟网络链接,该链接指向可从虚拟机运行查询的 VNet。
 
- 在 Azure 虚拟机上打开命令提示符,并尝试解析这两个存储帐户的 FQDN。 请参阅以下示例: - C:\>dig myeaststorageacct1.privatelink.blob.core.chinacloudapi.cn +short 10.40.40.5 C:\>dig myeaststorageacct2.privatelink.blob.core.chinacloudapi.cn +short
- 请注意,一个存储帐户能够解析,而另一个存储帐户无法解析。 
配置回退到 Internet 解析
- 再次选择每个专用 DNS 区域,选择 虚拟网络链接,然后选择铅笔“编辑”图标。 请参阅以下示例:   
- 在页面底部,选择启用 Internet 回退机制,然后选择保存。   
- 对每个专用链接区域重复这些步骤,并允许虚拟网络链接有时间更新。 
- 尝试再次解析存储帐户的 FQDN。 请参阅以下示例: - C:\>dig myeaststorageacct1.privatelink.blob.core.chinacloudapi.cn +short 10.40.40.5 C:\>dig myeaststorageacct2.privatelink.blob.core.chinacloudapi.cn +short blob.bl5prdstr19c.store.core.chinacloudapi.cn. 203.0.113.161- 之前无法解析的存储帐户现在通过互联网解析成功,使你能够访问已启用专用链接的资源。 
启用回退查询的虚拟网络链接
可以使用 Azure Resource Graph 资源管理器 或 Azure CLI 查询已启用回退的虚拟网络链接。 请参阅以下示例:
resources
| where tostring(properties.resolutionPolicy) contains 'NxDomainRedirect'
| extend privateDnsZone = extract("/privateDnsZones/([^/]+)/", 1, id)
| project privateDnsZone, resourceGroup, properties.resolutionPolicy
               
              
            
输入:
az graph query -q "resources
| where tostring(properties.resolutionPolicy) contains 'NxDomainRedirect'
| extend privateDnsZone = extract('/privateDnsZones/([^/]+)/', 1, id)
| project privateDnsZone, resourceGroup, properties.resolutionPolicy"
输出:
{
  "count": 4,
  "data": [
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "myresourcegroup"
    },
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "mywestrg2"
    },
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "mywestrg"
    },
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "myeastrg"
    }
  ],
  "skip_token": null,
  "total_records": 4
}
若要显示所有启用专用链接的区域的解析策略值,可以使用以下 Azure Resource Graph 资源管理器和 Azure CLI 查询:
resources
| where tostring(properties) contains 'resolutionPolicy'
| extend privateDnsZone = extract("/privateDnsZones/([^/]+)/", 1, id)
| project privateDnsZone, resourceGroup, properties.resolutionPolicy
输入:
az graph query -q "resources
| where tostring(properties) contains 'resolutionPolicy'
| extend privateDnsZone = extract('/privateDnsZones/([^/]+)/', 1, id)
| project privateDnsZone, resourceGroup, properties.resolutionPolicy"
以下 Azure CLI 示例输出的专用链接区域之一设置为 “默认 ”(已禁用回退),以演示如何显示此内容。
输出:
{
  "count": 4,
  "data": [
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "Default",
      "resourceGroup": "mywestrg"
    },
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "myresourcegroup"
    },
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "mywestrg2"
    },
    {
      "privateDnsZone": "privatelink.blob.core.chinacloudapi.cn",
      "properties_resolutionPolicy": "NxDomainRedirect",
      "resourceGroup": "myeastrg"
    }
  ],
  "skip_token": null,
  "total_records": 4
}
后续步骤
- 了解如何管理 DNS 区域中的 记录集和记录 。
