管理地区

托管地区是用于容纳所有具有相同域名(例如 example.com)的 DNS 记录的容器。创建托管地区时,系统会自动为其分配一组域名服务器,用于处理对该地区的 DNS 查询的响应。托管地区对其所含的资源记录数量有配额限制。

准备工作

Cloud DNS API 会要求您创建 Cloud DNS 项目并启用 Cloud DNS API。

如果您创建的应用将使用 REST API,则还需要创建 OAuth 2.0 客户端 ID。

  1. 如果您还没有 Google 帐号,请注册一个帐号
  2. 在 GCP Console 中启用 Cloud DNS API。您可以选择现有的 Compute Engine 或 App Engine 项目,也可以创建一个新项目。
  3. 如果您需要向 REST API 发出请求,则需要创建 OAuth 2.0 ID(请参阅设置 OAuth 2.0)。
  4. 请记录项目中的以下信息,后续步骤将需要输入这些信息:
    • 客户端 ID (xxxxxx.apps.googleusercontent.com)。
    • 要使用的项目 ID。您可以在 GCP Console 的概览页面顶部找到该 ID。您也可以要求您的用户提供其要在您的应用中使用的项目名称。

如果您尚未运行过 gcloud 命令行工具,则需要运行以下命令来指定项目名称并进行 GCP Console 身份验证:

gcloud auth login

您还可以在命令中指定 --project 参数,以对该调用的其他项目执行操作。

创建托管地区

开始使用 Cloud DNS API 时,您需要创建一个托管地区来存放您的 DNS 记录。托管地区会连接到您的 Cloud DNS 项目。请注意,如果创建了地区,那么只有在您更新网域注册,将某个解析器明确指向新地区,或直接查询您的地区的一个域名服务器之后,新地区才会被采用。

要创建地区,您必须提供 DNS 地区名称、说明和名称以标识该地区。可以使用 --visibility 标志将托管地区指定为公开或专用,使用 --networks 标志指示用于提供专用地区的 VPC 网络。

创建公开地区

托管地区是用于存放具有相同 DNS 名称后缀的 DNS 记录的容器。托管地区具有一组域名服务器,它们可以接受查询并做出响应。

要创建新的公开托管地区,请执行以下操作:

Console

  1. 转到 GCP Console 中的“创建 DNS 地区”页面。

    转到“创建 DNS 地区”页面

  2. 地区类型中选择“公开”。

  3. 输入地区名称。例如,my-new-zone

  4. 使用一个您拥有的域名输入该地区的 DNS 名称后缀。例如,example.com

  5. DNSSEC 下,选择 OffOnTransfer。如需了解详情,请参阅 DNSSEC 配置

  6. 点击创建

随即将显示地区详细信息页面。此时系统已为您创建了默认的 NS 和 SOA 记录。

gcloud

gcloud dns managed-zones create my-zone-name \
    --dns-name="example.com" \
    --description="A zone" \
    --visibility=public

Python

def create_zone(project_id, name, dns_name, description):
    client = dns.Client(project=project_id)
    zone = client.zone(
        name,  # examplezonename
        dns_name=dns_name,  # example.com.
        description=description)
    zone.create()
    return zone

创建专用地区

托管地区是用于存放具有相同 DNS 名称后缀的 DNS 记录的容器。专用托管地区则是用于存放仅在您指定的一个或多个 VPC 网络中可见的 DNS 记录的容器。

要创建新的专用地区,请执行以下操作:

Console

  1. 转到 GCP Console 中的“创建 DNS 地区”页面。

    转到“创建 DNS 地区”页面

  2. 地区类型中选择“专用”。

  3. 输入地区名称。例如,my-new-zone

  4. 使用一个您拥有的域名输入该地区的 DNS 名称后缀。例如,example.com

  5. (可选)添加说明

  6. 选择将提供专用地区的网络。

  7. 点击创建

gcloud

要创建专用地区,请使用以下命令:

gcloud dns managed-zones create my-zone-name \
    --dns-name="example.com" \
    --description="A zone" \
    --visibility=private \
    --networks=default

Python

