我的私有 Amazon EC2 執行個體正在執行 Amazon Linux、Ubuntu 或 RHEL。如何將靜態 DNS 伺服器指派給重新啟動期間仍然存在的 EC2 執行個體?

3 分的閱讀內容
0

我想要使用靜態 DNS 伺服器項目來設定 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,這些項目會在重新啟動期間仍然存在。

簡短說明

根據預設,與 Amazon Virtual Private Cloud (Amazon VPC) 關聯的 Amazon EC2 執行個體會在啟動時請求 DNS 伺服器地址。此要求會使用動態主機組態協定 (DHCP) 傳送。DHCP 回應會傳回寫入本機 /etc/resolv.conf 檔案的 DNS 伺服器地址。當您重新啟動執行個體時,會遺失對具有自訂 DNS 伺服器地址的 resolv.conf 檔案的手動修改。您用來解決此問題的方法取決於您的 Linux 發行版本。如需 VPC 和 DNS 伺服器的詳細資訊,請參閱 Amazon VPC 中的 DHCP 選項集

解決方法

**重要:**在變更 EC2 執行個體之前,請使用 Amazon Machine Image (AMI) 或 Amazon Elastic Block Store (Amazon EBS) 快照建立備份。變更執行個體的網路組態可能會導致執行個體無法連線。

Amazon Linux 2023

Amazon Linux 2023 使用 systemd-resolved。如需更多資訊,請參閱網站 archlinux.org 的 resolved.conf(5)

設定解析器

編輯 /etc/systemd/resolved.conf 檔案,並變更 DNS網域選項

# /etc/systemd/resolved.conf

[Resolve]
DNS=8.8.8.8
Domains=~.

或者,建立一個下拉式功能表。例如,/etc/systemd/resolved.conf.d/dns_servers.conf

#/etc/systemd/resolved.conf.d/dns_servers.conf

[Resolve]
DNS=8.8.8.8 8.8.4.4
Domains=~.

**注意:**設定 resolved.conf(5) 的 Domains=~. 選項時,請記住以下事項:

  • 如果未設定 Domains=~. 選項,則 systemd-resolved 可能會使用在每個連結組態中設定的每個連結 DNS 伺服器。
  • Domains=~. 選項不會影響符合每個連結組態中指定的較特定搜尋網域的網域名稱查詢。網域名稱仍會使用各自的每個連結 DNS 伺服器來解析。

如需每個連結組態的詳細資訊,請參閱 archlinux.org 網站上的 systemd-networkd#network 檔案

將位置 /etc/resolv.conf 點變更為

預設情況下,/etc/resolv.conf 指向 localhost 虛設常式解析程式。要變更此設定,請使用不同的內容重新建立檔案或指向 localhost 虛設常式解析程式以外的其他位置。例如,您可以指向 /run/systemd/resolve/resolv.conf,其中包含 systemd-resolved 所使用的伺服器的扁平化清單。

您可以使用 resolvectl status 命令來測試您的組態,例如,resolvectl query amazonaws.com 並查看輸出。

Amazon Linux、Amazon Linux 2

使用下列其中一個選項來設定您的 Amazon EC2 執行個體。如果您同時套用這兩個選項,則會優先使用 ifcfg-eth0 檔案中指定的 DNS 伺服器 (選項 2)。

若要使用任一選項,ifcfg-eth0 檔案中的 PEERDNS 參數值必須設定為 yes。將 PEERDNS 參數設定為 no 表示會忽略 *ifcfg-* 檔案中指定或由 DHCP 提供的 DNS 伺服器。

選項 1:

1.    編輯或建立 /etc/dhcp/dhclient.conf 檔案。

**注意:**您必須具有根使用者權限才能編輯此檔案。使用 sudo-i 成為根使用者,或者使用 sudo 實作所有命令。

2.    將 supersede 命令新增至檔案,以覆寫網域名稱伺服器。在下列範例中,請將 xxx.xxx.xxx.xxx 取代為您要執行個體使用的一或多個 DNS 伺服器的 IP 位址:

supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;

在上一次修改之後,resolv.conf 檔案會在執行個體重新啟動時更新,以僅包含您在 dhclient 檔案中指定的 DNS 伺服器。如需有關 supersede 命令的更多資訊,請參閱 Linux 手冊頁面的 dhclient.conf(5)

3.    在每個介面組態檔案 (/etc/sysconfig/network-scripts/ifcfg-*) 中,將 PEERDNS 參數設定為 yes

4.    重新啟動 EC2 執行個體。

選項 2:

1.    若要覆寫 /etc/dhcp/dhclient.conf 檔案中的 DNS 伺服器值,請在每個介面組態檔案 (/etc/sysconfig/network-scripts/ifcfg-*) 中指定自訂 DNS 伺服器。

舉例來說,下列範例顯示來自 Amazon Linux 執行個體的 /etc/sysconfig/network-scripts/ifcfg-eth0 檔案,這些檔案已修改為包含兩個自訂 DNS 伺服器 (DNS1DNS2):

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
RES_OPTIONS="timeout:2 attempts:5"
DHCP_ARP_CHECK=no
MTU="9001"
DNS1=8.8.8.8
DNS2=8.8.4.4

