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

4 分钟阅读
0

我想解决我的 Amazon Route 53 私有托管区的 DNS 解析问题。

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新的 Amazon 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_IDREGION_ID 替换为您的相关值。

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

aws route53 get-hosted-zone --id VPC_ID

**注意:**请将 VPC_ID 替换为您的相关值。

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

如果您在 VPC 中的 DNS 的 DHCP 选项中配置了自定义 DNS 服务器或 Active Directory 服务器,请检查下列配置:

  • 在转发规则中,确认您的服务器将私有域 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 不会转发请求。相反,Resolver 将 NXDOMAIN(不存在的域)返回给客户端。

确认在最相关私有托管区中配置了正确的记录,以成功进行 DNS 解析。

例如,假设您有两个带有以下记录的私有托管区:

私有托管区名称记录名称
localoverlap.privatevpc.local60.1.1.1
privatevpc.localoverlap.privatevpc.local50.1.1.1

该请求从最相关的匹配私有托管区获得以下应答:

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

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

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

使用 AWS CLI 确认私有托管区中未配置区域委派,如以下示例所示:

Private hosted zone:abc.com Delegation NS record for: kc.abc.com Resource record: 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 的入站端点时,结果是一个循环。在此循环中,查询在入站和出站端点之间不断传递。

您仍然可以将转发规则与其他 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 的查询,那么您可以将网络上的解析器的 DNS 查询转发到 VPC 解析器。如需进行此操作,请使用 Resolver 入站端点。此操作允许您解析 AWS 资源的域名,例如私有托管区中的记录。

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

要验证解析类型,请在 DNS 解析器(本地)上使用数据包捕获。然后,查看 DNS 标志(所需的递归 = 0)。要测试解析,请使用 +norecurse dig 命令发送迭代请求,或者使用 nslookup 设置 norecurse

**入站端点 IP 地址:**172.31.253.150

**本地 Resolver 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 Resolver 规则和 longest.test.example.com 私有托管区,则 longest.test.example.com 域的查找与私有托管区相匹配。

如果规则位于相同的域级别,则它们具有以下优先级:

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

例如,如果存在 test.example.com Resolver 规则和 test.example.com 私有托管区,则 Resolver 规则优先。查询会转发到规则中配置的服务器或目标 IP 地址。

相关信息

使用私有托管区

我需要启用哪些 Amazon VPC 选项才能使用我的私有托管区?

避免使用 Resolver 端点进行循环配置

AWS 官方
AWS 官方已更新 10 个月前