def create_zone(project_id, name, dns_name, description):
    client = dns.Client(project=project_id)
    zone = client.zone(
        name,  # examplezonename
        dns_name=dns_name,  # example.com.
        description=description)
    zone.create()
    return zone

如果收到 accessNotConfigured 错误,则必须启用 Cloud DNS API

创建转发地区

转发地区会替换指定地区的普通 DNS 解析。对指定地区的查询将转发到列出的转发目标。

Console

  1. 转到 GCP Console 中的“创建 DNS 地区”页面。

    转到“创建 DNS 地区”页面

  2. 地区类型中选择“专用”。

  3. 地区名称中输入 my-new-zone

  4. 使用一个您拥有的域名输入该地区的 DNS 名称后缀。例如,example.com

  5. (可选)添加说明

  6. 选择将提供专用地区的网络。

  7. 选中将查询转发到其他服务器旁边的复选框。

  8. 目标 DNS 服务器下输入转发目标。

    转发目标是由静态 IP 地址构成的一个列表。如果地址可通过同一 VPC 网络访问,或者可在能够通过 VPN 或 Interconnect 访问的网络上进行访问,则这些 IP 地址可以是 RFC 1918 地址。否则,它们必须是可公开访问的 IP 地址。

  9. 点击创建

gcloud

 gcloud beta dns managed-zones create example-forwarding-zone \
     --dns-name="example.com" \
     --description="A zone" \
     --networks="default,my-network" \
     --visibility=private \
     --forwarding-targets="8.8.8.8,8.8.4.4"

其中

  • --dns-name 是要通过转发地区解析的网域列表。
  • --networks 是可以使用转发地区的网络列表。
  • --visibility 指示转发地区是 public 还是 private
  • --forwarding-targets 是静态 IP 地址的列表。如果地址可通过同一 VPC 网络访问,或者可在能够通过 VPN 或 Interconnect 访问的网络上进行访问,则这些 IP 地址可以是 RFC 1918 地址。否则,它们必须是可公开访问的 IP 地址。

要求:要让转发目标名称服务器处理来自 VPC 网络中虚拟机的 DNS 请求,您必须执行以下操作:

  • 确保可以在 VPC 网络中访问转发目标名称服务器。要对其进行测试,您可以使用 dig 以及 @ 运算符直接查询该名称服务器。
  • 确保名称服务器应用的本地网络防火墙规则允许来源为 35.199.192.0/19 的数据包。
  • 无论是通过 Cloud VPN 隧道、专用互连连接 (VLAN) 还是通过合作伙伴互连连接 (VLAN),本地网络必须具有将发往 35.199.192.0/19 的流量定向回 VPC 网络的路由。对于来自 VPC 网络的 DNS 查询,其回复必须发送回 35.199.192.0/19,但不能通过互联网发送。对于使用静态路由的 Cloud VPN 隧道,您必须在本地网络中手动创建路由,其目的地为 35.199.192.0/19,下一跃点为 VPN 隧道。除了添加此路由之外,对于使用基于政策的路由的 Cloud VPN 隧道,您必须配置 Cloud VPN 的本地流量选择器和本地 VPN 网关的远程流量选择器,使其包含 35.199.192.0/19。对于使用动态路由、专用互连或合作伙伴互连的 Cloud VPN 隧道,您必须在关联的 Cloud Router 路由器上配置自定义路由通告
  • 不支持通过转发地区将查询转发至位于另一个 VPC 网络中的目标。您可以使用对等互连地区来实现此目的。

此外,您还应该了解:

  • 所有由 VPC 网络中的 GCP 虚拟机发来的查询均通过 35.199.192.0/19 进行代理。即使所有客户都使用 35.199.192.0/19,您的本地名称服务器也只会接收来自您的 VPC 网络的请求。
  • 该地址范围 (35.199.192.0/19) 只能从您的 VPC 网络或连接到 VPC 网络的本地网络中访问。如果您的本地网络通过互联网路由发往 35.199.192.0/19 的数据包,这些数据包将被丢弃。
  • GCP 要求接收请求的本地名称服务器必须是将回复发送到 35.199.192.0/19 的名称服务器。如果您的域名服务器将请求发送到其他域名服务器,并且该域名服务器响应了 35.199.192.0/19,则将忽略该响应。出于安全原因,GCP 希望 DNS 回复的源地址与请求的目标地址相匹配。
  • 只要目标域名服务器可访问,Cloud DNS 就会缓存出站转发查询的结果,缓存时长为最多 60 秒或记录的 TTL 的持续时间(以较短者为准)。如果无法访问目标域名服务器,则 Cloud DNS 会在其 TTL 时长内缓存出站转发查询的结果。这适用于通过转发地区进行出站转发的查询,以及通过 DNS 服务器政策出站转发到备用域名服务器的查询。

