Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何避免 Amazon EC2 Linux 实例中的 DNS 解析失败问题?
我想避免 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例中的 DNS 解析失败问题。
简短描述
为避免 DNS 解析失败,请应用 DNS 缓存。
如果您使用 DNS 缓存来查询外部 DNS 资源,缓存会在本地回答大多数重复的 DNS 查询。在这种情况下,缓存不会通过网络与 DNS 解析器进行交互。您可以查询外部 DNS 资源,示例如下:
- Amazon Relational Database Service(Amazon RDS)
- Amazon ElastiCache
- Amazon Simple Storage Service (Amazon S3)
您可以对所有版本的 Amazon Linux 使用以下解决步骤。如果使用其他发行版,请参阅适用于您发行版的文档:
- 对于 Debian,请参阅 Debian 网站上的本地缓存。
- 对于 Ubuntu,请参阅 Ubuntu 网站上的 Dnsmasq。
- 对于 Red Hat Enterprise Linux (RHEL),请参阅 Red Hat 网站上的如何在 RHEL 中使用 dnsmasq 配置 DNS 缓存服务器。
解决方法
**注意:**以下解析步骤使用 169.254.169.253 作为 DNS 解析器 IP 地址。如果您使用不同的 DNS 解析器,请将 169.254.169.253 替换为您的 DNS 解析器 IP 地址。
使用 dnsmasq 设置本地 DNS 缓存
要设置本地 DNS 缓存,请使用 dnsmasq。要了解更多信息,请参阅 thekelleys.org.uk 网站上的 dnsmasq。
完成以下步骤:
-
运行以下命令以安装 dnsmasq 服务器:
sudo yum install -y dnsmasq -
如果您的实例在 Amazon Linux 2023 (AL2023) 上运行,请继续执行步骤 3。要创建专门的系统用户来运行 dnsmasq,请运行以下命令:
sudo groupadd -r dnsmasq sudo useradd -r -g dnsmasq dnsmasq**注意:**dnsmasq 通常以根用户身份运行。但是,用户在启动后会发生变化,放弃根权限。默认情况下,用户为 nobody。
-
运行以下命令以创建 dnsmasq.conf 文件的副本:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori -
要使用 vim 文本编辑器创建和打开 /etc/dnsmasq.conf 配置文件,请运行以下命令:
sudo vim /etc/dnsmasq.conf**注意:**您可以使用任何文本编辑器(例如 vi 或 nano)来修改 /etc/dnsmasq.conf 文件。
-
在 /etc/dnsmasq.conf 文件中,输入以下内容:
# Server Configuration listen-address=127.0.0.1 port=53 bind-interfaces user=dnsmasq group=dnsmasq pid-file=/var/run/dnsmasq.pid # Name resolution options resolv-file=/etc/resolv.dnsmasq cache-size=500 neg-ttl=60 domain-needed bogus-priv**注意:**如果 dnsmasq 中存在 bogus-priv 选项,对不在 **/etc/hosts 中的私有 IP 地址范围进行反向 DNS 查找时会遭遇失败。**此选项可能还会导致动态主机配置协议 (DHCP) 租约文件的反向 DNS 查找失败。要成功执行反向查找,请注释掉或删除 bogus-priv。
-
创建 /etc/resolv.dnsmasq 文件并设置您在 DHCP 选项集中指定的 Amazon DNS 服务器或自定义域名服务器。运行以下命令:
sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"**注意:**有关 DNS 服务器位置的详细信息,请参阅什么是 DHCP?当您从具有 dnsmasq 缓存的实例创建亚马逊机器映像 (AMI) 以在另一个具有不同 CIDR 的虚拟私有云 (VPC) 中启动时,您还可以调整 169.254.169.253 服务器位置。
-
要重新启动 dnsmasq 服务器并将服务设置为启动时启动,请根据您的发行版运行以下命令之一。
Amazon Linux 1 (AL1):sudo service dnsmasq restart sudo chkconfig dnsmasq onAmazon Linux 2 (AL2) 和 AL2023:
sudo systemctl restart dnsmasq.service sudo systemctl enable dnsmasq.service -
要验证 dnsmasq 是否正常工作,请运行以下命令:
dig aws.amazon.com @127.0.0.1如果响应与以下示例类似,则 dnsmasq 缓存可以正常工作:
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33958 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;aws.amazon.com. IN A ;; ANSWER SECTION: aws.amazon.com. 300 IN CNAME tp.8e49140c2-frontier.amazon.com. tp.8e49140c2-frontier.amazon.com. 9 IN CNAME dr49lng3n1n2s.cloudfront.net. dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.67 dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.79 dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.96 dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.102 ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ... -
将 dnsmasq DNS 缓存设置为默认 DNS 解析器。
**注意:**必须禁用 DHCP 提供的默认 DNS 解析器。为此,请更改或创建 /etc/dhcp/dhclient.conf 文件。
对于 AL2,运行以下命令:sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"对于 AL2023,运行以下命令:
sudo bash -c 'echo "DNS=127.0.0.1" >> /etc/systemd/resolved.conf' sudo bash -c 'echo "DNS=169.254.169.253" >> /etc/systemd/resolved.conf'**注意:**AL2023 使用 systemd-networkd 作为默认 DNS 解析器。
-
要应用更改,请根据您的 Linux 发行版运行以下命令:
AL2:
sudo dhclient
AL2023:
sudo systemctl restart systemd-resolved.service
-或-
要重新启动网络服务,请运行以下命令:
sudo systemctl restart network
-或-
要重启实例,请运行以下命令:
sudo reboot
- 运行以下命令以验证实例是否使用 DNS 缓存:
dig aws.amazon.com
如果输出显示回复服务器为 127.0.0.1,则 DNS 缓存按预期运行。
输出示例:
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29129 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;aws.amazon.com. IN A ;; ANSWER SECTION: aws.amazon.com. 297 IN CNAME tp.8e49140c2-frontier.amazon.com. tp.8e49140c2-frontier.amazon.com. 25 IN CNAME dr49lng3n1n2s.cloudfront.net. dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.102 dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.96 dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.79 dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.67 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) <------------- ...
为新实例自动执行 dnsmasq
要在 Amazon Linux 上自动安装和配置 dnsmasq 作为 DNS 解析器,请使用以下选项之一:
- 使用 AutomateDnsmasq.sh bash 脚本。要下载该文件,请参阅 GitHub 网站上的 AutomateDnsmasq.sh。
- 使用 AutomateDnsmasq.cloudinit 指令。要下载该文件,请参阅 GitHub 网站上的 AutomateDnsmasq.cloudinit。
要在其他 Linux 发行版上自动安装 dnsmasq,请使用前面的文件之一进行必要的自定义。对于任一文件,如果您使用 169.254.169.253 Amazon DNS 服务器备用地址,则这些文件可以在 VPC 实例上运行。
要在启动时运行任一文件,请在用户数据中输入文件内容。您可以使用 AWS Systems Manager 运行命令来运行 bash 脚本。最佳做法是仅将这些指令用于首次启动初始化。
要将 Bash 脚本作为独立脚本运行,请完成以下步骤:
-
要将脚本下载到实例上并使其可执行,请运行以下命令:
wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh chmod +x AutomateDnsmasq.sh -
要运行脚本,请以根用户身份运行以下命令:
sudo ./AutomateDnsmasq.sh

