问题排查

问题排查页面介绍了您在创建专用地区转发地区反向查找地区时使用 Cloud DNS 可能遇到的常见问题,并告诉您如何处理它们:

专用地区

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

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

如需了解有关将专用地区与共享 VPC 网络一起使用的重要信息,请参阅概览页面上的专用地区和共享 VPC

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

您必须拥有 DNS Admin 角色才能执行各种专用地区操作,例如列出 DNS 服务器政策或创建专用地区。该角色可通过 Cloud 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 地址,请向 Cloud 支持提交工单。

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

dig ${dns-name} @10.150.0.1 # - address returned by command above.

通过 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 请求。如需使用正则表达式搜索,请使用 "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.9 的 A 记录 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 地址的域名服务器的出站转发失败

默认情况下,Cloud DNS 使用标准路由。也就是说,当目标域名服务器具有非 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 地址范围的 VPC 上的入站转发失败

如果 VPC 使用的是非 RFC 1918 地址范围,则 Cloud DNS 不支持入站转发。

后续步骤

  • 请参阅概览,了解有关特性的更多信息。
  • 请参阅支持部分,以获取其他帮助的链接。