如何避免 Amazon EC2 Linux 实例的 DNS 解析失败问题?
我想避免 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 设置本地 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 解析器,请使用以下选项:
- AutomateDnsmasq.sh bash 脚本
- AutomateDnsmasq.cloudinit 指令
如果要在其他 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
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前