如何避免 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 缓存。
- 对于 Red Hat Enterprise Linux(RHEL),请参阅 Red Hat 客户门户上的如何在 RHEL 中使用 dnsmasq 配置 DNS 缓存服务器。
解决方法
使用 dnsmasq 设置本地 DNS 缓存
要设置本地 DNS 缓存,请使用 dnsmasq。要了解更多信息,请参阅 thekelleys.org.uk 网站上的 dnsmasq。
完成以下步骤:
-
要安装 dnsmasq 服务器,请运行以下命令:
sudo yum install -y dnsmasq
-
要创建专门的系统用户来运行 dnsmasq,请运行以下命令:
sudo groupadd -r dnsmasq sudo useradd -r -g dnsmasq dnsmasq
**注意:****dnsmasq ** 通常以根用户身份运行,但在启动后会更改为其他用户。默认情况下,用户为 nobody。如果 dnsmasq 更改为其他用户,根权限将被终止。
-
要创建 dnsmasq.conf 文件的副本,请运行以下命令:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
要使用文本编辑器打开配置文件,请运行以下命令:
sudo vim /etc/dnsmasq.conf
-
要编辑 /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 中的私有 IP 范围进行反向 DNS 查找时会遭遇失败。**此选项可能还会导致动态主机配置协议(DHCP)租约文件的反向 DNS 查找失败。如果想成功执行反向查找,请注释掉或删除 bogus-priv。
-
创建 /etc/resolv.dnsmasq 文件。然后,要设置在 DHCP 选项集上指定的亚马逊 DNS 服务器或自定义 domain-name-servers,请运行以下命令:
sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"
**注意:**有关 DNS 服务器位置的详细信息,请参阅什么是 DHCP?在某些情况下,必须调整文件 /etc/resolv.dnsmasq 以使用该网络的名称服务器。从具有 dnsmasq 缓存的实例创建 AMI,以便在具有不同 CIDR 的另一个 VPC 中启动时,请调整文件。也可以在 DHCP 选项中指定自定义 DNS 服务器时调整文件。
-
要重新启动 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
-
要验证 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) ...
-
将 dnsmasq DNS 缓存设置为默认 DNS 解析器。
**注意:**必须禁用 DHCP 提供的默认 DNS 解析器。为此,请更改或创建 /etc/dhcp/dhclient.conf 文件。有关更多信息,请参阅如何为重启后仍然存在的 Amazon EC2 实例分配静态 DNS 服务器?然后,要将默认 DNS 解析器配置为备用选项,请运行以下命令:
sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"
-
要应用更改,请执行以下操作之一。运行以下 dhclient 命令:
sudo dhclient
-或-
要重新启动网络服务,请运行以下命令:sudo systemctl restart network
-或-
要重启实例,请运行以下命令:sudo reboot
注意:对于亚马逊 Linux 2023,请运行
sudo systemctl restart systemd-networkd.service
,而不是 dhclient。
要验证实例是否使用 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 指令
有关 AutomateDnsmasq.sh bash 脚本的更多信息,请参阅 GithHub 网站上的 #!/bin/bash。
有关 AutomateDnsmasq.cloudinit 指令的更多信息,请参阅 GithHub 网站上的 #cloud-config。
如果要在其他 Linux 发行版上自动安装 dnsmasq,请使用任一文件进行必要的自定义。
如果两个文件都使用亚马逊 DNS 服务器备用地址 169.254.169.253,那么这两个文件都可以在 VPC 实例上运行。
要在启动时运行任一文件,请在用户数据字段中传递该文件的内容。要在实例上执行操作,可以将 Bash 脚本作为独立脚本运行,也可以使用 AWS Systems Manager 运行命令。
要将 Bash 脚本作为独立脚本运行,请完成以下步骤:
-
要将脚本下载到实例上并使其可运行,请运行以下命令:
wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.shchmod +x AutomateDnsmasq.sh
-
以根用户身份运行以下命令,或者使用 sudo:
sudo ./AutomateDnsmasq.sh
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前