跳至內容

如何避免 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 通常以根使用者身分執行。但是,使用者在啟動後會發生變化,並會捨棄根權限。預設情況下,使用者是匿名使用者

  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 檔案,然後設定 Amazon DNS 伺服器或您在 DHCP 選項集中指定的自訂網域名稱伺服器。執行以下命令:

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

    **注意:**如需 DNS 伺服器位置的詳細資訊,請參閱什麼是 DHCP?您也可以在從具有 dnsmasq 快取的執行個體建立 Amazon Machine Image (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 個月前