使用 Azure PowerShell 管理 Azure DNS 中的 DNS 记录和记录集

本文介绍如何使用 Azure PowerShell 管理 DNS 区域的 DNS 记录。 也可使用跨平台的 Azure CLIAzure 门户管理 DNS 记录。

本文中的示例假设用户已经安装并登录 Azure PowerShell 以及创建了 DNS 区域

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

简介

在 Azure DNS 中创建 DNS 记录之前,首先需了解 Azure DNS 如何将 DNS 记录组织到 DNS 记录集中。

记录名称

在 Azure DNS 中,记录使用相对名称指定。 完全限定的域名 (FQDN) 包括区域名称,而相对域名则不包括。 例如,contoso.com 区域中的相对记录名称 www 会提供完全限定的记录名称 www.contoso.com

顶点记录是位于 DNS 区域的根(或顶点)中的 DNS 记录。 例如,在 DNS 区域 contoso.com 中,顶点记录还具有完全限定的名称 contoso.com(有时称为域)。 按照惯例,相对名称 @ 用于表示顶点记录。

记录类型

每个 DNS 记录都有一个名称和类型。 这些记录根据其所包含的数据分为各种类型。 最常见的类型为“A”记录,这种记录将名称映射到 IPv4 地址。 另一种常见类型是“MX”记录,这种记录将名称映射到邮件服务器。

Azure DNS 支持所有常见 DNS 记录类型:A、AAAA、CAA、CNAME、MX、NS、PTR、SOA、SRV 和 TXT。 请注意,SPF 记录使用 TXT 记录表示

记录集

有时,需要创建具有给定名称和类型的多个 DNS 记录。 例如,假设在两个不同的 IP 地址上托管“www.contoso.com”网站。 该网站需要两个不同的 A 记录,每个 IP 地址一个。 以下是记录集的示例:

www.contoso.com.        3600    IN    A    134.170.185.46
www.contoso.com.        3600    IN    A    134.170.188.221

Azure DNS 使用记录集管理所有 DNS 记录。 记录集(也称为资源记录集)是某个区域中具有相同名称、相同类型的 DNS 记录的集合。 大多数记录集包含单个记录。 但是,在上面所示的示例中,一个记录集包含多个记录,这并不少见。

例如,假设已在区域“contoso.com”中创建 A 记录“www”,指向 IP 地址“134.170.185.46”(上述第一条记录)。 要创建第二条记录,应将此记录添加到现有记录集而非创建其他记录集。

SOA 和 CNAME 记录类型例外。 对于这些类型,DNS 标准不允许多个记录具有相同的名称,因此这些记录集仅可包含单个记录。

有关 Azure DNS 中的 DNS 记录的详细信息,请参阅 DNS 区域和记录

创建新的 DNS 记录

创建新记录集时,必须为其指定不同于任何现有记录的名称和类型。 如果新记录与现有记录具有相同的名称和类型,则需要将其添加到现有记录集

在新的记录集中创建“A”记录

可以使用 New-AzDnsRecordSet cmdlet 创建记录集。 创建记录集时,需指定记录集名称、区域、生存时间 (TTL)、记录类型,以及要创建的记录。

添加记录到记录集的参数会因记录集的类型而有所变化。 例如,在使用类型“A”记录集时,需使用参数 -IPv4Address 指定 IP 地址。 不同的记录类型将具有额外的参数。

以下示例在 DNS 区域 contoso.com 中创建具有相对名称 www 的记录集。 记录集的完全限定名称为 www.contoso.com。 记录类型为“A”,TTL 为 3600 秒。 记录集包含单个记录,IP 地址为“1.2.3.4”。

New-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -IPv4Address "1.2.3.4") 

若要在区域的“顶点”(在此例中为“contoso.com”)创建记录集,请使用记录集名称“@”(不包括引号):

New-AzDnsRecordSet -Name "@" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -IPv4Address "1.2.3.4") 

如需创建包含多条记录的记录集,请先创建本地数组并添加记录,然后将数组传递到 New-AzDnsRecordSet,如下所示:

$aRecords = @()
$aRecords += New-AzDnsRecordConfig -IPv4Address "1.2.3.4"
$aRecords += New-AzDnsRecordConfig -IPv4Address "2.3.4.5"
New-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName MyResourceGroup -Ttl 3600 -RecordType A -DnsRecords $aRecords

