如何避免 Amazon EC2 Linux 实例的 DNS 解析失败问题?
上次更新日期:2022 年 8 月 15 日
我想避免 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例的 DNS 解析失败问题。 我该如何操作?
简短描述
为了减少 CPU 和网络使用量并避免 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.org 网站上的本地缓存。
- 对于 Ubuntu,请参阅 Ubuntu 网站上的本地 DNS 缓存。
- 对于 RHEL,请参阅 Red Hat 客户门户上的如何在 RHEL 中使用 dnsmasq 配置 DNS 缓存服务器。
解决方法
使用 dnsmasq(DHCP 和缓存 DNS 服务器)设置本地 DNS 缓存。有关 dnsmasq 的概述,请参阅 dnsmasq 文档。
1. 通过运行以下命令安装 dnsmasq 服务器:
sudo yum install -y dnsmasq
2. 创建专用的系统用户以使用以下命令运行 dnsmasq:
sudo groupadd -r dnsmasq
sudo useradd -r -g dnsmasq dnsmasq
注意:dnsmasq 通常作为根用户运行,但在启动后会通过切换到另一个用户(默认情况下该用户为“nobody”)来删除根权限。
3. 使用以下命令创建 dnsmasq.conf 文件的副本:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
4. 使用文本编辑器(例如,vim)打开配置文件:
sudo vim /etc/dnsmasq.conf
5. 编辑 /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
6. 创建 /etc/resolv.dnsmasq 文件,然后设置您在 DHCP 选项集上指定的 Amazon DNS 服务器或自定义域名服务器:
sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"
注意:有关 DNS 服务器位置的更多信息,请参阅什么是 DHCP? 在以下情况下,请调整文件 /etc/resolv.dnsmasq 以使用该网络的名称服务器:
- 您可以从具有 dnsmasq 缓存的实例创建 AMI,以便在具有不同 CIDR 的另一个 VPC 中启动。
- 您在 DHCP 选项中指定了自定义 DNS 服务器。
7. 重新启动 dnsmasq 服务器并将服务设置为使用以下命令在启动时启动:
Amazon Linux 1
sudo service dnsmasq restart
sudo chkconfig dnsmasq on
Amazon Linux 2
sudo systemctl restart dnsmasq.service
sudo systemctl enable dnsmasq.service
8. 使用 dig 命令验证 dnsmasq 是否正常运行:
dig aws.amazon.com @127.0.0.1
如果响应与以下内容类似,则表明 dnsmasq 缓存运行正常:
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.56.amzn1 <<>> aws.amazon.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25122
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;aws.amazon.com. IN A
;; ANSWER SECTION:
aws.amazon.com. 41 IN A 54.239.31.69
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
...
9. 将 dnsmasq DNS 缓存设置为默认 DNS 解析程序。
注意:您必须通过更改或创建 /etc/dhcp/dhclient.conf 文件来禁止 DHCP 提供的默认 DNS 解析程序。有关更多信息,请参阅我的私有 Amazon EC2 实例运行的是 Amazon Linux、Ubuntu 或 RHEL。我如何将静态 DNS 服务器分配到重启期间仍然存在的 EC2 实例?
10. 使用以下命令将默认 DNS 解析程序配置为回退选项:
sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"
11. 要应用更改,请运行 dhclient 命令或重启实例:
sudo dhclient
-或者-
sudo reboot
要确认您的实例在使用 DNS 缓存,请运行 dig 命令:
dig aws.amazon.com
如果响应表明回应 DNS 请求的服务器为 127.0.0.1,则 DNS 缓存工作正常:
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.56.amzn1 <<>> aws.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1028
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;aws.amazon.com. IN A
;; ANSWER SECTION:
aws.amazon.com. 55 IN A 54.239.31.69
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) <<<-------
...
自动化
您可以使用以下选项之一来自动化安装并将 dnsmasq 在 Amazon Linux 上配置为 DNS 解析程序:
- AutomateDnsmasq.sh bash 脚本
- AutomateDnsmasq.cloudinit 指令
如果您想在其他 Linux 发行版上自动执行 dnsmasq 安装,则可以使用任一个文件进行必要的自定义。
这两个文件都可以在 VPC 实例上运行,因为它们使用 169.254.169.253 作为 Amazon DNS 服务器的备用地址。
通过在用户数据字段中传递文件内容,您可以在启动时运行任一个文件。Bash 脚本可作为独立脚本运行或使用 AWS Systems Manager 运行命令运行,以在现有实例上执行操作。
要将 Bash 脚本作为独立脚本运行:
1. 将脚本下载到您的实例上并使其处于可执行状态。
wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh
chmod +x AutomateDnsmasq.sh
2. 以根用户的身份运行以下命令或使用 sudo。
sudo ./AutomateDnsmasq.sh