如何为重启时仍然存在的 Amazon EC2 实例分配静态 DNS 服务器?
我想配置一个 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
完成以下步骤:
- 编辑或创建 /etc/dhcp/dhclient.conf 文件。
**注意:**必须拥有根用户权限才能编辑此文件。要么使用 sudo -i 成为根目录,要么使用 sudo 来实现所有命令。 - 在文件中添加 supersede 命令以覆盖 domain-name-servers。在以下示例命令中,将 xxx.xxx.xxx.xxx 替换为希望实例使用的 DNS 服务器的 IP 地址:
完成上述修改后,resolv.conf 文件会在实例重启时更新,仅包含在 dhclient 文件中指定的 DNS 服务器。supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;
- 在 per-interface 配置文件(/etc/sysconfig/network-scripts/ifcfg-*)中,将 PEERDNS 参数都设置为 yes。
- 重启 EC2 实例。
选项 2
完成以下步骤:
-
要覆盖 /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
-
在 per-interface 配置文件(/etc/sysconfig/network-scripts/ifcfg-*)中,将 PEERDNS 参数都设置为 yes。
Ubuntu 16.04
完成以下步骤:
- 编辑或创建 /etc/dhcp/dhclient.conf 文件。
**注意:**必须拥有根用户权限才能编辑此文件。要么使用 sudo -i 成为根目录,要么使用 sudo 来实现所有命令。 - 在文件中添加 supersede 命令以覆盖 domain-name-servers。在以下示例命令中,将 xxx.xxx.xxx.xxx 替换为希望实例使用的 DNS 服务器的 IP 地址:
在此修改之后,resolv.conf 文件会在实例重启时更新,仅包含在 dhclient 文件中指定的 DNS 服务器。supersede domain-name-servers xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx;
- 重启实例。
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 服务器值,请完成以下步骤:
- Netplan 将配置文件存储在 /etc/netplan 目录中。创建一个名为 /etc/netplan/99-custom-dns.yaml 的文件,然后在文件中输入以下行。将示例 DNS 服务器 IP 地址替换为您的 IP 地址:
**注意:**在前面的示例代码中,接口指定为 ens5。请确保接口名称与您设置的接口名称一致。要查看接口名称,请运行 ip a 命令。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
- 要将 Netplan YAML 文件转换为配置文件,请运行以下 netplan 命令:
现在,可以在 /etc/resolv.conf 中找到存根解析器的 IP 地址。这是预料之中的。存根解析器 IP 地址是您的操作系统上的本地地址。在后台,存根解析器使用在 99-custom-dns.yaml 文件中指定的 DNS 服务器。netplan generate
- 重启实例。
- 要确认系统已正确选择了预设的 DNS 服务器 IP 地址,运行 systemd-resolve 命令:
systemd-resolve --status
RHEL 7.5
默认情况下,由 NetworkManager 服务管理 resolv.conf 文件。然后,该服务会通过 DHCP 提供的 DNS 服务器填充此文件。不要允许 NetworkManager 管理 resolv.conf 文件,因为这样 resolv.conf 文件会忽略 DHCP 提供的 DNS 服务器。
选项 1
完成以下步骤:
- 编辑或创建 /etc/dhcp/dhclient.conf 文件。
**注意:**必须拥有根用户权限才能编辑此文件。要么使用 sudo -i 成为根目录,要么使用 sudo 来实现所有命令。 - 在文件中添加 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 服务器。 - 在 per-interface 配置文件(/etc/sysconfig/network-scripts/ifcfg-*)中,将 PEERDNS 参数都设置为 yes。
- 重启实例。
选项 2
完成以下步骤:
-
使用以下内容创建 /etc/NetworkManager/conf.d/90-dns-none.conf 文件:
[main] dns=none
-
重启实例,然后手动创建 /etc/resolv.conf 文件。
相关信息
Archlinux 网站上的 2.1 网络文件
Archlinux 网站上的 resolved.conf(5)
Archlinux 网站上的 dhclient.conf(5)
Archlinux 网站上的 networkmanager.conf(5)
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前