跳至内容

如何为 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 发行版更新配置。

**重要事项:**在更改实例之前,使用亚马逊机器映像 (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=~.

或者,创建一个 Drop-in 配置。例如,使用 /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 不会使用在 per-link 配置中设置的 per-link DNS 服务器。对于与您在 per-link 配置中指定的特定搜索域匹配的域名的查询,Domains=~. 选项对其不产生影响。域名解析时,会使用其 per-link 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-* 文件中指定的或 DHCP 提供的 DNS 服务器。

更新 /etc/dhcp/dhclient.conf 文件

完成以下步骤:

  1. 打开现有的 /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 服务器值,请在 per-interface 配置文件中指定自定义 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

    注意:您可能会收到“WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running”(警告: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 文件。

相关信息

DHCP option sets in Amazon VPC

Archlinux 网站上的 network files

Archlinux 网站上的 resolved.conf(5)

Archlinux 网站上的 dhclient.conf(5)

Archlinux 网站上的 networkmanager.conf(5)

AWS 官方已更新 1 年前