要求:要让外部域名服务器接收转发的 DNS 查询,您必须执行以下操作:

  • 确保可从您的 VPC 网络访问外部域名服务器。
    • 在您的本地网络中,设置路由并配置防火墙,以允许来自 Google 35.199.192.0/19 IP 地址范围的流量。
      • 该地址块专供 Google 的代理使用,用于将来自您的 VPC 网络的 DNS 查询转发到其他域名服务器。
      • 该地址块只能通过您的 VPC 网络和本地网络(如果配置了转发)访问。
      • 尽管 35.199.192.0/19 用于所有 GCP 客户,但您的本地域名服务器将仅接收来自有权访问您的专用地区(已启用转发)的 VPC 网络的请求。
  • GCP 要求,接收转发查询的本地域名服务器的 IP 地址必须是进行响应的 IP 地址。如果您的本地域名服务器从其他源 IP 地址进行响应,则 GCP 会出于安全原因忽略该响应。

创建对等互连地区

两个建立了对等互连的网络不会自动共享 DNS 信息。借助 DNS 对等互连功能,您可以让一个网络(使用者网络)将 DNS 请求转发到另一个网络(生产者网络)。为此,您可以在使用者网络中创建一个对等互连地区,用于将匹配的 DNS 请求转发到生产者网络。

Console

  1. 转到 GCP Console 中的“创建 DNS 地区”页面。

    转到“创建 DNS 地区”页面

  2. 地区类型中选择“专用”。

  3. 地区名称中输入 my-new-zone

  4. 使用一个您拥有的域名输入该地区的 DNS 名称后缀。例如,example.com

  5. (可选)添加说明

  6. 选择将提供专用地区的网络。

  7. DNS 对等互连下,选中启用 DNS 对等互连旁边的复选框。

  8. 对等项目下,选择一个对等项目。

  9. 对等网络下,选择一个对等网络。

  10. 点击创建

gcloud

此过程假定您已经在两个网络之间建立了对等互连。

  1. 如果您还没有执行此操作,请在实际处理 DNS 请求的网络(生产者网络)中创建一个专用地区或转发地区:
gcloud beta dns managed-zones create example-private-zone \
    --dns-name="example.com" \
    --description="This is the zone for example.com" \
    --networks="default,my-network" \
    --visibility=private

其中:

  • --dns-name 包含将由地区解析的后缀。
  • --description 包含此地区的简短描述。
  • --networks 列出项目中可以使用此地区的网络。
  • --visibility 设置为 private 以创建专用地区。
  1. 将资源记录添加到地区

  2. 在生产者网络项目中,将 dns.peer IAM 角色授予将在其他网络中创建对等互连地区的帐号。创建对等互连地区的帐号通常是服务帐号。

    gcloud beta projects add-iam-policy-binding [PRODUCER_PROJECT] \
        --member=[SERVICE_ACCOUNT] \
        --role=dns.peer
    

    其中:

    • [SERVICE_ACCOUNT] 的格式为 serviceAccount:test123@example.domain.com
  3. 在将 DNS 请求转发到生产者网络的使用者网络中创建一个对等互连地区。您没有指定将处理请求的专用地区的名称,而只指定了网络。生产者网络中的任何地区都可以处理请求。

    gcloud beta dns managed-zones create example-peering-zone \
        --account=[SERVICE_ACCOUNT] \
        --dns-name="example.com" \
        --description="This is the zone for example.com" \
        --networks=[CONSUMER_NETWORK] \
        --visibility=private \
        --target-network=[PRODUCER_NETWORK] \
        --target-project=[PRODUCER_PROJECT]
    

    其中:

    • --account=[SERVICE_ACCOUNT] 是具有生产者网络的 dns.peer 角色的服务帐号。
    • --dns-name 包含由对等互连地区解析的网域列表。
    • --description 包含此地区的简短描述。
    • --networks=[CONSUMER_NETWORK] 是将创建对等互连地区的网络。
    • --visibility 设置为 private,因为对等互连地区只能是专用地区。
    • --target-network=[PRODUCER_NETWORK] 是要与对等互连地区建立对等互连的网络。
    • --target-project=[PRODUCER_PROJECT] 是包含要与对等互连地区建立对等互连的网络的项目。

