如何使用 Amazon EC2 Linux 实例避免 DNS 解析失败?

上次更新时间:2020 年 6 月 23 日

如何使用 Amazon Elastic Compute Cloud (Amazon EC2) Linux 避免 DNS 解析失败?

简短描述

为减少 CPU 和网络使用并避免 DNS 解析失败,请应用 DNS 缓存。

当您使用 DNS 缓存来查询外部 DNS 资源(例如以下任意 AWS 应用程序)时,缓存会在本地响应大多数经常性 DNS 查询,而并不通过网络与 DNS 解析程序进行交互:

  • Amazon Relational Database Service (Amazon RDS)
  • Amazon ElastiCache
  • Amazon Simple Storage Service (Amazon S3)

以下程序适用于所有的 Amazon Linux 版本。如果您在使用另一个发行版,请从下面的列表中为您的发行版选择文档:

解决方法

使用 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"

注意:对于 EC2-Classic,Amazon DNS 服务器位于 172.16.0.23。对于 EC2-VPC,您可以在 DHCP 选项集中找到有关 DNS 服务器位置的更多信息。如果您从具有 dnsmasq 缓存的实例中创建 AMI 以便在具有不同 CIDR 的另一个 VPC 中启动,或者您具有在 DHCP 选项中指定的自定义 DNS 服务器,请调整文件 /etc/resolv.dnsmasq 以使用该网络的名称服务器。

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 解析程序:

如果您想在其他 Linux 发行版上自动执行 dnsmasq 安装,则可以使用任一个文件进行必要的自定义。

这两个文件都可以在 VPC 实例或 EC2-Classic 上运行,因为它们的 VPC 使用 169.254.169.253 作为 Amazon DNS 服务器备选地址,而 EC2-Classic 则使用 172.16.0.23。

通过在用户数据字段中传递文件内容,您可以在启动时运行任一个文件。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

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?