Knowledge Center Monthly Newsletter - June 2025
Stay up to date with the latest from the Knowledge Center. See all new Knowledge Center articles published in the last month, and re:Post's top contributors.
如何為 EC2 執行個體指派靜態 DNS 伺服器,並在重新啟動後保持設定?
我想設定一個 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,其使用靜態 DNS 伺服器並可在重新啟動後保持設定。
解決方法
根據預設,與 Amazon Virtual Private Cloud (Amazon VPC) 關聯的 EC2 執行個體會在啟動時請求 DNS 伺服器地址。動態主機組態協定 (DHCP) 會傳送請求,然後 Amazon 將包含 DNS 伺服器位址的 DHCP 回應寫入本機 /etc/resolv.conf 檔案。
當您重新啟動執行個體時,會遺失對具有自訂 DNS 伺服器位址的 resolv.conf 檔案的手動修改。若要在重新啟動執行個體時維護靜態 DNS 伺服器,請根據 Linux 發行版更新設定。
**重要:**變更執行個體之前,請使用 Amazon Machine Image (AMI) 建立備份。或者,使用 Amazon Elastic Block Store (Amazon EBS) 快照建立備份。變更執行個體的網路組態時,執行個體可能無法連線。
AL2023
Amazon Linux 2023 (AL2023) 使用 systemd-resolved。如需詳細資訊,請參閱 Archlinux 網站上的 systemd-resolved。
設定解析程式
編輯 /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=~.
注意:設定 Domains=~. 選項,以便 systemd-resolved 不使用在每個連結組態中設定的每個連結 DNS 伺服器。Domains=~. 選項不會影響您在每個連結組態中指定的特定搜尋網域的網域名稱查詢。解析網域名稱時,它們會使用其每個連結的 DNS 伺服器。
變更 /etc/resolv.conf 指向的位置
預設情況下,/etc/resolv.conf 會指向本機主機虛設常式解析程式。若要變更解析程式,請使用更新的欄位重新建立檔案,或指向本機主機虛設常式解析程式以外的其他位置。例如,指向 /run/systemd/resolve/resolv.conf 檔案,其中包含 systemd-resolved 所使用的伺服器的扁平化清單。
使用本機 DNS 快取時的範例組態檔案狀態:
### Default Symbolic link status : point to stub-resolv.conf ### Flow: DNS query => Local Cache DNS 127.0.0.53 ( systemd-resolved ) => External DNS # ls -al /etc/resolv.conf lrwxrwxrwx 1 root root 39 Mar 5 02:28 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf # cat /etc/resolv.conf nameserver 127.0.0.53 options edns0 trust-ad search . ### 127.0.0.53 is used for systemd-resolved ( local cache dns ) # lsof -nP -p `pidof systemd-resolved` |grep TCP systemd-r 339 systemd-resolve 14u IPv4 2753 0t0 TCP 127.0.0.53:53 (LISTEN)
不使用本機 DNS 快取時的範例組態檔案狀態:
### Changed Symbolic link status : point to /run/systemd/resolve/resolv.conf # cat /run/systemd/resolve/resolv.conf nameserver 1.1.1.1 nameserver 1.0.0.1 search . # ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf # ls -al /etc/resolv.conf lrwxrwxrwx 1 root root 34 Apr 1 16:05 /etc/resolv.conf -> ../run/systemd/resolve/resolv.conf
若要測試您的組態,請執行下列命令:
# resolvectl status
# resolvectl query amazonaws.com
輸出範例:
# resolvectl status Global Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: uplink DNS Servers 8.8.8.8 8.8.4.4 DNS Domain ~. Link 2 (ens5) Current Scopes: DNS Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported DNS Servers: 10.2.0.2 DNS Domain: ap-northeast-2.compute.internal
# resolvectl query amazonaws.com amazonaws.com: 207.171.166.22 -- link: ens5 72.21.206.80 -- link: ens5 72.21.210.29 -- link: ens5 -- Information acquired via protocol DNS in 3.0ms. -- Data is authenticated: no; Data was acquired via local or encrypted transport: no -- Data from: cache
AL1 或 AL2
若要設定您的 Amazon Linux 1 (AL1) 或 Amazon Linux 2 (AL2) 執行個體,請更新 etc/dhcp/dhclient.conf 檔案或 ifcfg-eth0.conf 檔案。如果您設定了兩個檔案,則在 ifcfg-eth0.conf 檔案中指定的 DNS 伺服器將優先處理。
**先決條件:**將 ifcfg-eth0.conf 檔案中的 PEERDNS 參數值設為 yes (是)。當您將 PEERDNS 參數設為 no (否) 時,Amazon EC2 將忽略 ifcfg-* 檔案中指定的 DNS 伺服器或 DHCP 提供的 DNS 伺服器。
更新 etc/dhcp/dhclient.conf 檔案
請完成下列步驟:
- 開啟現有的 /etc/dhcp/dhclient.conf 檔案。或者,建立新的 /etc/dhcp/dhclient.conf 檔案。
**注意:**您必須具有根使用者權限才能編輯此檔案。使用 sudo-i 成為根使用者,或使用 sudo 實作所有命令。 - 若要覆寫 domain-name-servers,請將以下 supersede 命令新增至檔案:
**注意:**將 000.000.000.000 替換為您希望執行個體使用的 DNS 伺服器 IP 位址。supersede domain-name-servers 000.000.000.000, 000.000.000.000;
- 在 per-interface 組態檔案 (例如 /etc/sysconfig/network-scripts/ifcfg-*) 中,將 PEERDNS 參數設定為 yes (是)。
- 重新啟動 EC2 執行個體。resolv.conf 檔案會在執行個體重新啟動時更新,以僅包含您在 dhclient 檔案中指定的 DNS 伺服器。
更新 ifcfj-eth0 檔案
請完成下列步驟:
-
若要覆寫 /etc/dhcp/dhclient.conf 檔案中的 DNS 伺服器值,請在每個介面組態檔案中指定自訂 DNS 伺服器。
以下範例檔案顯示了來自 Amazon Linux 執行個體的 /etc/sysconfig/network-scripts/ifcfg-eth0 檔案,該檔案包含了兩個自訂的 DNS 伺服器: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
-
在 per-interface 組態檔案 (例如 /etc/sysconfig/network-scripts/ifcfg-*) 中,將 PEERDNS 參數設定為 yes (是)。
**注意:**如果您的執行個體執行的是 Ubuntu 16.04 或 Red Hat Enterprise Linux (RHEL) 7.5,那麼您也可以使用上述的解決步驟。
Ubuntu 18.04、20.04 和 22.04
在 Ubuntu 18.04 上,netplan.io 套件管理網路介面組態,systemd-resolved 服務使用虛設常式解析程式來管理 DNS 查詢。虛設常式解析程式 IP 位址位於 /etc/resolv.conf 檔案中,該檔案是指向 /run/systemd/resolve/stub-resolv.conf 檔案的符號連結。如果 /etc/resolv.conf 檔案具有以下組態,則 /etc/dhcp/dhclient.conf 中的 supersede 陳述式可能無法如預期般運作:
- 該檔案不是執行個體上的符號連結。
- 檔案是指向不同檔案的符號連結,例如 /run/systemd/resolve/resolv.conf。
完成下列步驟來覆寫 DNS 伺服器值:
-
建立一個名為 /etc/netplan/99-custom-dns.yaml 的檔案,其中包含以下資料:
### Create Customer DNS config # 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 ### Required File Permission # chmod 600 /etc/netplan/99-custom-dns.yaml ### Checking Netplan Configuration status # netplan get network: version: 2 ethernets: ens5: match: macaddress: "0a:e5:a1:40:a2:f5" nameservers: addresses: - 1.1.1.1 - 1.0.0.1 dhcp4: true dhcp4-overrides: use-dns: false use-domains: false dhcp6: false set-name: "ens5"
**注意:**將 1.1.1.1, 1.0.0.1 替換為您的 DNS 伺服器 IP 位址。Netplan 會將組態檔案存放在 /etc/netplan 目錄中。上述範例使用 ** ens5 ** 介面。確定介面名稱與您的介面相符。若要查看您的介面名稱,請執行下列命令:
# ip a
輸出範例:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000 link/ether 0a:e5:a1:40:a2:f5 brd ff:ff:ff:ff:ff:ff inet 172.31.35.233/20 metric 100 brd 172.31.47.255 scope global dynamic ens5 valid_lft 2828sec preferred_lft 2828sec inet6 fe80::8e5:a1ff:fe40:a2f5/64 scope link valid_lft forever preferred_lft forever
-
若要將 Netplan YAML 檔案轉換為組態檔案,請執行下列 netplan 命令:
# netplan generate # netplan try # netplan apply
注意:您可能會收到「警告:root:無法呼叫 Open vSwitch:ovsdb-server.service 未執行」訊息。您可以忽略此訊息並繼續下一步。如果您不想看到警告訊息,請使用 DPDK 套件安裝 Open vSwitch。虛設常式解析程式 IP 位址現在位於 /etc/resolv.conf 中。這是一種預期的行為,因為虛設常式解析程式 IP 位址位於您的作業系統 (OS) 本機中。在背景中,虛設常式解析程式會使用您在 99-custom-dns.yaml 檔案中指定的 DNS 伺服器。
-
若要確認系統正確使用預期的 DNS 伺服器 IP 位址,請根據您的 Ubuntu 版本執行下列命令:
Ubuntu 18.04:systemd-resolve --status
Ubuntu 20.04 和 22.04:
resolvectl status
RHEL 7.5
預設情況下,NetworkManager 服務會管理 RHEL 發行版的 resolv.conf 檔案。然後,服務會使用 DHCP 提供的 DNS 伺服器來填入檔案。若要使用自訂 DNS 伺服器,請在 resolv.conf 檔案中封鎖 NetworkManager,以便 resolv.conf 檔案忽略 DHCP 提供的 DNS 伺服器。
完成 AL1 或 AL2 下的更新 etc/dhcp/dhclient.conf 檔案的步驟。或者,建立 /etc/NetworkManager/conf.d/90-dns-none.conf 檔案,並包含以下內容:
[main]dns=none
重新啟動執行個體,然後手動建立 /etc/resolv.conf 檔案。
相關資訊
Archlinux 網站上的網路檔案
Archlinux 網站上的 resolved.conf(5)
Archlinux 網站上的 dhclient.conf(5)
Archlinux 網站上的 networkmanager.conf(5)
相關內容
- 已提問 6 個月前
- 已提問 1 年前