跳至内容

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

4 分钟阅读
0

我想避免 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例中的 DNS 解析失败问题。

简短描述

为避免 DNS 解析失败,请应用 DNS 缓存。

如果您使用 DNS 缓存来查询外部 DNS 资源,缓存会在本地回答大多数重复的 DNS 查询。在这种情况下,缓存不会通过网络与 DNS 解析器进行交互。您可以查询外部 DNS 资源,示例如下:

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

您可以对所有版本的 Amazon Linux 使用以下解决步骤。如果使用其他发行版,请参阅适用于您发行版的文档:

解决方法

**注意:**以下解析步骤使用 169.254.169.253 作为 DNS 解析器 IP 地址。如果您使用不同的 DNS 解析器,请将 169.254.169.253 替换为您的 DNS 解析器 IP 地址。

使用 dnsmasq 设置本地 DNS 缓存

要设置本地 DNS 缓存,请使用 dnsmasq。要了解更多信息,请参阅 thekelleys.org.uk 网站上的 dnsmasq

完成以下步骤:

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

    sudo yum install -y dnsmasq
  2. 如果您的实例在 Amazon Linux 2023 (AL2023) 上运行,请继续执行步骤 3。要创建专门的系统用户来运行 dnsmasq,请运行以下命令:

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

    **注意:**dnsmasq 通常以根用户身份运行。但是,用户在启动后会发生变化,放弃根权限。默认情况下,用户为 nobody

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

    sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
  4. 要使用 vim 文本编辑器创建和打开 /etc/dnsmasq.conf 配置文件,请运行以下命令:

    sudo vim /etc/dnsmasq.conf

    **注意:**您可以使用任何文本编辑器(例如 vinano)来修改 /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

    **注意:**如果 dnsmasq 中存在 bogus-priv 选项,对不在 **/etc/hosts 中的私有 IP 地址范围进行反向 DNS 查找时会遭遇失败。**此选项可能还会导致动态主机配置协议 (DHCP) 租约文件的反向 DNS 查找失败。要成功执行反向查找,请注释掉或删除 bogus-priv

  6. 创建 /etc/resolv.dnsmasq 文件并设置您在 DHCP 选项集中指定的 Amazon DNS 服务器或自定义域名服务器。运行以下命令:

    sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"

    **注意:**有关 DNS 服务器位置的详细信息,请参阅什么是 DHCP?当您从具有 dnsmasq 缓存的实例创建亚马逊机器映像 (AMI) 以在另一个具有不同 CIDR 的虚拟私有云 (VPC) 中启动时,您还可以调整 169.254.169.253 服务器位置。

  7. 要重新启动 dnsmasq 服务器并将服务设置为启动时启动,请根据您的发行版运行以下命令之一。
    Amazon Linux 1 (AL1):

    sudo service dnsmasq restart
    sudo chkconfig dnsmasq on

    Amazon Linux 2 (AL2) 和 AL2023:

    sudo systemctl restart dnsmasq.service
    sudo systemctl enable dnsmasq.service
  8. 要验证 dnsmasq 是否正常工作,请运行以下命令:

    dig aws.amazon.com @127.0.0.1

    如果响应与以下示例类似,则 dnsmasq 缓存可以正常工作:

    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com @127.0.0.1
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33958
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1232
    ;; QUESTION SECTION:
    ;aws.amazon.com.                        IN      A
    
    ;; ANSWER SECTION:
    aws.amazon.com.         300     IN      CNAME   tp.8e49140c2-frontier.amazon.com.
    tp.8e49140c2-frontier.amazon.com. 9 IN  CNAME   dr49lng3n1n2s.cloudfront.net.
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.67
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.79
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.96
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.102
    
    ;; Query time: 2 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ...
  9. dnsmasq DNS 缓存设置为默认 DNS 解析器。
    **注意:**必须禁用 DHCP 提供的默认 DNS 解析器。为此,请更改或创建 /etc/dhcp/dhclient.conf 文件
    对于 AL2,运行以下命令:

    sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"

    对于 AL2023,运行以下命令:

    sudo bash -c 'echo "DNS=127.0.0.1" >> /etc/systemd/resolved.conf'
    sudo bash -c 'echo "DNS=169.254.169.253" >> /etc/systemd/resolved.conf'

    **注意:**AL2023 使用 systemd-networkd 作为默认 DNS 解析器。

  10. 要应用更改,请根据您的 Linux 发行版运行以下命令:
    AL2:

sudo dhclient

AL2023:

sudo systemctl restart systemd-resolved.service

-或-
要重新启动网络服务,请运行以下命令:

sudo systemctl restart network

-或-
要重启实例,请运行以下命令:

sudo reboot
  1. 运行以下命令以验证实例是否使用 DNS 缓存:
dig aws.amazon.com

如果输出显示回复服务器为 127.0.0.1,则 DNS 缓存按预期运行。
输出示例:

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29129
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;aws.amazon.com.                        IN      A

;; ANSWER SECTION:
aws.amazon.com.         297     IN      CNAME   tp.8e49140c2-frontier.amazon.com.
tp.8e49140c2-frontier.amazon.com. 25 IN CNAME   dr49lng3n1n2s.cloudfront.net.
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.102
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.96
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.79
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.67

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)   <-------------
...

为新实例自动执行 dnsmasq

要在 Amazon Linux 上自动安装和配置 dnsmasq 作为 DNS 解析器,请使用以下选项之一:

  • 使用 AutomateDnsmasq.sh bash 脚本。要下载该文件,请参阅 GitHub 网站上的 AutomateDnsmasq.sh
  • 使用 AutomateDnsmasq.cloudinit 指令。要下载该文件,请参阅 GitHub 网站上的 AutomateDnsmasq.cloudinit

要在其他 Linux 发行版上自动安装 dnsmasq,请使用前面的文件之一进行必要的自定义。对于任一文件,如果您使用 169.254.169.253 Amazon DNS 服务器备用地址,则这些文件可以在 VPC 实例上运行。

要在启动时运行任一文件,请在用户数据中输入文件内容。您可以使用 AWS Systems Manager 运行命令来运行 bash 脚本。最佳做法是仅将这些指令用于首次启动初始化。

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

  1. 要将脚本下载到实例上并使其可执行,请运行以下命令:

    wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh
    chmod +x AutomateDnsmasq.sh
  2. 要运行脚本,请以根用户身份运行以下命令:

    sudo ./AutomateDnsmasq.sh

相关信息

Amazon EC2 实例 IP 地址

AWS 官方已更新 7 个月前