我想知道为什么我对 Amazon DNS 服务器的 DNS 查询在我的 Amazon Virtual Private Cloud (Amazon VPC) 中失败或超时。
简短描述
每个弹性网络接口的 Amazon DNS 配额为每秒 1,024 个数据包 (PPS)。如果您超过配额,则 Amazon Route 53 会拒绝流量。
VPC 流日志无法捕获应用程序发送到 Amazon DNS 服务器的流量。要确定 DNS 查询失败的原因,请使用数据包捕获或流量镜像。
注意:Route 53 查询日志仅捕获到达 VPC.2 解析器 AmazonProvidedDNS 的流量。受限制的 DNS 查询不会显示在查询日志中,因为这些查询会在网络接口级别受到限制。
解决方法
确定 DNS 查询失败的来源
使用 tcpdump(仅限 Linux)
要使用 tcpdump,请完成以下步骤:
-
在您的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行以下命令:
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
INSTANCE_ID=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id`
sudo tcpdump -i eth0 -s 350 -C 100 -W 20 -w /var/tmp/$INSTANCE_ID.$(date +%Y-%m-%d:%H:%M:%S).pcap
**注意:**上述命令捕获数据包的初始 350 字节,保存 20 个 100 MB 的文件,并覆盖旧的数据包捕获。如果您的主网络接口不是 eth0,则将上述命令中的 eth0 替换为您的主网络接口。要查找您的主接口,请运行以下命令:
netstat -i
-
运行以下命令来计算已发送的 DNS 查询的数量:
tcpdump -r <file_name.pcap> -nn dst port 53 | awk -F " " '{ print $1 }' | cut -d"." -f1 | uniq -c
使用流量镜像
如果您无法使用 tcpdump,请使用流量镜像来确定 DNS 查询是否受到限制。
**注意:**流量镜像适用于基于 Nitro 的实例和某些非 Nitro 实例类型。将收取流量镜像费用。
要捕获和分析流量数据,请完成以下步骤:
- 完成流量镜像先决条件。
- 创建流量镜像目标。确认目标网络接口或网络负载均衡器允许端口 UDP 4789 上的入站流量。
- 创建流量镜像筛选器。对于 Filter settings(筛选设置),确认已为 Network services - optional(网络服务 - 可选)启用 amazon-dns。
- 创建流量镜像会话。
流量镜像收集镜像流量并将其存储在流量镜像目标上。
**注意:**流量镜像是实时数据流。要捕获目标上的镜像数据包并将其保存在 .pcap 文件中,请捕获 UDP 端口 4789 上的流量。
使用 Wireshark
完成以下步骤:
- 在 Wireshark 中打开捕获的流量
注意: 要下载 Wireshark,请参阅 Wireshark 网站上的 Download 页面。
- 选择 Statistics(统计数据)选项卡。
- 选择 I/O Graph(I/O 图表)并清除所有选项。
- 在 Display Filter(显示筛选器)下,使用 VXLAN 网络标识符和 DNS 查询来添加筛选器。DNS 标头中的 QR 字段为 0。例如,如果 VXLAN 网络标识符为 16777215,则该图表的显示筛选器为 (vxlan.vni == 16777215) && (dns.flags.response == 0)。
- 查看该图表。如果保持在 1024 PPS 左右,则镜像源上会发生节流。
检查 ENA 驱动程序网络性能指标
如果 EC2 实例正在运行以下弹性网络适配器 (ENA) 驱动程序版本之一,请检查 DNS 节流的实时指标:
- Linux: 2.2.10 或更高版本
- Windows: 2.2.2.0 或更高版本
检查 linklocal_allowance_exceeded 指标,以确定由于流量超出以下本地服务的 PPS 配额而丢弃的数据包数量:
- Amazon VPC DNS 服务
- 实例元数据服务 (IMDS)
- Amazon Time Sync Service
在多个时间间隔检查该指标,以确定计数是否在增加。linklocal_allowance_exceeded 指标是自上次驱动程序因停止并启动或重启而重新启动以来的累积值。只有当该指标增加时才会出现问题。
要获取 linklocal_allowance_exceeded 值,请对 eth0 运行以下命令:
ethtool -S eth0 | grep link
对于接口名为 ens5 的实例:
ethtool -S ens5 | grep link
解决 DNS 节流问题
如果 DNS 节流导致故障,则执行以下操作之一来解决问题:
相关信息
Understand traffic mirror target concepts
Work with Traffic Mirroring to copy network traffic