排查 Cloud DNS 问题

本页面提供了您在使用 Cloud DNS 创建公开区域、专用区域、反向查找区域、转发区域和资源记录时可能会遇到的常见问题的解决方案。

公开区域

本部分介绍有关公开区域的问题。

无法创建公开区域

如果您收到 attempted action failed 错误,则表示您的项目未启用 Cloud DNS API。

如需启用 Cloud DNS API,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 API 库页面。

    转到“API 库”

  2. 对于选择近期的项目,选择要启用 API 的 Google Cloud 项目。

  3. API 库页面上,使用搜索 API 和服务框搜索 Cloud DNS API。系统随即会显示描述该 API 的页面。

  4. 点击启用

专用地区

本部分介绍有关专用区域的问题。

共享 VPC 服务项目中的专用区域问题

如需了解如何将专用区域与共享 VPC 网络一起使用,请参阅专用区域和共享 VPC

无法创建专用区域,无法列出或创建政策

您必须拥有 DNS Administrator 角色才能执行各种专用区域操作,例如列出域名系统 (DNS) 服务器政策或创建专用区域。此角色可通过 Identity and Access Management (IAM) 工具授予

专用区域不在同一 VPC 网络中解析

确保您从主要接口与您创建的专用区域位于同一网络的虚拟机实例执行测试

虚拟机 (VM) 实例将主要流量从其主要接口发送,除非流量定向到其他接口之一的子网或虚拟机具有政策路由。确保测试虚拟机的主要接口与您正在测试的专用可用区位于同一网络中。

确定您的虚拟机所使用的网络:

gcloud compute instances describe VM_NAME \
    --zone=GCE_ZONE \
    --format="csv[no-heading](networkInterfaces['network'])"

确保该网络位于有权查询您的专用可用区的网络列表中:

gcloud dns managed-zones describe PRIVATE_ZONE_NAME \
    --format="csv(privateVisibilityConfig['networks'])"

验证查询中的 DNS 名称与您的区域匹配

Google Cloud 按照名称解析顺序解析记录,使用后缀最长的可用区来决定在哪个可用区查询给定 DNS 名称。确保您查询的记录的后缀至少与一个可在您的 VPC 网络中访问的专用地区匹配。例如,Google Cloud 会先在为 dev.gcp.example.lan 提供服务的地区(如果可以访问)中查询 myapp.dev.gcp.example.lan,然后再在为 gcp.example.lan 提供服务的地区(如果可以访问)中查询。

以下命令的输出显示了给定专用区域的 DNS 后缀:

gcloud dns managed-zones describe PRIVATE_ZONE_NAME \
    --format="csv[no-heading](dnsName)"

使用元数据服务器查询 DNS 名称

使用 dig 命令将 DNS 名称查询直接提交给 Google Cloud 元数据服务器 169.254.169.254

dig DNS_NAME @169.254.169.254

使用 dig 命令查询虚拟机的默认域名服务器:

dig DNS_NAME

如果两个 dig 命令的输出产生不同的应答,请检查第二个命令的 ;; SERVER: 部分。响应服务器必须是元数据服务器 (169.254.169.254)。如果不是,那么您已将客机操作系统配置为使用自定义 DNS 域名服务器,而不是默认的 Google Cloud 元数据服务器。Cloud DNS 专用区域要求您使用元数据服务器进行名称解析。Linux 客机环境Windows 客机环境均已为您如此设置。如果您导入了用于虚拟机的映像,请验证是否已安装合适的客机环境。

专用区域不通过 Cloud VPN 或 Cloud Interconnect 解析

首先,确保您可以从授权 VPC 网络中成功查询和解析 DNS 名称。

通过 Cloud VPN 或 Cloud Interconnect 验证连接

确保从本地系统到您的 VPC 网络的连接可正常工作。具体而言,端口 53 上的 TCP 和 UDP 流量必须能够离开本地网络,传送到您的 VPC 网络。验证本地防火墙的配置,以确保允许此出站流量。

您可以使用任何协议(如 ping (ICMP))来测试从本地网络到您的 VPC 网络中示例虚拟机的连接。虽然 Cloud DNS 请求不发送到 Google Cloud 虚拟机,但通过测试与示例虚拟机的连接,您可以使用 Cloud VPN 隧道或 Cloud Interconnect 连接来验证连接。确保您为示例 Google Cloud 虚拟机配置适当的入站允许防火墙规则,因为隐式拒绝入站规则会禁止所有传入流量。

确保为授权 VPC 网络启用入站转发功能

对于有权查询您的 Cloud DNS 专用地区的每个 VPC 网络,必须启用入站转发功能。使用以下命令列出所有政策:

gcloud dns policies list

识别输出表中的网络,并检查转发字段,以查看是否已启用转发功能。

确保授权网络是 VPC 网络

DNS 转发功能需要子网,仅有 VPC 网络提供子网,旧版网络不提供