2.    在每個介面組態檔案 (/etc/sysconfig/network-scripts/ifcfg-*) 中,將 PEERDNS 參數設定為 yes

Ubuntu 16.04

1.    編輯或建立 /etc/dhcp/dhclient.conf 檔案。

**注意:**您必須具有根使用者權限才能編輯此檔案。使用 sudo-i 成為根使用者,或者使用 sudo 實作所有命令。

2.    將 supersede 命令新增至檔案,以覆寫網域名稱伺服器。在下列範例中,請將 xxx.xxx.xxx.xxx 取代為您要執行個體使用的一或多個 DNS 伺服器的 IP 位址:

supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;

在此修改之後,resolv.conf 檔案會在執行個體重新啟動時更新,以僅包含您在 dhclient 檔案中指定的 DNS 伺服器。如需有關 supersede 命令的詳細資訊,請參閱 Linux 手冊頁面的 dhclient.conf(5)

3.    重新啟動執行個體。

Ubuntu 18.04

根據預設,在 Ubuntu 18.04 上,netplan.io 套件會處理網路介面組態,而且 systemd-resolved 服務會使用虛設常式解析程式來處理 DNS 查詢。虛設常式解析程式 IP 位於 /etc/resolv.conf

反過來,/etc/resolv.conff 檔案是指向 run/systemd/resolve/stub-resolv.conf 檔案的符號連結。如果 /etc/dhcp/dhclient.conf 檔案符合下列任一條件,則 /etc/dhcp/dhclient.conf 中的 supersede 陳述式可能無法如預期般運作:

  • 該檔案不是執行個體上的符號連結。
  • 檔案是指向不同檔案的符號連結,例如 /run/systemd/resolve/resolv.conf

這些條件中的任何一個都表示對預設的 Ubuntu 18.04 組態進行自訂。

執行下列步驟來覆寫 DNS 伺服器值:

1.    Netplan 通常將組態檔案存放在 /etc/netplan 目錄中。建立一個名為 /etc/netplan/99-custom-dns.yaml 的檔案,然後用以下幾行進行填入。請務必將預留位置 DNS 伺服器 IP 位址取代為您偏好的位址:

cat << 'EOF' | sudo tee /etc/netplan/99-custom-dns.yaml
network:
  version: 2
  ethernets:
    ens5:
      nameservers:
        addresses: [1.1 .1 .1, 1.0 .0 .1]
      dhcp4-overrides:
        use-dns: false
        use-domains: false
EOF

**注意:**在前面的範例中,介面指定為 ens5。請確定介面名稱與您的設定介面相符。若要查看您的介面名稱,請使用 ip a 命令。

2.    執行下列命令:

netplan generate

在這些變更之後,您仍會在 /etc/resolv.conf 中看到虛設常式解析程式 IP。這是預期的。虛設常式解析程式 IP 位於您的作業系統本機中。在背景中,虛設常式解析程式會使用您在先前 99-custom-dns.yaml 檔案中指定的 DNS 伺服器。

3.    重新啟動執行個體。

4.    執行 systemd-resolve 命令,以確認系統是否正確地取得預期的 DNS 伺服器 IP 位址:

systemd-resolve --status

RHEL 7.5

依預設,NetworkManager 服務會管理 resolv.conf 檔案。然後,服務會使用 DHCP 提供的 DNS 伺服器來填入檔案。停止 NetworkManager 管理 resolv.conf 檔案,以便 resolv.conf 檔案忽略 DHCP 提供的 DNS 伺服器。

選項 1:

1.    編輯或建立 /etc/dhcp/dhclient.conf 檔案。

**注意:**您必須具有根使用者權限才能編輯此檔案。使用 sudo-i 成為根使用者,或者使用 sudo 實作所有命令。

2.    將 supersede 命令新增至檔案,以覆寫網域名稱伺服器。在下列範例中,請將 xxx.xxx.xxx.xxx 取代為您要執行個體使用的一或多個 DNS 伺服器的 IP 位址:

supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;

在此修改之後,resolv.conf 檔案會在執行個體重新啟動時更新,以僅包含您在 dhclient 檔案中指定的 DNS 伺服器。如需有關 supersede 命令的詳細資訊,請參閱 Linux 手冊頁面的 dhclient.conf(5)

3.    在每個介面組態檔案 (/etc/sysconfig/network-scripts/ifcfg-*) 中,將 PEERDNS 參數設定為 yes

4.    重新啟動執行個體。

選項 2:

1.    使用下列內容建立 /etc/NetworkManager/conf.d/90-dns-none.conf 檔案:

[main]
dns=none

2.    重新啟動執行個體,然後手動填入 /etc/resolv.conf 檔案。

相關資訊

networkmanager.conf(5) (Linux 手冊頁面)

AWS 官方
AWS 官方已更新 1 年前