如何排查 Route 53 私有托管区域的 DNS 解析问题?

上次更新日期:2021 年 5 月 24 日

如何排查 Amazon Route 53 私有托管区域的 DNS 解析问题?

简短描述

要排查 Route 53 私有托管区域的 DNS 解析问题,请执行以下操作:

  1. 确认 Virtual Private Cloud (VPC) 中已启用 DNS 支持。
  2. 确认正确的 VPC ID 与私有托管区域关联。
  3. (对于自定义 DNS 或 Active Directory 服务器)确认为自定义 DNS 服务器中的私有托管区域域配置转发到由 Amazon 提供的 DNS 服务器的转发规则 (CIDR+2)。
  4. 在 resolv.conf 中查看自定义设置。
  5. 确认私有托管区域没有重叠的命名空间。
  6. 确认私有托管区域中没有配置区域委派。
  7. 确认私有托管区域支持资源记录的路由策略。
  8. 确认 Resolver 规则及其入站终端节点解析到不同的 VPC。
  9. 确认配置了适当的查询类型。
  10. (对于从本地部署到 Route 53 Resolver 的查询)确认本地 Resolver 发送递归请求。
  11. 确认为 Amazon 提供的 DNS 配置了正确的规则优先级。

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版的 AWS CLI

确认 VPC 中已启用 DNS 支持

要允许私有托管区域记录解析,必须在 VPC 中启用 DNS 支持。确保在您的 VPC 中,DNSSupportDNSHostnames 设置为 True

确认正确的 VPC ID 与私有托管区域关联

当您将私有托管区域与 VPC 关联时,Route 53 Resolver 会创建自动定义的规则并将其与 VPC 关联。该 VPC 中的资源可以通过查询 Resolver 解析私有托管区域中的 DNS 记录。

请确认正确的 VPC ID 与私有托管区域关联。此外,请确保您是从同一 VPC 内查询域的资源记录。

要获取与托管区域关联的 VPC 列表,请在 AWS CLI 中使用以下命令:

aws route53  list-hosted-zones-by-vpc --vpc-id <VPC-ID> --vpc-region <region-ID>

要获取与特定 VPC 关联的私有托管区域列表,请在 AWS CLI 中使用以下命令:

aws route53 get-hosted-zone --id <id>

确认为自定义 DNS 服务器中的私有托管区域域配置转发到由 Amazon 提供的 DNS 服务器的转发规则 (CIDR+2)

如果您为 VPC 中的 DNS 在 DHCP 选项中配置了自定义 DNS 服务器或 Active Directory (AD) 服务器:

  • 在转发规则中,确认您已将服务器配置为将对私有域的 DNS 查询转发到您的 VPC 中由 Amazon 提供的 DNS 服务器的 IP 地址。例如,如果您的 VPC 的 CIDR 范围为 172.31.0.0/16,则 VPC DNS 服务器的 IP 地址为 172.31.0.2(VPC 网络范围的基址 + 2)。
  • 确认在自定义服务器中配置的域与私有托管区域不同。如果域与您的私有托管区域相同,则服务器是该域的权威服务器。服务器不会联系由 Amazon 提供的 DNS 服务器以获取私有托管区域域。

在 resolv.conf 中查看自定义设置

如果您遇到间歇性 DNS 解析或响应,请查看源实例 resolv.conf 的配置设置。

例如,假设您在 resolv.conf 中配置了 Rotate 选项,以在由 Amazon 提供的 DNS 服务器和公有 Google 解析器服务器 (8.8.8.8) 之间对 DNS 查询进行负载均衡。resolv.conf 设置为:

options rotate
; generated by /usr/sbin/dhclient-script
nameserver 8.8.8.8
nameserver 172.31.0.2

在向公有 Google 解析器 (8.8.8.8) 发出的第一个查询中,您会收到预期的 NXdomain 响应。您收到此响应是因为解析器试图在公有托管区域而不是私有托管区域中查找响应。

Private hosted Zone Record - resolvconf.local
[ec2-user@ip-172-31-253-89 etc]$ curl -vks http://resolvconf.local
* Rebuilt URL to: http://resolvconf.local/
* Could not resolve host: resolvconf.local

15:24:58.553320 IP ip-172-31-253-89.ap-southeast-2.compute.internal.40043 > dns.google.domain: 65053+ A? resolvconf.local. (34)
15:24:58.554814 IP dns.google.domain > ip-172-31-253-89.ap-southeast-2.compute.internal.40043: 65053 NXDomain 0/1/0 (109)

但是,第二个查询成功解析。第二个查询成功是因为它访问与您的私有托管区域关联的 VPC DNS 解析器。

