我的私有 Amazon EC2 实例正在运行 Amazon Linux、Ubuntu 或 RHEL。如何为 EC2 实例分配静态 DNS 服务器并使相关配置在实例重启期间仍然存在?
我想为 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 服务器(DNS1 和 DNS2):
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 官方已更新 2 年前
- AWS 官方已更新 9 个月前
- AWS 官方已更新 8 个月前