本文介绍如何在 Azure 专用 DNS 中设置 ResolutionPolicy 属性,以便在收到专用链接区域的权威 NXDOMAIN 响应时启用回退到 Internet 递归。 NXDOMAIN 也称为负响应。 当 DNS 解析程序收到(或缓存)负响应时,它不会向 DNS 客户端发送任何 DNS 响应,查询将失败。
问题
对于跨不同租户和资源组的 Azure 专用链接和网络隔离方案,其专用 DNS 查询具有唯一的名称解析路径。 这可能会影响脱离租户控制访问已启用专用链接的资源的能力。 基于 VM 的解决方法可用于解决此问题,但这些解决方案会增加操作复杂性,而且存在安全风险并使成本提高。
解决方案
Azure 专用 DNS 中的 ResolutionPolicy 属性是完全托管的本机解决方案。 当收到专用链接区域的权威 NXDOMAIN 响应且专用地址解析失败时,此属性通过 Azure 的递归解析程序舰队启用公共递归。 使用 NxDomainRedirect 设置在虚拟网络链接级别启用解析策略。 在 Azure 门户中,NxDomainRedirect 是通过在虚拟网络链接配置中选择“启用回退到 Internet”来启用的。
策略定义
API 版本 2024-06-01 或更高版本中提供了 ResolutionPolicy 属性。 在以下示例中,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.windows.net
Server: UnKnown
Address: 168.63.129.16
Non-authoritative answer:
Name: blob.mwh20prdstr02e.store.core.windows.net
Address: 203.0.113.33
Aliases: remoteprivateendpoint.blob.core.windows.net
remoteprivateendpoint.privatelink.blob.core.windows.net
限制
- 此策略仅适用于与专用链接资源关联的专用 DNS 区域。
- ResolutionPolicy 参数仅接受 Default 或 NxDomainRedirect 作为可能值。
演示回退到 Internet 解析
以下示例演示如何为专用链接区域启用回退到 Internet 解析(例如:privatelink.blob.core.windows.net)。
先决条件
- 至少有两个资源组:每个资源组都有一个虚拟网络和一个专用终结点。
- 资源组可以位于不同的区域,也可以位于同一区域。
- 在此示例中,存储帐户与专用终结点一起使用,但可以链接其他 PaaS 服务。
- 运行 DNS 查询需要其中一个虚拟网络中的至少一个虚拟机。
- 该虚拟机所在的虚拟网络应链接到其中一个专用链接区域。
本指南假定你已在继续操作之前预配了必备资源。 有关详细信息,请参阅使用 Azure 专用终结点。
查看专用 DNS 区域
在 Azure 门户的“主页”页面上,搜索并选择“专用 DNS 区域”。
查看名称列表,并验证至少有两个专用 DNS 区域的名称 (privatelink.blob.core.windows.net) 相同。 请参阅以下示例:
选择专用链接区域,然后选择“记录集”。
验证每个专用区域中是否存在存储帐户的记录。
注意
同一资源组中的存储帐户将资源记录放在同一专用 DNS 区域中。
不同资源组中的存储帐户将资源记录放在不同(同名)专用 DNS 区域中。
演示 DNS 解析失败
记下显示的第一个专用链接区域中存储帐户的完全限定域名 (FQDN) 和 IP 地址(例如:
myeaststorageacct1.privatelink.blob.core.windows.net
,10.40.40.5
)。另外,请记下具有相同名称的其他专用 DNS 区域的 FQDN 和 IP 地址(例如:
myeaststorageacct2.privatelink.blob.core.windows.net
,10.10.10.5
)。- 这些专用 DNS 区域中必须至少有一个通过虚拟网络链接到 VNet,在那里可以从虚拟机运行查询。
在 Azure 虚拟机上打开命令提示符,并尝试解析这两个存储帐户的 FQDN。 请参阅以下示例:
C:\>dig myeaststorageacct1.privatelink.blob.core.windows.net +short 10.40.40.5 C:\>dig myeaststorageacct2.privatelink.blob.core.windows.net +short
请注意,一个存储帐户可以解析,另一个存储帐户则无法解析。
配置回退到 Internet 解析
再次选择每个专用 DNS 区域,选择“虚拟网络链接”,然后选择铅笔“编辑”图标。 请参阅以下示例:
在页面底部,选择“启用回退到 Internet”,然后选择“保存”。
对每个专用链接区域重复这些步骤,并留出时间来更新虚拟网络链接。
尝试再次解析存储帐户的 FQDN。 请参阅以下示例:
C:\>dig myeaststorageacct1.privatelink.blob.core.windows.net +short 10.40.40.5 C:\>dig myeaststorageacct2.privatelink.blob.core.windows.net +short blob.bl5prdstr19c.store.core.windows.net. 203.0.113.161
未解析的存储帐户现在通过 Internet 解析成功,因此你能够访问这个已启用专用链接的资源。
查询已启用回退的虚拟网络链接
可以使用 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.windows.net",
"properties_resolutionPolicy": "NxDomainRedirect",
"resourceGroup": "myresourcegroup"
},
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"properties_resolutionPolicy": "NxDomainRedirect",
"resourceGroup": "mywestrg2"
},
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"properties_resolutionPolicy": "NxDomainRedirect",
"resourceGroup": "mywestrg"
},
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"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 示例输出将其中一个已启用专用链接的区域设置为 Default(禁用回退)来演示具体显示方式。
输出:
{
"count": 4,
"data": [
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"properties_resolutionPolicy": "Default",
"resourceGroup": "mywestrg"
},
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"properties_resolutionPolicy": "NxDomainRedirect",
"resourceGroup": "myresourcegroup"
},
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"properties_resolutionPolicy": "NxDomainRedirect",
"resourceGroup": "mywestrg2"
},
{
"privateDnsZone": "privatelink.blob.core.windows.net",
"properties_resolutionPolicy": "NxDomainRedirect",
"resourceGroup": "myeastrg"
}
],
"skip_token": null,
"total_records": 4
}
后续步骤
- 了解如何在 DNS 区域中管理记录集和记录。