问题排查

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

专用区域

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

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

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

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

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

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

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

除非流量的发送目标是连接到其他某个接口的子网,或者如果虚拟机已配置基于政策的路由,否则虚拟机会从主要接口发送所有流量。确保测试虚拟机的主要接口与您正在测试的专用区域位于同一网络中。

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

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 记录受支持。指向在其他专用区域、内部区域或互联网中定义的域名的 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 隧道。

通过 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 响应。

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

Cloud DNS 不支持通过指向其他代管专用区域中的 A 记录的 CNAME 以递归方式解析 IP 地址(CNAME 循环)。例如,假设您有两个代管专用区域(zone-a.privatezone-b.private),并创建如下记录:

  • 指向 target.zone-b.private 的 CNAME cname.zone-a.private
  • 指向 192.168.1.9A 记录 target.zone-b.private

Cloud DNS 不会将 cname.zone-a.private 解析为 192.168.1.9,因为这两条记录不在同一个区域中(zone-a.privatezone-b.private 不同)。

Cloud DNS 的确会在代管专用地区内循环 CNAME。

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

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

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

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

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

向辅助 NIC 的出站转发失败

Cloud DNS 目前不支持转发到 Compute Engine 虚拟机的辅助 NIC。

出站转发查询收到 SERVFAIL 错误

Cloud DNS 控制平面使用算法确定转发目标的响应能力。响应能力得分取决于 SERVFAIL 错误的数量以及收到的响应的延迟时间。 与延迟时间相比,SERVFAIL 错误对得分的影响更大。得分每小时重置一次。

如果某个地区的所有目标都得分较低,则 Cloud DNS 不会向这些目标发送查询。您可能会看到以下一种或多种症状:

  • 使用 Cloud DNS 转发会导致快速出现(约 2 毫秒)SERVFAIL 错误
  • 在查询的 Cloud Logging 日志中,未填充 destinationIPegressIPegressError 字段。
  • 您未在 DNS 服务器上看到查询尝试次数。
  • 您直接发送到转发目标(例如 dig @<TARGET> <QNAME>)的查询可能成功了

如需解决此问题,请验证您的本地域名服务器是否已正确配置。然后,验证您的本地域名服务器是否在 4 秒内响应查询。如果您的本地域名服务器咨询上游域名服务器(例如,由于配置为缓存解析器),请检查以确保上游域名服务器没有问题。

使用非 RFC 1918 IP 地址范围的 VPC 网络上的入站转发失败

如果 VPC 网络使用的是非 RFC 1918 IP 地址范围,则 Cloud 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 行为。

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

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

后续步骤