Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何避免 Amazon EC2 Linux 執行個體中發生 DNS 解析失敗?
我想避免 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 所有版本皆適用以下解析步驟。如果您使用其他發行版本,請參閱您發行版本的文件:
- 對於 Debian,請參閱 Debian 網站上的本機快取。
- 對於 Ubuntu,請參閱 Ubuntu 網站上的 Dnsmasq。
- 對於 Red Hat Enterprise Linux (RHEL),請參閱 Red Hat 網站上的如何在 RHEL 中使用 dnsmasq 設定 DNS 快取伺服器。
解決方法
**注意:**以下解析步驟使用 169.254.169.253 作為 DNS 解析器 IP 位址。如果您使用其他 DNS 解析器,請將 169.254.169.253 替換為您的 DNS 解析器 IP 位址。
使用 dnsmasq 設定本機 DNS 快取
若要設定本機 DNS 快取,請使用 dnsmasq。如需詳細資訊,請參閱 thekelleys.org.uk 網站上的 dnsmasq。
請完成下列步驟:
-
執行以下命令以安裝 dnsmasq 伺服器:
sudo yum install -y dnsmasq -
如果您的執行個體在 Amazon Linux 2023 (AL2023) 上執行,請繼續執行步驟 3。若要建立專屬的系統使用者來執行 dnsmasq,請執行下列命令:
sudo groupadd -r dnsmasq sudo useradd -r -g dnsmasq dnsmasq注意:dnsmasq 通常以根使用者身分執行。但是,使用者在啟動後會發生變化,並會捨棄根權限。預設情況下,使用者是匿名使用者。
-
執行以下命令建立 dnsmasq.conf 檔案的備份:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori -
若要使用 vim 文字編輯器建立並開啟 /etc/dnsmasq.conf 組態檔案,請執行下列命令:
sudo vim /etc/dnsmasq.conf**注意:**您可以使用任何文字編輯器 (例如 vi 或 nano) 來修改 /etc/dnsmasq.conf 檔案。
-
在 /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。
-
建立 /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 伺服器位置。
-
若要重新啟動 dnsmasq 伺服器,並將服務設定為在啟動時啟動,請根據您的發行版本執行下列其中一個命令。
Amazon Linux 1 (AL1):sudo service dnsmasq restart sudo chkconfig dnsmasq onAmazon Linux 2 (AL2) 與 AL2023:
sudo systemctl restart dnsmasq.service sudo systemctl enable dnsmasq.service -
若要驗證 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) ... -
將 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 解析器。
-
若要套用變更,請根據您的 Linux 發行版本執行以下命令:
AL2:
sudo dhclient
AL2023:
sudo systemctl restart systemd-resolved.service
-或-
若要重新啟動網路服務,請執行下列命令:
sudo systemctl restart network
-或-
若要重新啟動執行個體,請執行下列命令:
sudo reboot
- 執行以下命令來驗證您的執行個體是否使用 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 指令碼作為獨立指令碼執行,請完成以下步驟:
-
若要將指令碼下載到您的執行個體並使其可執行,請執行下列命令:
wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh chmod +x AutomateDnsmasq.sh -
若要執行該指令碼,請以根使用者身分執行以下命令:
sudo ./AutomateDnsmasq.sh
相關資訊
相關內容
- 已提問 1 年前