可以使用记录集元数据,以键-值对的形式将特定于应用程序的数据与每个记录集相关联。 以下示例说明如何使用“dept=finance”和“environment=production”这两个元数据条目创建记录集。

New-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -IPv4Address "1.2.3.4") -Metadata @{ dept="finance"; environment="production" } 

Azure DNS 还支持“空”记录集,此类记录集可充当占位符,用于在创建 DNS 记录之前保留某个 DNS 名称。 空记录集在 Azure DNS 控制平面可见,但也会显示在 Azure DNS 名称服务器上。 以下示例创建一个空记录集:

New-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords @()

创建其他类型的记录

详细了解如何创建“A”记录以后,还可通过以下示例了解如何创建 Azure DNS 支持的其他记录类型的记录。

每个示例中都演示了如何创建包含单条记录的记录集。 可以对“A”记录此前的示例进行修改,以便使用元数据创建其他类型的包含多个记录的记录集,或者创建空记录集。

没有创建 SOA 记录集的示例,因为 SOA 是随每个 DNS 区域一起创建和删除的。 无法单独创建或删除 SOA 记录。 但是,可以修改 SOA,如后面的示例所示。

创建一个包含一条记录的 AAAA 记录集

New-AzDnsRecordSet -Name "test-aaaa" -RecordType AAAA -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Ipv6Address "2607:f8b0:4009:1803::1005") 

创建一个包含一条记录的 CAA 记录集

New-AzDnsRecordSet -Name "test-caa" -RecordType CAA -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Caaflags 0 -CaaTag "issue" -CaaValue "ca1.contoso.com") 

创建一个包含一条记录的 CNAME 记录集

注意

DNS 标准不允许在区域的顶点创建 CNAME 记录 (-Name '@'),也不允许记录集包含多个记录。

有关详细信息,请参阅 CNAME 记录

New-AzDnsRecordSet -Name "test-cname" -RecordType CNAME -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Cname "www.contoso.com") 

创建一个包含一条记录的 MX 记录集

在此示例中,使用记录集名称\“\@\”在区域顶端(在本例中为“contoso.com”)创建一条 MX 记录。

New-AzDnsRecordSet -Name "@" -RecordType MX -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Exchange "mail.contoso.com" -Preference 5) 

创建一个包含一条记录的 NS 记录集

New-AzDnsRecordSet -Name "test-ns" -RecordType NS -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Nsdname "ns1.contoso.com") 

创建一个包含一条记录的 PTR 记录集

在此示例中,“my-arpa-zone.com”表示代表用户 IP 范围的 ARPA 反向查找区域。 此区域中的每个 PTR 记录集对应于此 IP 范围内的一个 IP 地址。 记录名称“10”是此 IP 范围内由此记录表示的 IP 地址的最后一个八位字节。

New-AzDnsRecordSet -Name 10 -RecordType PTR -ZoneName "my-arpa-zone.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Ptrdname "myservice.contoso.com") 

创建一个包含一条记录的 SRV 记录集

创建 SRV 记录集时,请在记录集名称中指定“_service”和“_protocol”。 在区域顶点创建 SRV 记录集时,无需在记录集名称中包含“@”。

New-AzDnsRecordSet -Name "_sip._tls" -RecordType SRV -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Priority 0 -Weight 5 -Port 8080 -Target "sip.contoso.com") 

创建包含一条记录的 TXT 记录集

以下示例说明如何创建 TXT 记录。 如需详细了解 TXT 记录中支持的最大字符串长度,请参阅 TXT 记录

New-AzDnsRecordSet -Name "test-txt" -RecordType TXT -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Value "This is a TXT record") 

获取记录集

若要检索现有的记录集,请使用 Get-AzDnsRecordSet。 此 cmdlet 返回一个本地对象,该对象表示 Azure DNS 中的记录集。

对于 New-AzDnsRecordSet,给定的记录集名称必须是相对 名称,这意味着它必须排除区域名称。 还需指定记录类型,以及包含记录集的区域。

以下示例说明如何检索记录集。 在此示例中,区域使用 -ZoneName-ResourceGroupName 参数指定。

$rs = Get-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

相反,还可以使用通过 -Zone 参数传递的区域对象来指定区域。

$zone = Get-AzDnsZone -Name "contoso.com" -ResourceGroupName "MyResourceGroup"
$rs = Get-AzDnsRecordSet -Name "www" -RecordType A -Zone $zone

