23.2. 使用 NetworkManager 中的 systemd-resolved 将对特定域的 DNS 请求发送到所选的 DNS 服务器
您可以将 NetworkManager 配置为启动 systemd-resolved
的实例。然后,这个 DNS stub 解析器监听 IP 地址 127.0.0.53
上的端口 53
。因此,这个 stub 解析器只能从本地系统访问,而不可从网络访问。
使用这个配置,NetworkManager 将 nameserver 127.0.0.53
条目添加到 /etc/resolv.conf
文件中,systemd-resolved
将 DNS 请求动态路由到 NetworkManager 连接配置文件中指定的相应的 DNS 服务器。
systemd-resolved
服务仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。
如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。
对于支持的解决方案,请参阅 在 NetworkManager 中使用 dnsmasq 将对特定域的 DNS 请求发送到所选的 DNS 服务器。
先决条件
- 系统配置了多个网络管理器连接。
为负责解析特定域的连接配置 DNS 服务器和搜索域。
例如:要确保 VPN 连接中指定的 DNS 服务器解析对
example.com
域的查询,必须有以下设置:-
可以解析
example.com
的 DNS 服务器。DHCP 服务器可以动态提供此信息,或者在 VPN 连接配置文件中设置ipv4.dns
和ipv6.dns
参数。 -
搜索域设置为
example.com
。DHCP 服务器可以动态提供此信息,或者在 VPN 连接配置文件中设置ipv4.dns-search
和ipv6.dns-search
参数。
-
可以解析
流程
安装
systemd-resolved
软件包:dnf install systemd-resolved
# dnf install systemd-resolved
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
systemd-resolved
服务:systemctl --now enable systemd-resolved
# systemctl --now enable systemd-resolved
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/NetworkManager/NetworkManager.conf
文件,并在[main]
部分中设置以下条目:dns=systemd-resolved
dns=systemd-resolved
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
NetworkManager
服务:systemctl reload NetworkManager
# systemctl reload NetworkManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示
systemd-resolved
使用的 DNS 服务器,以及服务对哪个域使用不同的 DNS 服务器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出确认
systemd-resolved
为example.com
域使用不同的 DNS 服务器。使用
tcpdump
数据包嗅探器来验证 DNS 请求的正确路由:安装
tcpdump
软件包:yum install tcpdump
# yum install tcpdump
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在一个终端上,启动
tcpdump
以捕获所有接口上的 DNS 流量:tcpdump -i any port 53
# tcpdump -i any port 53
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在另一个终端上,为存在异常的域解析主机名,为另一个域解析主机名,例如:
host -t A www.example.com host -t A www.redhat.com
# host -t A www.example.com # host -t A www.redhat.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
tcpdump
输出中验证 Red Hat Enterprise Linux 是否只向指定的 DNS 服务器并通过相应的接口发送对example.com
域的 DNS 查询:... 13:52:42.234533 IP server.43534 > 198.51.100.7.domain: 50121+ [1au] A? www.example.com. (33) ... 13:52:57.753235 IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33) ...
... 13:52:42.234533 IP server.43534 > 198.51.100.7.domain: 50121+ [1au] A? www.example.com. (33) ... 13:52:57.753235 IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33) ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Red Hat Enterprise Linux 将对
www.example.com
的 DNS 查询发送到198.51.100.7
上的 DNS 服务器,将对www.redhat.com
的查询发送到192.0.2.1
。
故障排除
验证
/etc/resolv.conf
文件中的nameserver
条目是否指向127.0.0.53
:cat /etc/resolv.conf nameserver 127.0.0.53
# cat /etc/resolv.conf nameserver 127.0.0.53
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果缺少条目,请检查
/etc/NetworkManager/NetworkManager.conf
文件中的dns
参数。验证
systemd-resolved
服务是否监听本地 IP 地址127.0.0.53
上的端口53
:ss -tulpn | grep "127.0.0.53"
# ss -tulpn | grep "127.0.0.53" udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=1050,fd=12)) tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=1050,fd=13))
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务没有侦听
127.0.0.53:53
,请检查systemd-resolved
服务是否在运行。