如何确定我对 Amazon 提供的 DNS 服务器的 DNS 查询是否由于 VPC DNS 节流而失败?

上次更新日期:2022 年 3 月 31 日

我对 Amazon 提供的 DNS 服务器的 DNS 查询失败或超时。从我的实例进行的 DNS 查询是否因 VPC DNS 节流而失败?

简短描述

Amazon 提供的 DNS 服务器实施每个弹性网络接口每秒 1024 个数据包的限制。Amazon 提供的 DNS 服务器将拒绝超出此限制的流量。

VPC 流日志不捕获您的应用程序向 Amazon 提供的 DNS 服务器发送的流量。您可以使用数据包捕获或流量镜像查明 DNS 查询失败的原因。

注意:Amazon Route 53 查询日志记录仅捕获到达 VPC.2 解析程序(AmazonProvidedDNS)的流量。但是,DNS 查询在弹性网络接口级别进行节流。因此,受节流的查询不会出现在查询日志记录中。

解决方法

首先,使用以下一种方法查明 DNS 查询失败的来源。然后,如果您确定原因是 DNS 节流,请使用下面建议的一种修复方法进行修复。

确定 DNS 查询失败的来源

选项 1:使用 tcpdump(仅限 Linux)

1.    使用以下命令在您的 EC2 实例上进行轮换数据包捕获。以下命令将捕获初始的 350 个字节的数据包并保存 20 个大小各为 100 MB 的文件,同时覆盖旧的数据包捕获。

sudo tcpdump -i eth0 -s 350 -C 100 -W 20 -w /var/tmp/$(curl http://169.254.169.254/latest/meta-data/instance-id).$(date +%Y-%m-%d:%H:%M:%S).pcap

2.    运行以下 Linux 命令确定已发送的 DNS 查询数量。

tcpdump  -r <file_name.pcap> -nn dst port 53 | awk -F " " '{ print $1 }' | cut -d"." -f1 | uniq -c

3.    如果 DNS 查询数量大于或等于每秒 1024 个,任何额外的查询都将被节流。

选项 2:使用流量镜像

如果您的使用案例中不便采用 tcpdump,可以利用流量镜像查明 DNS 查询是否被节流。

注意:流量镜像适用于基于 Nitro 的实例非 Nitro 实例类型流量镜像将收取费用

首先,捕获流量数据:

1.    完成流量镜像先决条件

2.    创建流量镜像目标。确认目标弹性网络接口或 Network Load Balancer 允许端口 4789 上的入站流量。

3.    创建流量镜像筛选条件。在 Filter settings(筛选条件设置)下,确认已为 Network services - optional(网络服务 - 可选)启用了 amazon-dns

4.    创建流量镜像会话。配置好流量镜像后,您可以收集镜像的流量并将其存储在流量镜像目标中。

注意:流量镜像是实时数据流。要捕获目标系统上的镜像数据包并将其保存在 pcap 文件中,请使用 UDP 端口 4789 捕获流量。

然后,使用 Wireshark 分析捕获的数据:

1.    在 Wireshark 中打开捕获的流量。

2.    选择统计数据选项卡。

3.    选择 I/O 图表并清除所有选项。

4.    (仅限 Linux)在 Display Filter(显示筛选条件)下,使用 VXLAN 网络标识符和 DNS 查询标记添加筛选条件。例如,如果 VXLAN 网络标识符为 53 且 DNS 查询标记为 0x0100,则图表的显示筛选条件为 (vxlan.vni == 53) && (dns.flags == 0x0100)

5.    查看图表以检查它是否在 1024 左右产生一条平线(Amazon 提供的 DNS 服务器的每秒数据包限制)。如果图表在该值附近产生一条平线,则表示镜像源上正在进行 DNS 节流。

选项 3:Elastic Network Adapter (ENA) 驱动程序网络性能指标

如果您的 EC2 实例正在运行以下 ENA 驱动程序版本之一,则可以使用 linklocal_allowance_exceeded 指标查看 DNS 节流的实时指标:

  • Linux:2.2.10 或更高版本
  • Windows:2.2.2.0 或更高版本

linklocal_allowance_exceeded 指标显示由于超出本地服务允许的 PPS 速率而造成被重塑和丢弃的数据包的数量。本地服务的示例包括 Amazon VPC DNS Service、Instance Metadata Service (IMDS) 和 Amazon Time Sync Service。您可以采用多种间隔验证此指标,以观察计数是否在增加。由于此指标是自上次重启驱动程序(通常是由于实例停止和启动或重启)以来累积的数字,因此该指标只有在增加时才有意义。

要检索指标 linklocal_allowance_exceeded 的值,请运行以下命令:

ethtool -S eth0

修正 DNS 节流问题

如果您发现 DNS 查询失败的原因是 DNS 节流,您可以:


这篇文章对您有帮助吗?


您是否需要账单或技术支持?