[ec2-user@ip-172-31-253-89 etc]$ curl -vks http://resolvconf.local
* Rebuilt URL to: http://resolvconf.local/
*   Trying 1.1.1.1...
* TCP_NODELAY set
* Connected to resolvconf.local (1.1.1.1) port 80 (#0)

15:25:00.224761 IP ip-172-31-253-89.ap-southeast-2.compute.internal.51578 > 172.31.0.2.domain: 7806+ A? resolvconf.local. (34)
15:25:00.226527 IP 172.31.0.2.domain > ip-172-31-253-89.ap-southeast-2.compute.internal.51578: 7806 1/0/0 A 1.1.1.1 (50)

确认私有托管区域没有重叠的命名空间

如果有多个区域具有重叠的命名空间(例如 example.com 和 test.example.com),则 Resolver 会根据最具体的匹配将流量路由到托管区域。如果存在匹配的区域,但没有与请求中的域名和类型匹配的记录,则 Resolver 不会将请求转发至另一个区域或公有 DNS 解析器。而是会向客户端返回 NXDOMAIN(域不存在)。

确认您在最具体的私有托管区域中配置了正确的记录,以确保 DNS 解析成功。

例如,假设您有两个私有托管区域,其记录配置如下:

私有托管区域名称 记录名称
local overlap.privatevpc.local 60.1.1.1
privatevpc.local overlap.privatevpc.local 50.1.1.1

请求从最具体匹配的私有托管区域获得以下答案:

[ec2-user@IAD-BAS-INSTANCE ~]$ dig overlap.privatevpc.local +short
50.1.1.1

确认私有托管区域中没有配置区域委派

私有托管区域不支持区域委派。如果配置了委派,客户端将获得 VPC 解析器发出的“Servfail”响应代码。

使用 AWS CLI 确认私有托管区域中没有配置区域委派。例如:

私人托管区域:abc.com 委派 NS 记录:kc.abc.com 资源记录:test.kc.abc.com

[ec2-user@ip-172-31-0-8 ~]$ dig test.kc.abc.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 63414
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test.kc.abc.com        IN      A
;; Query time: 15 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Fri Apr 16 15:57:37 2021
;; MSG SIZE  rcvd: 48

确认私有托管区域支持资源记录的路由策略

请确认您在资源记录中配置的路由策略受私有托管区域支持。支持的路由策略为:

  • 简单路由
  • 多值答案路由
  • 故障转移路由
  • 加权路由

确认 Resolver 规则及其入站终端节点解析到不同的 VPC

当 Resolver 规则中的出站终端节点指向与规则共享 VPC 的入站终端节点时,会形成一个循环。在此循环中,查询在入站和出站终端节点之间不断传递。

转发规则仍可与使用 AWS Resource Access Manager (AWS RAM) 与其他账户共享的其他 VPC 关联。与中心或中央 VPC 关联的私有托管区域从查询解析到入站终端节点。转发解析器规则不会更改此解析。例如:

中心 VPC:VPC A – CIDR 172.31.0.0/16 分支 VPC:VPC B – CIDR 172.32.0.0/16 入站 IP 地址:172.31.253.100 和 172.31.2.100 转发规则中的目标 IP 地址:172.31.253.100 和 172.31.2.100 与 VPC 管理的规则:VPC A 和 VPC B 客户端:172-32-254-37

ubuntu@ip-172-32-254-37:~$ dig overlap.privatevpc.local
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 9007
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;overlap.privatevpc.local. IN A
;; Query time: 2941 msec
;; SERVER: 172.32.0.2#53(172.32.0.2)

在之前的输出中,DNS 请求在出站和入站终端节点之间连续跳跃。该请求检查与 VPC A 关联的规则,然后将查询发回出站终端节点。经过几次尝试后,查询超时并以“Servfail”响应代码进行响应。

要修复此问题并打破循环,请删除与规则的中心 VPC 关联 (VPC A)。然后,您会获得私有托管区域发出的成功响应:

ubuntu@ip-172-32-254-37:~$ dig overlap.privatevpc.local
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58606
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;overlap.privatevpc.local. IN A
;; ANSWER SECTION:
overlap.privatevpc.local. 0 IN A 50.1.1.1
;; Query time: 5 msec
;; SERVER: 172.32.0.2#53(172.32.0.2)

确认本地解析器发送递归请求

如果您使用从本地到 Route 53 Resolver 的查询,则通过 Resolver 入站终端节点,您可以将 DNS 查询从网络上的解析器转发到 VPC 解析器。此操作允许您解析 AWS 资源的域名,例如私有托管区域中的记录。

在某些情况下,您可能会发现私有托管区域无法从本地解析器成功解析。出现此行为的原因是本地解析器发送的是迭代查询,而不是递归请求。入站终端节点支持递归查询以成功进行 DNS 解析。

您可以使用 DNS 解析器(本地)上的数据包捕获验证解析类型。然后,查看 DNS 标记(递归需要为 0)。您还可以通过使用 +norecurse 和 dig 命令发送迭代请求来测试解析,或使用 nslookup 设置“norecurse”,如下所示:

入站终端节点 IP 地址:172.31.253.150 本地解析器 IP 地址:10.0.4.210

对入站 IP 地址的迭代查询失败:

[ec2-user@IAD-BAS-INSTANCE ~]$ dig @172.31.253.150 overlap.privatevpc.local +norecurse
; <<>> DiG 9.11.0rc1 <<>> @172.31.253.150 overlap.privatevpc.local +norecurse
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached

递归查询成功:

[ec2-user@IAD-BAS-INSTANCE ~]$ dig @172.31.253.150 overlap.privatevpc.local
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19051
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;overlap.privatevpc.local.      IN      A
;; ANSWER SECTION:
overlap.privatevpc.local. 0     IN      A       50.1.1.1
;; Query time: 200 msec
;; SERVER: 172.31.253.150#53(172.31.253.150)

确认为 Amazon 提供的 DNS 配置了正确的规则优先级

当客户端实例向解析器(AWS 提供的 DNS 服务器)发送查询时,解析器将验证与实例关联的规则,以确定将请求路由到何处。

一般而言,最具体的规则优先。如果有“test.example.com”解析器规则和“longest.test.example.com”私有托管区域,则查找“longest.test.example.com”域与该私有托管区域匹配。

如果规则在同一个域级别,则优先级为:

  1. 解析器规则
  2. 私有托管区域规则
  3. 内部规则

例如,如果有“test.example.com”解析器规则和“test.example.com”私有托管区域,则解析器规则优先。查询将转发到规则中配置的服务器或目标 IP 地址。