如何为重启时仍然存在的 Amazon EC2 实例分配静态 DNS 服务器?

3 分钟阅读
0

我想配置一个 Amazon Elastic Compute Cloud(Amazon EC2)实例,这个实例需要有一个能在重启时仍然存在的静态 DNS 服务器。

简短描述

默认情况下,与 Amazon Virtual Private Cloud(Amazon VPC)关联的 Amazon EC2 实例在启动时会请求 DNS 服务器地址。动态主机配置协议(DHCP)发送请求。DHCP 响应返回 DNS 服务器地址,写入本地 etc/resolv.conf 文件。

重新启动实例时,对包含自定义 DNS 服务器地址的 resolv.conf 文件的手动修改将会丢失。要在重启实例时维护静态 DNS 服务器,请根据 Linux 发行版完成以下操作之一。

解决方法

**重要事项:**在更改实例之前,使用亚马逊机器映像(AMI)创建备份。或者,使用 Amazon Elastic Block Store(Amazon EBS)快照来创建备份。更改某个实例的联网配置时,该实例可能会无法访问。

Amazon Linux 2023

Amazon Linux 2023 使用 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 使用的服务器的扁平化列表。

要测试配置,请运行 resolvectl status 命令并使用 resolvectl query amazonaws.com。然后,查看输出。

Amazon Linux 或 Amazon Linux 2

使用以下选项之一来配置实例。如果同时应用这两个选项,则 ifcfg-eth0 文件中指定的 DNS 服务器将被优先考虑。

要使其中任一选项起作用,必须将 ifcfg-eth0 文件中的 PEERDNS 参数值设置为 yes。将 PEERDNS 参数设置为 no 时,在 ifcfg-* 文件中指定的或 DHCP 提供的 DNS 服务器将被忽略。

选项 1

完成以下步骤:

  1. 编辑或创建 /etc/dhcp/dhclient.conf 文件。
    **注意:**必须拥有根用户权限才能编辑此文件。要么使用 sudo -i 成为根目录,要么使用 sudo 来实现所有命令。
  2. 在文件中添加 supersede 命令以覆盖 domain-name-servers。在以下示例命令中,将 xxx.xxx.xxx.xxx 替换为希望实例使用的 DNS 服务器的 IP 地址:
    supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;
    完成上述修改后,resolv.conf 文件会在实例重启时更新,仅包含在 dhclient 文件中指定的 DNS 服务器。
  3. per-interface 配置文件(/etc/sysconfig/network-scripts/ifcfg-*)中,将 PEERDNS 参数都设置为 yes
  4.  重启 EC2 实例

选项 2

完成以下步骤:

  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

完成以下步骤:

  1. 编辑或创建 /etc/dhcp/dhclient.conf 文件。
    **注意:**必须拥有根用户权限才能编辑此文件。要么使用 sudo -i 成为根目录,要么使用 sudo 来实现所有命令。
  2. 在文件中添加 supersede 命令以覆盖 domain-name-servers。在以下示例命令中,将 xxx.xxx.xxx.xxx 替换为希望实例使用的 DNS 服务器的 IP 地址:
    supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;
    在此修改之后,resolv.conf 文件会在实例重启时更新,仅包含在 dhclient 文件中指定的 DNS 服务器。
  3. 重启实例

Ubuntu 18.04

对于 Ubuntu 18.04,netplan.io 软件包管理网络接口配置,而 systemd-resolved 服务使用存根解析器来管理 DNS 查询。存根解析器 IP 位于 /etc/resolv.conf 中。

反过来,/etc/resolv.conf 文件是 /run/systemd/resolve/stub-resolv.conf 文件的符号链接。如果 /etc/resolv.conf 文件满足以下两个条件中的任何一个,/etc/dhcp/dhclient.conf 中的 supersede 语句可能无法按预期那样运行:

  • 该文件不是实例上的符号链接
  • 该文件是指向其他文件的符号链接。例如,该文件指向 /run/systemd/resolve/resolv.conf

要覆盖 DNS 服务器值,请完成以下步骤:

  1. Netplan 将配置文件存储在 /etc/netplan 目录中。创建一个名为 /etc/netplan/99-custom-dns.yaml 的文件,然后在文件中输入以下行。将示例 DNS 服务器 IP 地址替换为您的 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 YAML 文件转换为配置文件,请运行以下 netplan 命令:
    netplan generate
    现在,可以在 /etc/resolv.conf 中找到存根解析器的 IP 地址。这是预料之中的。存根解析器 IP 地址是您的操作系统上的本地地址。在后台,存根解析器使用在 99-custom-dns.yaml 文件中指定的 DNS 服务器。
  3. 重启实例
  4. 要确认系统已正确选择了预设的 DNS 服务器 IP 地址,运行 systemd-resolve 命令:
    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 命令以覆盖 domain-name-servers。在以下示例命令中,将 xxx.xxx.xxx.xxx 替换为 DNS 服务器的 IP 地址:
    supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;
    或者,可以输入首选服务器以供实例使用。
    在此修改之后,resolv.conf 文件会在实例重启时更新,仅包含在 dhclient 文件中指定的 DNS 服务器。
  3. per-interface 配置文件(/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 文件。

相关信息

Amazon VPC 中的 DHCP 选项集

Archlinux 网站上的 2.1 网络文件

Archlinux 网站上的 resolved.conf(5)

Archlinux 网站上的 dhclient.conf(5)

Archlinux 网站上的 networkmanager.conf(5)

AWS 官方
AWS 官方已更新 10 个月前