我对 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 节流,您可以:
相关信息
流量镜像配额和注意事项
使用流量镜像
监控 EC2 实例的网络性能