列出记录集

也可通过省略 -Name-RecordType 参数之一或两者,使用 Get-AzDnsZone 列出区域中的记录集。

以下示例返回区域中的所有记录集:

$recordsets = Get-AzDnsRecordSet -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

以下示例说明如何在指定记录类型的同时省略记录集名称,以便检索给定类型的所有记录集:

$recordsets = Get-AzDnsRecordSet -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

要跨记录类型检索具有给定名称的所有记录集,需先检索所有记录集,然后对结果进行筛选:

$recordsets = Get-AzDnsRecordSet -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" | where {$_.Name.Equals("www")}

在上述所有示例中,区域都可以通过 -ZoneName-ResourceGroupName 参数指定(如下所示),或者通过指定区域对象进行指定:

$zone = Get-AzDnsZone -Name "contoso.com" -ResourceGroupName "MyResourceGroup"
$recordsets = Get-AzDnsRecordSet -Zone $zone

将记录添加到现有记录集

要将记录添加到现有记录集,请执行以下三个步骤:

  1. 获取现有记录集

    $rs = Get-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A
    
  2. 将新记录添加到本地记录集。

    Add-AzDnsRecordConfig -RecordSet $rs -Ipv4Address "5.6.7.8"
    
  3. 更新更改,使其反映到 Azure DNS 服务。

    Set-AzDnsRecordSet -RecordSet $rs
    

使用 Set-AzDnsRecordSet 可将 Azure DNS 中的现有记录集(及其包含的所有记录)替换为指定的记录集。 使用 Etag 检查可确保不覆盖并发更改。 可以使用可选的 -Overwrite 开关取消这些检查。

此操作序列也可通过管道传递,即通过管道传递记录集对象,而不是将其作为参数传递:

Get-AzDnsRecordSet -Name "www" –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A | Add-AzDnsRecordConfig -Ipv4Address "5.6.7.8" | Set-AzDnsRecordSet

上述示例说明了如何将“A”记录添加到现有的类型“A”记录集。 可使用类似操作顺序向其他类型的记录集添加记录,将 Add-AzDnsRecordConfig-Ipv4Address 参数替换为特定于每个记录类型的其他参数。 每个记录类型的参数都与 New-AzDnsRecordConfig cmdlet 的参数相同,如上面的其他记录类型示例所示。

类型为“CNAME”或“SOA”的记录集不能包含多条记录。 此约束源自 DNS 标准, Azure DNS 没有此限制。

从现有记录集中删除记录

从记录集删除记录的过程类似于向现有记录集添加记录的过程:

  1. 获取现有记录集

    $rs = Get-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A
    
  2. 从本地记录集对象删除记录。 要删除的记录必须与所有参数中的现有记录完全匹配。

    Remove-AzDnsRecordConfig -RecordSet $rs -Ipv4Address "5.6.7.8"
    
  3. 将更改提交回 Azure DNS 服务。 对于并发更改,使用可选的 -Overwrite 开关取消 Etag 检查

    Set-AzDnsRecordSet -RecordSet $Rs
    

按以上顺序从某个记录集中删除最后一条记录不会删除该记录集,而是留下一个空的记录集。 若要彻底删除记录集,请参阅删除记录集

与添加记录到记录集类似,也可通过管道传递删除记录集的操作顺序:

Get-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A | Remove-AzDnsRecordConfig -Ipv4Address "5.6.7.8" | Set-AzDnsRecordSet

将适当的特定于类型的参数传递给 Remove-AzDnsRecordSet 即可支持不同的记录类型。 每个记录类型的参数都与 New-AzDnsRecordConfig cmdlet 的参数相同,如上面的其他记录类型示例所示。

修改现有记录集

修改现有记录集的步骤类似于通过记录集添加或删除记录时所采取的步骤:

  1. 使用 Get-AzDnsRecordSet 检索现有记录集。
  2. 通过以下方式修改本地记录集对象:
    • 添加或删除记录
    • 更改现有记录的参数
    • 更改记录集元数据和生存时间 (TTL)
  3. 使用 Set-AzDnsRecordSet cmdlet 提交更改。 这样会将 Azure DNS 中的现有记录集替换 为指定的记录集。

使用 Set-AzDnsRecordSet 命令时,Etag 检查将用于确保不会覆盖并发更改。 可以使用可选的 -Overwrite 开关取消这些检查。

更新现有记录集中的记录