配置完所有内容后,请登录到使用者网络中的实例,向您配置的区域发出 DNS 请求。对等互连地区应将请求转发到生产者网络中的专用地区,该地区应使用 IP 地址进行回复。

更新托管地区

创建用于存放您的 DNS 记录的托管地区后,您可能需要更新该地区的一些属性。目前,您只能更新公开地区的描述和 DNSSEC 配置

要更新地区,您必须提供地区资源名称(不得包含 .,这一点不同于 DNS 名称)以及与该地区关联的更新信息:

gloud

gcloud dns managed-zones update --description="My zone" "myzonename"

Python

 BODY = {
      'name' : 'myzonename',
      'description' : 'My zone'
    }
    service = build('dns', 'v1')
    response = service.managedZones().create(project=PROJECT_NAME,
                                             body=BODY
                                             ).execute()
 

更改专用地区的网络

要更改可使用专用地区的网络,请使用以下命令:

gcloud

gcloud dns managed-zones update my-zone-name \
    --networks default,newnetwork 

此命令可使网络 defaultnewnetwork 能够使用专用地区。可使用专用地区的所有网络都会替换为新的网络列表。

添加和更新托管地区的标签

您可以向托管地区添加标签,也可以移除现有标签。

在以下示例中,[KEY]:[VALUE] 是任意键值对,如 Dept:MarketingProject:project1

在创建托管地区时添加标签

gcloud dns managed-zones create \
    --dns-name="example.com." \
    --labels [KEY]:[VALUE] \
    --description="A zone" "myzonename"

向现有托管地区添加标签

此命令会为现有托管地区添加一个标签。

gcloud dns managed-zones update \
    --labels [KEY]:[VALUE],[[KEY]:[VALUE]] \
    "myzonename"

更新标签键值对的值

此命令会更新现有键值标签对的 value。如果 key 尚不存在,则会创建一个新的键值对。

gcloud dns managed-zones update \
    --update-labels [KEY]:[VALUE],[[KEY]:[VALUE]] \
    "myzonename"

移除标签键值对

此命令会移除指定的键值标签对。

gcloud dns managed-zones update \
    --remove-labels [KEY]:[VALUE],[[KEY]:[VALUE]] \
    "myzonename"

清除所有标签键值对

此命令会清除所有标签。

gcloud dns managed-zones update \
    --clear-labels \
    "myzonename"

列出托管地区

要列出项目中的所有地区,请执行以下操作:

gcloud

gcloud dns managed-zones list

Python

def list_zones(project_id):
    client = dns.Client(project=project_id)
    zones = client.list_zones()
    return [zone.name for zone in zones]

获取托管地区详细信息

要获取有关托管地区的详细信息,例如,如果需要查找关联的域名服务器,请使用以下命令:

gcloud

gcloud dns managed-zones describe "myzonename"

Python

def get_zone(project_id, name):
    client = dns.Client(project=project_id)
    zone = client.zone(name=name)

    try:
        zone.reload()
        return zone
    except NotFound:
        return None

删除托管地区

要删除某一地区,请向 delete 命令提供地区名称:

gcloud

gcloud dns managed-zones delete "myzonename"

请注意,只能删除空白地区。空白托管地区只有 SOA 和 NS 记录集。您可以使用 import 命令轻松清空地区,如下所示:

touch empty-file
gcloud dns record-sets import -z "myzonename" --delete-all-existing empty-file
rm empty-file

Python

def delete_zone(project_id, name):
    client = dns.Client(project=project_id)
    zone = client.zone(name)
    zone.delete()

使用 DNS 服务器政策

