如何避免 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。要了解更多信息,请参阅 thekelleys.org.uk 网站上的 dnsmasq

完成以下步骤:

  1. 要安装 dnsmasq 服务器,请运行以下命令:

    sudo yum install -y dnsmasq
  2. 要创建专门的系统用户来运行 dnsmasq,请运行以下命令:

    sudo groupadd -r dnsmasq  
    sudo useradd -r -g dnsmasq dnsmasq

    **注意:****dnsmasq ** 通常以根用户身份运行,但在启动后会更改为其他用户。默认情况下,用户为 nobody。如果 dnsmasq 更改为其他用户,根权限将被终止。

  3. 要创建 dnsmasq.conf 文件的副本,请运行以下命令:

    sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori

    要使用文本编辑器打开配置文件,请运行以下命令:

    sudo vim /etc/dnsmasq.conf
  4. 要编辑 /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

  5. 创建 /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 服务器时调整文件。

  6. 要重新启动 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
  7. 要验证 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)
    ...
  8. 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"
  9. 要应用更改,请执行以下操作之一。运行以下 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 脚本作为独立脚本运行,请完成以下步骤:

  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 官方已更新 8 个月前