如何避免 Amazon EC2 Linux 实例的 DNS 解析失败问题?

3 分钟阅读
0

我想避免 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。如果您使用其他发行版,请从以下列表中选择适用于您发行版的文档:

解决方法

使用 dnsmasq 设置本地 DNS 缓存

要设置本地 DNS 缓存,请使用 dnsmasq(一台 DHCP 和缓存 DNS 服务器)。有关 dnsmasq 的概述,请参阅 dnsmasq 文档

1.    安装 dnsmasq 服务器:

sudo yum install -y dnsmasq

2.    创建一个专门的系统用户来运行 dnsmasq

sudo groupadd -r dnsmasqsudo 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 Configurationlisten-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 或 DHCP 租约文件中的私有 IP 范围进行反向 DNS 查找失败。如果您想成功执行反向查找,请注释掉或删除 bogus-priv。有关更多信息,请参阅 dnsmasq 手册页上的 -b、--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 和 Amazon Linux 2023

sudo systemctl restart dnsmasq.service
sudo systemctl enable dnsmasq.service

8.    要验证 dnsmasq 是否正常工作,请使用 dig 命令:

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 解析器。

**注意:**您必须禁用 DHCP 提供的默认 DNS 解析器。为此,请更改或创建 /etc/dhcp/dhclient.conf 文件。有关更多信息,请参阅我的私有 Amazo EC2 实例正在运行 Amazo Linux、Ubuntu 或 RHEL。如何为 EC2 实例分配静态 DNS 服务器,并且相关配置在实例重启后仍然存在?

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 systemctl restart network

-或-

sudo reboot

要验证您的实例是否使用 DNS 缓存,请运行 dig 命令:

dig aws.amazon.com

如果响应表明回复服务器是 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 上自动安装和配置 dnsmasq 作为 DNS 解析器,请使用以下选项:

如果要在其他 Linux 发行版上自动安装 dnsmasq,请使用任一文件进行必要的自定义。

因为它们使用 Amazo DNS 服务器备用地址 169.254.169.253,这两个文件都可以在 VPC 实例上运行。

要在启动时运行任一文件,请在用户数据字段中传递该文件的内容。您可以将 Bash 脚本作为独立脚本运行,也可以使用 AWS Systems Manager 运行命令在实例上执行操作。

要将 Bash 脚本作为独立脚本运行,请完成以下步骤:

1.    在您的实例上下载脚本并运行:

wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.shchmod +x AutomateDnsmasq.sh

2.    以根用户身份运行以下命令,或者使用 sudo

sudo ./AutomateDnsmasq.sh

相关信息

Amazon EC2 实例 IP 地址

AWS 官方
AWS 官方已更新 9 个月前