DNS 服务器政策是 Cloud DNS 规则的集合,这些规则用于控制托管您地区的域名服务器的行为。您可以使用 DNS 服务器政策执行以下操作:

  • 指定用于处理来自指定网络的所有 DNS 查询的备用域名服务器
  • 接受或不接受 DNS 查询的入站转发

您可以将 DNS 服务器政策应用于一个或多个 GCP 网络。

如需查看概览,请参阅 DNS 服务器政策

创建用于启用入站 DNS 转发功能的 DNS 政策

该政策可为项目中的 default 网络启用入站 DNS 转发功能。

gcloud beta dns policies create my-policy --project=myproject \
    --description="Inbound DNS forwarding for default network" \
    --enable-inbound-forwarding \
    --networks=default

列出入站转发器 IP 地址

gcloud compute addresses list --filter='name ~ ^dns-forwarding.*' \
    --format='csv[no-heading](address, subnetwork)'

创建用于启用备用域名服务器的 DNS 政策

此政策指示您的 VPC 网络使用本地网络中的备用名称服务器。

gcloud beta dns policies create [OUTBOUND_POLICY_NAME] --project=[PROJECT_ID] \
    --description="Alternative nameservers for for the VPC network" \
    --networks=[NETWORK] \
    --alternative-name-servers="[ALTERNATIVE_NAMESERVERS]"

请将占位符替换为适当的值:

  • [OUTBOUND_POLICY_NAME] 为出站 Cloud DNS 政策的名称。
  • [PROJECT_ID] 为项目 ID。
  • [NETWORK] 为 VPC 网络的名称。
  • [ALTERNATIVE_NAMESERVERS] 为本地网络中备用名称服务器的 IP 地址列表,且 IP 地址以逗号分隔。

要求:要让备用名称服务器处理来自 VPC 网络中虚拟机的 DNS 请求,您必须执行以下操作:

  • 确保可以在 VPC 网络中访问备用名称服务器。要对其进行测试,您可以使用 dig@ 运算符直接查询该备用名称服务器。
  • 确保备用名称服务器应用的本地网络防火墙规则允许来源为 35.199.192.0/19 的数据包。
  • 无论是通过 Cloud VPN 隧道、专用互连连接 (VLAN) 还是通过合作伙伴互连连接 (VLAN),本地网络必须具有将发往 35.199.192.0/19 的流量定向回 VPC 网络的路由。对于来自 VPC 网络的 DNS 查询,其回复必须发送回 35.199.192.0/19,但不能通过互联网发送。对于使用静态路由的 Cloud VPN 隧道,您必须在本地网络中手动创建路由,其目的地为 35.199.192.0/19,下一跃点为 VPN 隧道。除了添加此路由之外,对于使用基于政策的路由的 Cloud VPN 隧道,您必须配置 Cloud VPN 的本地流量选择器和本地 VPN 网关的远程流量选择器,使其包含 35.199.192.0/19。对于使用动态路由、专用互连或合作伙伴互连的 Cloud VPN 隧道,您必须在关联的 Cloud Router 路由器上配置自定义路由通告

此外,您还应该了解:

  • 所有由 VPC 网络中的 GCP 虚拟机发来的查询均通过 35.199.192.0/19 进行代理。即使所有客户都使用 35.199.192.0/19,您的本地备用名称服务器也只会接收来自您的 VPC 网络的请求。
  • 该地址范围 (35.199.192.0/19) 只能从您的 VPC 网络或连接到 VPC 网络的本地网络中访问。如果您的本地网络通过互联网路由发往 35.199.192.0/19 的数据包,这些数据包将被丢弃。
  • GCP 要求接收请求的备用名称服务器必须是将回复发送到 35.199.192.0/19 的名称服务器。如果您的备用域名服务器将请求发送到其他域名服务器,并且该域名服务器响应了 35.199.192.0/19,则将忽略该响应。出于安全原因,GCP 希望 DNS 回复的源地址与请求的目标地址相匹配。

列出 DNS 政策

gcloud beta --project=my-project dns policies list

删除 DNS 政策

gcloud beta --project=my-project dns policies delete example-policy

更新 DNS 政策

gcloud beta --project=myproject dns policies update --networks="default, somenewnetwork"

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud DNS 文档