如何排查 Route 53 地理位置路由问题?

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

我的 DNS 查询返回了其他 AWS 区域中 Web 服务器的 IP 地址。例如,美国的某个用户被路由到位于欧洲的某个 Web 服务器的 IP 地址。如何排查并解决 Amazon Route 53 地理位置路由问题?

简短描述

Route 53 地理位置路由问题可能由以下原因导致:

  • 地理位置路由设置中缺少默认位置
  • DNS 解析器不支持 EDNS0 的 edns-client-subnet 扩展(导致无法准确确定您的位置)
  • 地理位置分散的 DNS 解析器
  • 未全球发布的资源记录的 DNS 更改

解决方法

1.    确认已为您的使用案例正确配置 Route 53 托管区域的资源记录,并且存在默认的资源记录集。例如,在 Route 53 控制台中,检查 Route 53 托管区域配置中指定的默认位置。

考虑以下示例输出:

>> dig images.example.com
            
; <<>> DiG
9.8.2rc1-RedHat-9.8.2-0.37.rc1.45.amzn1 <<>> images.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,
id: 51385
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1,
ADDITIONAL: 0

;; QUESTION SECTION
;images.example.com.                   IN            A

;; AUTHORITY SECTION:
images.example.com.      60          IN           SOA        ns-1875.awsdns-42.co.uk.awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 65 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Tue Feb  7 22:02:30 2017
;; MSG SIZE  rcvd: 124

如果地理位置路由配置中没有指定默认位置,则 DNS 响应为 rcode 字段返回 NOERROR。在这种情况下,ANSWER (答案) 部分没有结果。为纠正此问题,请在您的地理位置路由配置中添加一个默认位置。

2.    要检查 DNS 解析器的 IP 地址范围,请运行以下命令 5 或 6 次,持续 11 秒。请务必记下每次的输出内容。

在 Linux 或 macOS 上,使用 dig

for i in {1..10}; do dig +short resolver-identity.cloudfront.net; sleep 11; done;

在 Windows 上,使用 nslookup

nslookup resolver-identity.cloudfront.net

3.    使用以下命令之一检查 DNS 解析器是否支持 EDNS0-Client-Subnet。务必记下输出内容。

在 Linux 或 macOS 上,使用 dig

dig +nocl TXT o-o.myaddr.l.google.com

在 Windows 上,使用 nslookup

nslookup -type=txt o-o.myaddr.l.google.com

查看输出的 Answer (答案) 部分中返回的第一条 TXT 记录。第一条 TXT 记录值是 DNS 解析器的 IP 地址。如果没有第二条 TXT 记录,则 DNS 解析器不支持 EDNS0-Client-Subnet。如果有第二条 TXT 记录,则 DNS 解析器支持 EDNS0-Client-Subnet。解析器提供并接着将截断的客户端子网 IP 地址(/24 或 /32)发送到 Route 53 权威名称服务器。

4.    使用检查工具中的 Route 53 测试记录集来确定针对特定请求返回哪些资源记录。要了解更多信息,请参阅使用检查工具查看 Amazon Route 53 如何响应 DNS 查询

如果 DNS 解析器不支持 EDNS0-Client-Subnet,请指定 DNS 解析器 IP 地址作为工具中的值。

如果 DNS 解析器支持 EDNS0-Client-Subnet,请指定 EDNS0 客户端子网 IP 地址作为工具中的值。选择 More Options (更多选项),然后指定 Subnet (子网) 掩码。请勿指定解析器 IP 地址

5.    (可选)如果您无法访问检查工具,请使用 dig 通过 EDNS0-Client-Subnet 查询您托管区域的 Route 53 权威名称服务器。使用输出来确定来自您源 IP 地址的具有最低延迟的 AWS 区域:

dig geo.example.com +subnet=<Client IP>/24 @ns-xx.awsdns-xxx.com +short

6.    Route 53 支持 EDNS0edns-client-subnet扩展。解析器或本地名称服务器将 edns-client-subnet 附加到 DNS 查询中,以在客户端的源 IP 子网上进行 DNS 查询。如果该数据没有随请求传送,则 Route 53 会使用 DNS 解析器的源 IP 地址来大致确定客户端的位置。然后,Route 53 使用解析器位置的 DNS 记录来响应地理位置查询。如果 EDNS 数据未传送到 Route 53,并且客户端使用的是不同地区的递归名称服务器,这将导致位置信息不佳,从而为 DNS 查询提供错误的资源记录。

要修复此配置,请更改支持 edns-client-subnet 的递归 DNS 服务器。执行 DNS 解析,然后共享输出。如果递归 DNS 服务器不支持 EDNS 客户端子网,请尝试使用支持的服务器。例如,支持 EDNS 的服务器选项包括 Google DNS、OpenDNS 和 Amazon DNS 服务器。对于 EC2-Classic,Amazon DNS 服务器位于 172.16.0.23。对于 EC2-VPC,Amazon DNS 服务器位于 VPC 网络范围起始地址 +2 的位置。

7.     使用 MaxMind 网站上的 GeoIP 数据库或您首选的 GeoIP 数据库检查客户端子网 IP 地址的地理位置。验证 DNS 解析器在地理位置上靠近客户端的公有 IP 地址。

8.    使用 OpenDNS 站点上的 CacheCheck 等工具检查 DNS 传播是否存在问题。

9.    (可选)确定基于地理位置的路由记录是否与 Route 53 运行状况检查相关联,以及是否启用了“评估目标运行状况”(对于别名记录)。如果至少满足其中一个条件,则 Route 53 将返回延迟最低的运行状况良好的终端节点。

在 Route 53 控制台中检查 Route 53 运行状况检查的状态。如果启用了评估目标运行状况 (ETH),则检查记录终端节点的运行状况。如果至少一个后端实例运行状况良好,则 Route 53 将启用了 ETH 的 Classic Load Balancer 的终端节点视为运行状况良好。对于 Application Load Balancer 和 Network Load Balancer,每个具有目标的目标组必须包含至少一个运行状况良好的目标才能被视为运行状况良好。没有注册目标的目标组被视为运行状况不佳。如果任何目标组只包含运行状况不佳的目标,则负载均衡器将被视为运行状况不佳。

例如,假设您在美国、北美和所有地点都有德克萨斯州的记录(位置为默认值)。如果查询来自德克萨斯州且德克萨斯州的终端节点运行状况不佳,则 Route 53 将检查美国、北美和该顺序中所有位置的记录,直到找到运行良好的终端节点的记录。如果美国终端节点的记录运行良好,则 Route 53 将返回此终端节点。否则,Route 53 将返回默认记录。如果所有适用记录都是运行状况不佳(包括所有位置的记录),则 Route 53 将使用最小地理区域的记录值来响应 DNS 查询。

注意:对别名地理位置资源记录的更改可能需要 60 秒才能传播。