如何避免 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 dnsmasqsudo useradd -r -g dnsmasq dnsmasq

    注意事項:dnsmasq 通常以根使用者的身分執行,但啟動後就會變更為其他使用者。根據預設,使用者不是任何人。當 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 檔案。然後,若要設定 Amazon DNS 伺服器,或您在 DHCP 選項集中指定的自訂網域名稱伺服器,請執行下列命令:

    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 檔案。如需詳細資訊,請參閱如何將靜態 DNS 伺服器指派給重新開機後仍然存在的 Amazon EC2 執行個體?

    然後,若要將預設 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

    **注意事項:**對於 Amazon 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 上以 DNS 解析程式的形式將 dnsmasq 的安裝和設定作業自動化,請使用下列其中一種選項:

  • AutomateDnsmasq.sh bash 指令碼
  • AutomateDnsmasq.cloudinit 指令

如需有關 AutomateDnsmasq.sh bash 指令碼的詳細資訊,請參閱 GithHub 網站上的 #!/bin/bash

如需有關 AutomateDnsmasq.cloudinit 指令的詳細資訊,請參閱 GithHub 網站上的 #cloud-config

如果您想將其他 Linux 版本上的 dnsmasq 安裝作業自動化,請使用任一檔案來完成必要的自訂程序。

當這兩個檔案都使用 Amazon 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 個月前