如何為 EC2 執行個體指派靜態 DNS 伺服器,並在重新啟動後保持設定?

5 分的閱讀內容
0

我想設定一個 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 檔案

請完成下列步驟:

  1. 開啟現有的 /etc/dhcp/dhclient.conf 檔案。或者,建立新的 /etc/dhcp/dhclient.conf 檔案。
    **注意:**您必須具有根使用者權限才能編輯此檔案。使用 sudo-i 成為根使用者,或使用 sudo 實作所有命令。
  2. 若要覆寫 domain-name-servers,請將以下 supersede 命令新增至檔案:
    supersede domain-name-servers 000.000.000.000, 000.000.000.000;
    **注意:**將 000.000.000.000 替換為您希望執行個體使用的 DNS 伺服器 IP 位址。
  3. per-interface 組態檔案 (例如 /etc/sysconfig/network-scripts/ifcfg-*) 中,將 PEERDNS 參數設定為 yes (是)。
  4. 重新啟動 EC2 執行個體resolv.conf 檔案會在執行個體重新啟動時更新,以僅包含您在 dhclient 檔案中指定的 DNS 伺服器。

更新 ifcfj-eth0 檔案

請完成下列步驟:

  1. 若要覆寫 /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
  2. 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 伺服器值:

  1. 建立一個名為 /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
  2. 若要將 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 伺服器。

  3. 重新啟動執行個體

  4. 若要確認系統正確使用預期的 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 檔案。

相關資訊

Amazon VPC 中的 DHCP 選項集

Archlinux 網站上的網路檔案

Archlinux 網站上的 resolved.conf(5)

Archlinux 網站上的 dhclient.conf(5)

Archlinux 網站上的 networkmanager.conf(5)

AWS 官方已更新 2 個月前