如何避免 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 (DHCP 和快取 DNS 伺服器)。如需 dnsmasq 的概觀資訊,請參閱 dnsmasq 文件

1.    安裝 dnsmasq 伺服器:

sudo yum install -y dnsmasq

2.    建立專屬的系統使用者來執行 dnsmasq

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

**注意:**dnsmasq 通常以根使用者的身分執行,但啟動後就會變更為其他使用者 (預設情形下,使用者為「」)。這會捨棄根使用者的權限。

3.    建立 dnsmasq.conf 檔案的副本:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

4.    使用文字編輯器 (例如 vim) 開啟組態檔案:

sudo vim /etc/dnsmasq.conf

5.    編輯 /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 或DHCP 租約檔案中的私有 IP 範圍的反向 DNS 查詢失敗。如果您想要成功執行反向查詢,請予以評論或移除 bogus-priv。如需詳細資訊,請參閱 dnsmasq 手冊頁-b, --bogus-priv

6.    建立 /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 伺服器時,請調整檔案。

7.    重新啟動 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

8.    若要驗證 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)
...

9.    將 dnsmasq DNS 快取設定為預設的 DNS 解析程式。

**注意:**您必須抑制 DHCP 提供的預設 DNS 解析程式。若要這麼做,請變更或建立 /etc/dhcp/dhclient.conf 檔案。如需詳細資訊,請參閱我的私有 Amazon EC2 執行個體正在執行Amazon Linux、Ubuntu 或 RHEL。我該如何將靜態 DNS 伺服器指派給重新啟動期間仍持續存在的 EC2 執行個體?

10.    將預設 DNS 解析程式設定為後援選項:

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

11.    若要套用變更,請執行 dhclient 命令、重新啟動網路服務,或重新啟動執行個體:

sudo dhclient

-或-

sudo systemctl restart network

-或-

sudo reboot

若要確認執行個體是否使用 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 的安裝和設定作業自動化,請使用下列其中一種選項:

如果您想將其他 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 官方已更新 8 個月前