我的私有 Amazon EC2 实例运行的是 Amazon Linux、Ubuntu 或 RHEL。如何将静态 DNS 服务器分配给重启期间仍保留的 EC2 实例?

上次更新时间:2020 年 1 月 23 日

如何使用可在重新引导实例时保留的静态 DNS 服务器条目配置 Amazon Elastic Compute Cloud (Amazon EC2) 实例?

简短描述

与 Amazon Virtual Private Cloud (Amazon VPC) 关联的 Amazon EC2 实例的默认行为是使用动态主机配置协议 (DHCP) 在启动时请求 DNS 服务器地址。DHCP 响应中返回的 DNS 服务器地址将写入本地 /etc/resolv.conf 文件。重新启动实例时,对具有自定义 DNS 服务器地址的 resolv.conf 文件的手动修改将丢失。您用于解决此问题的方法取决于您的 Linux 发行版。有关 VPC 和 DNS 服务器的更多信息,请参阅 Amazon DNS 服务器

解决方法

重要提示:更改 Amazon EC2 实例之前,使用 Amazon 系统映像 (AMI) 或 Amazon Elastic Block Store (Amazon EBS) 快照创建备份。更改实例的联网配置可能会导致实例无法访问。

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 文件。

注意:您必须拥有 AWS 账户根用户权限才能编辑此文件。使用 "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 服务器。有关 supersede 命令的更多信息,请参阅 dhclient.conf(5) – Linux 手册页

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 命令添加到文件以覆盖 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 服务器。有关 supersede 命令的更多信息,请参阅 dhclient.conf(5) – Linux 手册页

3.    重启实例。

Ubuntu 18.04

默认情况下,在 Ubuntu 18.04 上,由 netplan.io 软件包处理网络接口配置,且启用系统解析的服务使用存根解析程序处理 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

以上任一条件表明已自定义默认的 Ubuntu 18.04 配置。

运行以下步骤以覆盖 DNS 服务器值:

1.    Netplan 通常将配置文件存储在 /etc/netplan 目录中。创建名为 /etc/netplan/99-custom-dns.yaml 的文件,然后通过以下行填充此文件。请务必将占位符 DNS 服务器 IP 地址替换为首选地址:

network:
    version: 2
    ethernets:
        eth0:         
            nameservers:
                    addresses: [1.2.3.4, 5.6.7.8]
            dhcp4-overrides:
                    use-dns: false

在进行这些更改后,您将仍然可以在 /etc/resolv.conf 中看到存根解析程序 IP。这是正常的。存根解析程序 IP 对于您的操作系统来说是本地的,在后台中,存根解析程序将使用您在前述 99-custom-dns.yaml 文件中指定的 DNS 服务器。

2.    重启实例。

3.    运行 systemd-resolve 命令以确认正在正确提取预期的 DNS 服务器 IP 地址:

systemd-resolve --status

RHEL 7.5

默认情况下,resolv.conf 文件由 NetworkManager 服务管理。然后,该服务会通过 DHCP 提供的 DNS 服务器填充此文件。您可以阻止 NetworkManager 管理 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 服务器。有关 supersede 命令的更多信息,请参阅 dhclient.conf(5) – Linux 手册页

3.    在每个接口的配置文件 (/etc/sysconfig/network-scripts/ifcfg-*) 中将 PEERDNS 参数设置为 yes

4.    重启实例。

选项 2

1.    使用以下内容创建 /etc/NetworkManager/conf.d/disable-resolve.conf-managing.conf 文件:

[main]
dns=none

2.    重启实例,然后手动填充 /etc/resolv.conf 文件。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?