我的私有 Amazon EC2 实例正在运行 Amazon Linux、Ubuntu 或 RHEL。如何为 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 文件。当您重新启动实例时,原来通过手动修改 resolv.conf 文件加入的自定义 DNS 服务器地址将丢失。您用来解决这个问题的方法取决于您的 Linux 发行版。有关 VPC 和 DNS 服务器的更多信息,请参阅 Amazon VPC 中的 DHCP 选项集

解决方法

**重要信息:**在更改 EC2 实例之前,请使用亚马逊机器映像(AMI)或 Amazon Elastic Block Store (Amazon EBS) 快照创建备份。更改实例的网络配置可能会导致该实例无法访问。

Amazon Linux 2023

Amazon Linux 2023 使用 systemd-resolved。想要了解更多信息,请参阅 archlinux.org 网站上的 resolved.conf(5)

配置解析器

编辑 /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=~.

**注意:**在根据 resolved.conf(5) 手册设置 Domains=~. 时,请记住以下几点:

  • 如果未设置 Domains=~. 选项,则 systemd-resolved 可能会使用在每个链接配置中设置的每个链接 DNS 服务器。
  • 对于每个链接配置中指定的更具体的搜索域名匹配的域名的查询,Domains=~. 选项对其不产生影响。域名仍然使用各自的每个链接 DNS 服务器进行解析。

有关每个链接配置的更多信息,请参阅 archlinux.org 网站上的 systemd-networkd#network 文件

更改 /etc/resolv.conf 指向的位置

默认情况下,/etc/resolv.conf 指向本地主机存根解析器。要更改此设置,请使用不同的内容重新创建该配置文件,或者将其指向本地主机存根解析器以外的其他地方。例如,您可以将其指向 /run/systemd/resolve/resolv.conf,它包含 systemd-resolved 使用的服务器的扁平化列表。

您可以使用 resolvectl status 命令测试您的配置,例如,输入 resolvectl query amazonaws.com 并查看输出。

Amazon Linux、Amazon Linux 2

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

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

选项 1:

1.    编辑或创建 /etc/dhhcp/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 命令的更多信息,请参阅 Linux man 手册的 dhclient.conf(5)

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/dhhcp/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 命令的更多信息,请参阅 Linux 手册页上的 dhclient.conf(5)

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

这两个条件中的任何一个都表明对 Ubuntu 18.04 的默认配置进行了自定义操作。

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

1.    Netplan 通常将配置文件存储在 /etc/netplan 目录中。创建一个名为 /etc/netplan/99-custom-dns.yaml 的文件,然后输入以下内容。请务必将预留位 DNS 服务器 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 generate

完成这些更改后,您仍然可以在 /etc/resolv.conf 中看到存根解析器 IP。这是预料之中的。对于您的操作系统,存根解析器 IP 是本地地址。在后台,存根解析器使用您在之前的 99-custom-dns.yaml 文件中指定的 DNS 服务器。

3.    重启实例。

4.    运行 systemd-resolve 命令,确认系统已正确选择了预设的 DNS 服务器 IP 地址:

systemd-resolve --status

RHEL 7.5

默认情况下,由 NetworkManager 服务管理 resolv.conf 文件。然后,该服务会通过 DHCP 提供的 DNS 服务器填充此文件。请禁止 NetworkManager 管理 resolv.conf 文件,这样 resolv.conf 文件就会忽略由 DHCP 提供的 DNS 服务器。

选项 1:

1.    编辑或创建 /etc/dhhcp/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 命令的更多信息,请参阅 Linux 手册页上的 dhclient.conf(5)

3.    在每个接口配置文件 (/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 文件中输入信息。

相关信息

networkmanager.conf(5)(Linux 手册页)

AWS 官方
AWS 官方已更新 1 年前