如何解决 Route 53 私有托管区的 DNS 解析问题?
我想解决我的 Amazon Route 53 私有托管区的 DNS 解析问题。
简短描述
要修复私有托管区 DNS 问题,请验证 Amazon Virtual Private Cloud (Amazon VPC) 设置、区域关联和 DNS 服务器设置。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
确认 VPC 中的 DNS 支持
要允许解析私有托管区记录,请完成以下步骤:
- 在您的 Amazon VPC 中启用 DNS 支持。
- 验证您的 VPC 中的 DNSSupport 和 DNSHostnames 是否设置为 True。有关详细信息,请参阅查看和更新 VPC 的 DNS 属性。
确认正确的 VPC ID 关联
确认已将正确的 VPC ID 与您的私有托管区相关联。此外,确保您在同一 VPC 中查询域的资源记录。
当您将私有托管区与您的 VPC 相关联时:
- Route 53 Resolver 会创建自动定义的规则并将其与您的 VPC 相关联。
- 您的 VPC 中的资源可以查询 Resolver 以解析私有托管区中的 DNS 记录。
要列出与托管区关联的 VPC,请在 AWS CLI 中运行以下命令:
aws route53 get-hosted-zone --id VPC_ID
注意: 请将 VPC_ID 替换为您的相关值。
要列出与特定 VPC 关联的私有托管区,请在 AWS CLI 中运行以下命令:
aws route53 list-hosted-zones-by-vpc --vpc-id VPC_ID --vpc-region REGION_ID
**注意:**将 HOSTED_ZONE_ID、VPC_ID 和 REGION_ID 替换为您的相关值。
检查自定义 DNS 服务器配置
如果您在 VPC 中的 DNS 的 DHCP 选项中配置了自定义 DNS 服务器或 Active Directory 服务器,请验证以下配置:
- 转发规则: 服务器将私有域 DNS 查询转发到您的 VPC 的 DNS 服务器 IP 地址。
- 域配置: 自定义服务器中的域与您的私有托管区不同。
例如,如果您的 VPC 的主要 CIDR 范围为 172.31.0.0/16,则 VPC DNS 服务器的 IP 地址为 172.31.0.2。这是 Amazon VPC 网络范围加上 2。
查看 Resolver 配置设置
如果您遇到 DNS 解析或响应的间歇性中断问题,请查看源实例的 Resolver 配置设置:
- 对于 Linux 实例,使用 cat/etc/resolv.conf 和 cat/etc/hosts 文件。
- 对于 macOS,请参阅 macOS 用户指南中的在 Mac 上更改 DNS 设置。
- 对于 Windows,请完成以下步骤:
选择 Settings(设置),然后选择 Network & internet(网络和互联网)。
在 Advanced network settings(高级网络设置)下,选择 Change adapter settings(更改适配器设置)。
右键单击网络连接,然后选择 Properties(属性)。
选择 IPv4 properties(IPv4 属性),然后在 DNS 服务器地址中输入首选的 DNS IP 地址。
例如,如果您配置了 resolv.conf,则可以使用 rotate(轮换)选项在 Amazon DNS 和 Google DNS (8.8.8.8) 之间对查询进行负载平衡。resolv.conf 文件将如下所示:
options rotate; generated by /usr/sbin/dhclient-script nameserver 8.8.8.8 nameserver 172.31.0.2
在您向公共 Google DNS (8.8.8.8) 发出的第一个查询中,您收到了预期的 NXdomain 响应。Resolver 正尝试在公有托管区而不是私有托管区中查找响应:
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)
确认私有托管区没有重叠的命名空间
当多个区域的命名空间重叠时:
- Resolver 根据最具体的匹配来路由流量
- 如果存在匹配区域但没有匹配的记录,则 Resolver 返回 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
检查私有托管区中的区域/子域委派
私有托管区不支持区域/子域委派。确认您在父域的私有托管区中没有为子域配置名称服务器 (NS) 记录。如果配置了委派,则客户端将从 VPC 解析器获得“SERVFAIL”响应代码。
以下是导致 SERVFAIL 的委派配置示例:
- 私人托管区: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 规则和出站 Resolver 端点使用情况
确认您使用的是带有出站端点的 Resolver。在以下情况下,Resolver 规则优先:
- 您有一条 Resolver 规则,将流量路由到您私有托管区的域的网络。
- 您有一条与同一 VPC 关联的 Resolver 规则,该规则也与私有托管区相关联。
有关详细信息,请参阅解析 VPC 与您的网络之间的 DNS 查询。
防止查询循环
为避免创建循环,请完成以下步骤:
- 不要在 Resolver 转发规则中创建指向 VPC 的入站端点的目标 IP 地址。
- 不要将端点与私有托管区相关联。
- 不要将同一 Resolver 规则与您的 VPC 相关联。
查询循环示例:
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)
要解决此问题并打破循环,请删除中心 VPC 与规则的关联。成功响应的示例:
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)
确认本地 Resolver 发送了递归请求
对于从本地到 Route 53 Resolver 的查询:
- 使用 Resolver 入站端点转发 DNS 查询。
- 确保本地 Resolver 发送递归(非迭代)查询。
要验证分辨率类型,请完成以下步骤:
- 在本地 DNS Resolver 上使用数据包捕获。
- 查看 DNS 标志(所需递归 = 0)。
- 使用 +norecurse dig 命令进行测试,或使用 nslookup 设置 norecurse。
迭代查询失败的示例:
[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 的正确规则优先级
当客户端实例向 Resolver 发送查询时,Resolver 会验证实例的规则,确定将请求路由到何处。
最相关的规则优先。例如,如果存在 test.example.com Resolver 规则和 test.example.com 私有托管区,则 Resolver 规则优先。查询会转发到规则中配置的服务器或目标 IP 地址。
如果规则位于同一域级别,则它们具有以下优先级:
- Resolver 规则
- 私有托管区规则
- 内部规则
相关信息
- 语言
- 中文 (简体)

