如何排查 Route 53 地理位置路由问题?
上次更新日期:2022 年 12 月 14 日
我的 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 Resolver IP address(DNS 解析程序 IP 地址)作为工具中的值。
如果 DNS 解析器支持 EDNS0-Client-Subnet,请指定 EDNS0 client subnet IP address(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 支持 EDNS0 的 edns-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。
7. 使用 MaxMind 网站上 MaxMind 的 GeoIP 数据库或您首选的 GeoIP 数据库检查客户端子网 IP 地址的地理位置。验证 DNS 解析器在地理位置上靠近客户端的公有 IP 地址。
8. 使用 OpenDNS 站点上的 CacheCheck 等工具检查 DNS 传播是否存在问题。
9. (可选)确定基于地理位置的路由记录是否与 Route 53 运行状况检查相关联,以及是否开启了“评估目标运行状况”(对于别名记录)。如果至少满足其中一个条件,则 Route 53 将返回延迟最低的运行状况良好的端点。
在 Route 53 控制台中检查 Route 53 运行状况检查的状态。如果开启评估目标运行状况(ETH),则检查记录端点的运行状况。如果至少一个后端实例运行状况良好,则 Route 53 将开启 ETH 的经典负载均衡器的端点视为运行状况良好。对于 Application Load Balancer 和 Network Load Balancer,每个具有目标的目标组必须包含至少一个运行状况良好的目标才能被视为运行状况良好。没有注册目标的目标组被视为运行状况不佳。如果任何目标组只包含运行状况不佳的目标,则负载均衡器将被视为运行状况不佳。
例如,假设您在美国、北美和所有地点都有德克萨斯州的记录(位置为默认值)。如果查询来自德克萨斯州,而德克萨斯州的端点运行状况不佳,则 Route 53 会检查记录中是否存在运行状况良好的端点。它将按顺序检查美国、北美,然后检查所有位置,直到找到端点运行状况良好的记录。如果美国端点的记录运行良好,则 Route 53 将返回此端点。否则,Route 53 将返回默认记录。如果所有适用记录都是运行状况不佳(包括所有位置的记录),则 Route 53 将响应 DNS 查询。它将使用最小地理区域的记录值进行响应。
注意:对别名地理位置资源记录的更改可能需要 60 秒才能传播。