gcloud compute networks list \
    --format="csv[no-heading](name, SUBNET_MODE)"

旧版网络在输出中标识为 LEGACY

确保该网络中预留了有效的 DNS 转发地址

以下命令显示了项目中所有预留的 DNS 转发 IP 地址。

gcloud compute addresses list \
    --filter="purpose=DNS_RESOLVER" \
    --format='csv[no-heading](address, subnetwork)'

您可以通过向过滤器添加 AND 子句,将输出限制到仅您关注的子网。

示例:

--filter="name ~ ^dns-forwarding AND subnetwork ~ SUBNETWORK_NAME"

如果您在预期网络/地区中没有看到 IP 地址,请向 Google Cloud 支持提交工单。

运行 dig 命令,将查询指向您在前一个命令中找到的地址。通过同一网络中的虚拟机执行此操作。该测试可验证入站转发器是否能够正常工作以及问题是否出在其他地方。

dig DNS_NAME @10.150.0.1 # address returned by previous command

通过 VPN 中的本地主机重复运行相同的 dig 命令。

在专用区域中定义的 CNAME 记录不起作用

CNAME 追踪所述,Cloud DNS 仅会追踪 CNAME 记录。

反向查找区域

本部分提供有关反向查找区域的问题排查提示。部分专用区域问题也适用于反向查找区域。如需查看其他提示,请参阅专用区域问题排查部分。

具有非 RFC 1918 地址的虚拟机无法解析

使用非 RFC 1918 地址调整您的虚拟机

如果您在 Cloud DNS 支持发布之前在非 RFC 1918 Alpha 版期间创建了虚拟机,则这些虚拟机可能无法正确解析。如要解决此问题,请重启虚拟机。

转发区域

本部分提供有关转发地区的问题排查提示。部分专用区域问题也适用于转发区域。如需查看其他提示,请参阅专用区域问题排查部分。

转发区域(出站转发)不起作用

首先,确保您可以从授权 VPC 网络中成功查询和解析 DNS 名称。

将查询从使用方 VPC 网络中的虚拟机转发至提供方 VPC 网络不起作用

如果您使用的是 DNS 对等互连,并且希望将查询从使用方 VPC 网络中的虚拟机转发到提供方 VPC 网络,然后转发到一个或多个本地域名服务器,则必须确保提供方 VPC 网络在与客户端虚拟机所使用的子网所在的同一地区中具有虚拟机或 VPN 隧道。

例如,假设 VPC1 使用向 VPC2 发送对 example.com. 的查询的对等互连区域。再假设 VPC2 具有 example.com. 的专用转发区域,它使用 Cloud VPN 隧道或 Cloud Interconnect 将查询转发到本地域名服务器。对于 VPC1 中位于 us-east1 的虚拟机而言,如果其能够查询 example.com.,则 VPC2 还必须具有位于 us-east1 中的虚拟机或 VPN 隧道。

在某些情况下,即使区域中没有资源,使用 DNS 对等互连进行转发也可能有效。

通过 Cloud VPN 或 Cloud Interconnect 验证连接

您可以使用任何协议(如 ping (ICMP))来测试从本地网络到您的 VPC 网络中示例虚拟机的连接。您还必须尝试使用 dig 等工具直接从示例 Google Cloud 虚拟机中查询本地域名服务器:

dig DNS_NAME @192.168.x.x # address of the onprem DNS server

检查您的 VPC 网络中的防火墙规则

除非您已创建拒绝出站流量的自定义规则,否则隐式允许出站防火墙规则允许来自您的 VPC 网络中虚拟机的出站连接和已建立的响应。如果您已创建自定义拒绝出站规则,则需要创建优先级更高的允许规则,该规则至少允许发往本地域名服务器的出站流量。

检查本地防火墙

确保您的本地防火墙配置为允许与 35.199.192.0/19 之间的传入和传出流量。

检查本地防火墙中的日志,查找来自 35.199.192.0/19 的 DNS 请求。如需使用 regex 表达式进行搜索,请使用以下操作:

"35\.199\.(19[2-9]|20[0-9]|21[0-9]|22[0-3]).*"

检查本地域名服务器

验证您的本地域名服务器上没有配置任何禁止来自 35.199.192.0/19 的查询的 ACL。

检查您的本地域名服务器,了解其是否接收来自 35.199.192.0/19 的数据包。如果您拥有 shell 访问权限,则可以使用 tcpdump 等工具查找与 35.199.192.0/19 之间的传入和传出的数据包:

sudo tcpdump port 53 and tcp -vv

验证返回路由

您的本地网络必须有到 35.199.192.0/19 目标的路由,其中下一个跃点是发送 DNS 请求的相同 VPC 网络的 VPN 隧道或互连连接。创建转发地区中介绍了此行为。

