如何为 EC2 实例分配一个重启时仍然存在的静态 DNS 服务器?
我想为 Amazon Elastic Compute Cloud (Amazon EC2) 实例配置一个重启时仍然存在的静态 DNS 服务器。
解决方法
默认情况下,与 Amazon Virtual Private Cloud (Amazon VPC) 关联的 EC2 实例在启动时会请求 DNS 服务器地址。动态主机配置协议 (DHCP) 将发送请求,然后 Amazon 会将包含 DNS 服务器地址的 DHCP 响应写入本地 /etc/resolv.conf 文件。
重启实例时,对包含自定义 DNS 服务器地址的 resolv.conf 文件的手动修改将会丢失。要在重启实例时保留静态 DNS 服务器设置,请根据您的 Linux 发行版更新配置。
**重要事项:**在更改实例之前,使用亚马逊机器映像 (AMI) 创建备份。或者,使用 Amazon Elastic Block Store (Amazon EBS) 快照创建备份。更改某个实例的联网配置时,该实例可能会无法访问。
AL2023
Amazon Linux 2023 (AL2023) 使用 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 使用的服务器的扁平化列表。
使用本地 DNS 缓存时的配置文件状态示例:
### Default Symbolic link status : point to stub-resolv.conf ### Flow: DNS query => Local Cache DNS 127.0.0.53 ( systemd-resolved ) => External DNS # ls -al /etc/resolv.conf lrwxrwxrwx 1 root root 39 Mar 5 02:28 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf # cat /etc/resolv.conf nameserver 127.0.0.53 options edns0 trust-ad search . ### 127.0.0.53 is used for systemd-resolved ( local cache dns ) # lsof -nP -p `pidof systemd-resolved` |grep TCP systemd-r 339 systemd-resolve 14u IPv4 2753 0t0 TCP 127.0.0.53:53 (LISTEN)
不使用本地 DNS 缓存时的配置文件状态示例:
### Changed Symbolic link status : point to /run/systemd/resolve/resolv.conf # cat /run/systemd/resolve/resolv.conf nameserver 1.1.1.1 nameserver 1.0.0.1 search . # ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf # ls -al /etc/resolv.conf lrwxrwxrwx 1 root root 34 Apr 1 16:05 /etc/resolv.conf -> ../run/systemd/resolve/resolv.conf
要测试您的配置,请运行以下命令:
# resolvectl status
# resolvectl query amazonaws.com
示例输出:
# resolvectl status Global Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: uplink DNS Servers 8.8.8.8 8.8.4.4 DNS Domain ~. Link 2 (ens5) Current Scopes: DNS Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported DNS Servers: 10.2.0.2 DNS Domain: ap-northeast-2.compute.internal
# resolvectl query amazonaws.com amazonaws.com: 207.171.166.22 -- link: ens5 72.21.206.80 -- link: ens5 72.21.210.29 -- link: ens5 -- Information acquired via protocol DNS in 3.0ms. -- Data is authenticated: no; Data was acquired via local or encrypted transport: no -- Data from: cache
AL1 或 AL2
要配置您的 Amazon Linux 1 (AL1) 或 Amazon Linux 2 (AL2) 实例,请更新 etc/dhcp/dhclient.conf 文件或 ifcfg-eth0.conf 文件。如果同时配置这两个文件,则会优先使用您在 ifcfg-eth0.conf 文件中指定的 DNS 服务器。
**先决条件:**请将 ifcfg-eth0.conf 文件中的 PEERDNS 参数值设置为 yes。将 PEERDNS 参数设置为 no 时,Amazon EC2 将忽略在 ifcfg-* 文件中指定的或 DHCP 提供的 DNS 服务器。
更新 /etc/dhcp/dhclient.conf 文件
完成以下步骤:
- 打开现有的 /etc/dhcp/dhclient.conf 文件。或者,创建新文件。
**注意:**您必须拥有根用户权限才能编辑此文件。要么使用 sudo -i 成为根用户,要么使用 sudo 来执行所有命令。 - 要覆盖 domain-name-servers,请在文件中添加以下 supersede 命令:
**注意:**请将 000.000.000.000 替换为您希望实例使用的一个或多个 DNS 服务器的 IP 地址。supersede domain-name-servers 000.000.000.000, 000.000.000.000; - 在您的 per-interface 配置文件(例如 /etc/sysconfig/network-scripts/ifcfg-*)中,将 PEERDNS 参数设置为 yes。
- 重启 EC2 实例。resolv.conf 文件会在实例重启时更新,仅包含在 dhclient 文件中指定的 DNS 服务器。
更新 ifcfj-eth0 文件
完成以下步骤:
-
要覆盖 /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 或 Red Hat Enterprise Linux (RHEL) 7.5,则您也可以使用上述解决步骤。
Ubuntu 18.04、20.04 和 22.04
对于 Ubuntu 18.04,netplan.io 软件包管理网络接口配置,而 systemd-resolved 服务使用存根解析器来管理 DNS 查询。存根解析器 IP 地址位于 /etc/resolv.conf 文件中,该文件是指向 /run/systemd/resolve/stub-resolv.conf 文件的符号链接。如果 /etc/resolv.conf 文件具有以下配置,则 /etc/dhcp/dhclient.conf 中的 supersede 语句可能无法按预期运行:
- 该文件不是实例上的符号链接。
- 该文件是指向另一个文件(例如 /run/systemd/resolve/resolv.conf)的符号链接。
要覆盖 DNS 服务器值,请完成以下步骤:
-
使用以下数据创建一个名为 /etc/netplan/99-custom-dns.yaml 的文件:
### Create Customer DNS config # 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 ### Required File Permission # chmod 600 /etc/netplan/99-custom-dns.yaml ### Checking Netplan Configuration status # netplan get network: version: 2 ethernets: ens5: match: macaddress: "0a:e5:a1:40:a2:f5" nameservers: addresses: - 1.1.1.1 - 1.0.0.1 dhcp4: true dhcp4-overrides: use-dns: false use-domains: false dhcp6: false set-name: "ens5"**注意:**请将 1.1.1.1, 1.0.0.1 替换为您的 DNS 服务器 IP 地址。Netplan 会将配置文件存储在 /etc/netplan 目录中。上述示例使用 ens5 接口。确保接口名称与您的接口一致。要查看您的接口名称,请运行以下命令:
# ip a输出示例:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000 link/ether 0a:e5:a1:40:a2:f5 brd ff:ff:ff:ff:ff:ff inet 172.31.35.233/20 metric 100 brd 172.31.47.255 scope global dynamic ens5 valid_lft 2828sec preferred_lft 2828sec inet6 fe80::8e5:a1ff:fe40:a2f5/64 scope link valid_lft forever preferred_lft forever -
要将 Netplan YAML 文件转换为配置文件,请运行以下 netplan 命令:
# netplan generate # netplan try # netplan apply注意:您可能会收到“WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running”(警告:root:无法调用 Open vSwitch:ovsdb-server.service 未运行)消息。您可以忽略此消息并继续执行下一步。如果您不想看到警告消息,请安装带 DPDK 包的 Open vSwitch。存根解析器 IP 地址现在位于 /etc/resolv.conf 中。这是预期行为,因为存根解析器 IP 地址是您的操作系统 (OS) 上的本地地址。在后台,存根解析器使用在 99-custom-dns.yaml 文件中指定的 DNS 服务器。
-
重启实例。
-
要确认系统正确使用了预设的 DNS 服务器 IP 地址,请根据您的 Ubuntu 版本运行以下命令:
Ubuntu 18.04:systemd-resolve --statusUbuntu 20.04 和 22.04:
resolvectl status
RHEL 7.5
默认情况下,NetworkManager 服务会管理 RHEL 发行版的 resolv.conf 文件。然后,该服务会通过 DHCP 提供的 DNS 服务器填充此文件。要使用自定义 DNS 服务器,请在 resolv.conf 文件中阻止 NetworkManager,以便 resolv.conf 文件忽略 DHCP 提供的 DNS 服务器。
完成“AL1 或 AL2”下的“更新 /etc/dhcp/dhclient.conf 文件”的步骤。或者,使用以下内容创建 /etc/NetworkManager/conf.d/90-dns-none.conf 文件:
[main] dns=none
重启实例,然后手动创建 /etc/resolv.conf 文件。
相关信息
DHCP option sets in Amazon VPC
Archlinux 网站上的 network files
Archlinux 网站上的 resolved.conf(5)
Archlinux 网站上的 dhclient.conf(5)
Archlinux 网站上的 networkmanager.conf(5)

