跳至内容

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

4 分钟阅读
0

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

简短描述

要修复私有托管区 DNS 问题,请验证 Amazon Virtual Private Cloud (Amazon VPC) 设置、区域关联和 DNS 服务器设置。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

确认 VPC 中的 DNS 支持

要允许解析私有托管区记录,请完成以下步骤:

  1. 在您的 Amazon VPC 中启用 DNS 支持。
  2. 验证您的 VPC 中的 DNSSupportDNSHostnames 是否设置为 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_IDVPC_IDREGION_ID 替换为您的相关值。

检查自定义 DNS 服务器配置

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

  1. 转发规则: 服务器将私有域 DNS 查询转发到您的 VPC 的 DNS 服务器 IP 地址。
  2. 域配置: 自定义服务器中的域与您的私有托管区不同。

例如,如果您的 VPC 的主要 CIDR 范围为 172.31.0.0/16,则 VPC DNS 服务器的 IP 地址为 172.31.0.2。这是 Amazon VPC 网络范围加上 2。

查看 Resolver 配置设置

如果您遇到 DNS 解析或响应的间歇性中断问题,请查看源实例的 Resolver 配置设置:

  • 对于 Linux 实例,使用 cat/etc/resolv.confcat/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 解析。

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

私有托管区记录名称
localoverlap.privatevpc.local60.1.1.1
privatevpc.localoverlap.privatevpc.local50.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 规则优先:

  1. 您有一条 Resolver 规则,将流量路由到您私有托管区的域的网络。
  2. 您有一条与同一 VPC 关联的 Resolver 规则,该规则也与私有托管区相关联。

有关详细信息,请参阅解析 VPC 与您的网络之间的 DNS 查询

防止查询循环

为避免创建循环,请完成以下步骤:

  1. 不要在 Resolver 转发规则中创建指向 VPC 的入站端点的目标 IP 地址。
  2. 不要将端点与私有托管区相关联。
  3. 不要将同一 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 发送递归(非迭代)查询。

要验证分辨率类型,请完成以下步骤:

  1. 在本地 DNS Resolver 上使用数据包捕获。
  2. 查看 DNS 标志(所需递归 = 0)。
  3. 使用 +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 地址。

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

  1. Resolver 规则
  2. 私有托管区规则
  3. 内部规则

相关信息

使用私有托管区

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

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