如果您使用多个 VPN 隧道将该同一 VPC 网络连接到您的本地网络,则响应不一定使用发送该响应的同一隧道传递。但是,响应必须使用下一个跃点位于发起请求的同一 VPC 网络中的 VPN 隧道传递。

如果您已将多个 VPC 网络连接到您的本地网络,则必须确保 DNS 回复不会发送到错误的网络。Google Cloud 会舍弃发送到错误 VPC 网络的 DNS 响应。如需推荐的解决方案,请参阅我们的最佳做法指南。

向使用非 RFC 1918 IP 地址的域名服务器的出站转发失败

默认情况下,当目标域名服务器具有非 RFC 1918 IP 地址时,Cloud DNS 会使用通过公共互联网路由查询的标准路由。标准路由不支持将查询转发到无法通过公共互联网访问的非 RFC 1918 地址的域名服务器。

如需通过 VPC 网络将查询转发到使用非 RFC 1918 IP 地址的域名服务器,请配置 Cloud DNS 转发区域或服务器政策,以便为目标域名服务器使用专用路由。

如需了解标准路由和专用路由之间的差异,请参阅转发目标和路由方法

即使存在针对目标域名服务器的 VPC 路由,此限制也适用;配置标准路由时,非 RFC 1918 地址的路由不会影响 Cloud DNS 的出站转发行为。

向辅助 NIC 的出站转发失败

请确保您已正确设置辅助网络接口控制器 (NIC)。

如需了解如何设置其他 NIC,请参阅创建具有多个网络接口的虚拟机实例

出站转发查询收到 SERVFAIL 错误

如果 Cloud DNS 收到来自所有目标域名服务器的错误,或未收到来自任何目标域名服务器的响应,则会返回 SERVFAIL 错误。

如需解决此问题,请验证您的本地域名服务器是否已正确配置。然后,验证您的本地域名服务器是否在 4 秒内响应来自 Cloud DNS 地址范围的查询(请参阅打开 Google Cloud 和本地防火墙以允许 DNS 流量)。如果您的本地域名服务器咨询上游域名服务器(例如,由于配置为缓存解析器),请检查以确保上游域名服务器没有问题。

此外,如果转发目标为本地系统,则请注意,为该路径配置的路由可以是自定义动态路由或自定义静态路由,重要的例外是带网络标记的自定义静态路由不适用于转发 DNS 查询。请确保用于到达本地域名服务器的路由未指定网络标记。

资源记录

本部分提供了有关资源记录的问题排查提示。

查询地区中存在的资源记录集时发现意外数据

在查询 Cloud DNS 代管地区中存在的资源记录集时,您可能会收到意外数据,具体说来有多种原因:

  1. 系统不支持使用 RFC 1035 中指定的 @ 语法创建的资源记录集。Cloud DNS 会按字面解释此类资源记录集中的 @ 符号;因此,在 example.com. 区域中,为 QNAME @ 创建的记录集将被解释为 @.example.com.,而不是 example.com.。如需解决此问题,请确保创建没有 @ 符号的记录集;所有名称都相对于区域的顶端网域。

  2. 与所有记录一样,通配符 CNAME 记录受 RFC 4592 中所述的存在规则的约束。例如,假设您在 example.com. 区域中定义以下记录集:

    *.images.example.com. IN CNAME _static.example.com.

    srv1.images.example.com. IN A 192.0.2.91

    _static.example.com. IN A 192.0.2.92

    public.srv1.images.example.com. 的查询将返回包含空应答部分的 NOERROR。如果 CNAME 与 QNAME 之间存在记录,则系统不会返回 CNAME,但由于不存在与 QNAME 完全匹配的记录,因此 Cloud DNS 会返回空应答。这是标准的 DNS 行为。

Google Cloud 虚拟机显示错误的指针 (PTR) 记录

在维护事件期间迁移虚拟机时,PTR 记录逻辑无法正确处理某些边缘情况,并且将 DNS PTR 记录还原为 googleusercontent.com 完全限定域名 (FQDN)。如需恢复功能,请再次应用 PTR 记录。

如需详细了解如何在虚拟机上应用 PTR 记录,请参阅为虚拟机实例创建 PTR 记录

Cloud DNS 资源记录集按随机顺序返回

为了符合 DNS 行业做法,Cloud DNS 域名服务器现在会随机化资源记录集的顺序,并忽略权威服务器指定的顺序。这是正常的 DNS 行为,它同时适用于公共和专用 Cloud DNS 区域。

不支持的可用区级资源类型

当您将 --location 标志输入到针对其他 Cloud DNS 区域的功能的 gcloud 命令或 API 请求时,请求将被拒绝。例如,如果您向全球服务器发送仅限可用区级的功能请求,或者向可用区级服务器发送仅限全球的功能请求,则服务器将拒绝请求并提供 _UNSupported_ZONAL_RESOURCETYPE 错误。

如需查看可用区级 Cloud DNS 支持的资源和功能列表,请参阅可用区级 Cloud DNS 支持

后续步骤