在此示例中,我们更改现有“A”记录的 IP 地址:

$rs = Get-AzDnsRecordSet -name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
$rs.Records[0].Ipv4Address = "9.8.7.6"
Set-AzDnsRecordSet -RecordSet $rs

修改 SOA 记录

不能在区域顶点(-Name "@",包括引号)从自动创建的 SOA 记录集添加或删除记录。 但是,可以修改 SOA 记录和记录集 TTL 中的任何参数(“Host”除外)。

下面的示例演示如何更改 SOA 记录的 Email 属性:

$rs = Get-AzDnsRecordSet -Name "@" -RecordType SOA -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
$rs.Records[0].Email = "admin.contoso.com"
Set-AzDnsRecordSet -RecordSet $rs

修改区域顶点处的 NS 记录

在每个 DNS 区域自动创建区域顶点处的 NS 记录集。 其中包含分配给该区域的 Azure DNS 名称服务器名称。

可向此 NS 记录集添加更多名称服务器,以支持具有多个 DNS 提供商的共同托管域。 还可修改此记录集的 TTL 和元数据。 但是,无法删除或修改预填充的 Azure DNS 名称服务器。

此限制仅适用于区域顶点处的 NS 记录集。 区域中的其他 NS 记录集(用于委派子区域)不受约束,可进行修改。

以下示例展示如何向区域顶点处的 NS 记录集添加其他名称服务器:

$rs = Get-AzDnsRecordSet -Name "@" -RecordType NS -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
Add-AzDnsRecordConfig -RecordSet $rs -Nsdname ns1.myotherdnsprovider.com
Set-AzDnsRecordSet -RecordSet $rs

修改记录集元数据

可以使用记录集元数据,以键-值对的形式将特定于应用程序的数据与每个记录集相关联。

以下示例说明如何修改现有记录集的元数据:

# Get the record set
$rs = Get-AzDnsRecordSet -Name www -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

# Add 'dept=finance' name-value pair
$rs.Metadata.Add('dept', 'finance') 

# Remove metadata item named 'environment'
$rs.Metadata.Remove('environment')  

# Commit changes
Set-AzDnsRecordSet -RecordSet $rs

删除记录集

可以通过使用 Remove-AzDnsRecordSet cmdlet 删除记录集。 删除记录集也会删除记录集内的所有记录。

注意

无法删除区域顶点的 SOA 和 NS 记录集 (-Name '@')。 Azure DNS 在区域创建时自动创建这些记录集,并在区域被删除时自动将其删除。

以下示例说明如何删除记录集。 在此示例中,记录集名称、记录集类型、区域名称和资源组都进行了显式指定。

Remove-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

相反,也可通过名称和类型指定记录集,通过对象指定区域:

$zone = Get-AzDnsZone -Name "contoso.com" -ResourceGroupName "MyResourceGroup"
Remove-AzDnsRecordSet -Name "www" -RecordType A -Zone $zone

第三个选项是通过记录集对象指定记录集本身:

$rs = Get-AzDnsRecordSet -Name www -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
Remove-AzDnsRecordSet -RecordSet $rs

使用记录集对象指定要删除的记录集时,可通过 Etag 检查确保不删除并发更改。 可以使用可选的 -Overwrite 开关取消这些检查。

记录集对象也可以通过管道输送,而不是作为参数传递:

Get-AzDnsRecordSet -Name www -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" | Remove-AzDnsRecordSet

确认提示

New-AzDnsRecordSetSet-AzDnsRecordSetRemove-AzDnsRecordSet cmdlet 都支持确认提示。

如果 $ConfirmPreference PowerShell 首选项变量的值为 Medium 或更低,则每个 cmdlet 都会提示用户进行确认。 由于 $ConfirmPreference 的默认值为 High,因此在使用默认的 PowerShell 设置时不会发出这些提示。

可以使用 -Confirm 参数重写当前的 $ConfirmPreference 设置。 如果指定 -Confirm-Confirm:$True,cmdlet 会在运行之前提示用户进行确认。 如果指定 -Confirm:$False,cmdlet 不会提示用户进行确认。

有关 -Confirm$ConfirmPreference 的详细信息,请参阅 About Preference Variables(关于首选项变量)。

后续步骤

详细了解 Azure DNS 中的区域和记录
了解如何在使用 Azure DNS 时保护区域和记录
查看 Azure DNS PowerShell 参考文档