第 23 章 在不同域中使用不同的 DNS 服务器
默认情况下,Red Hat Enterprise Linux (RHEL)将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,RHEL 会尝试此文件中的下一个服务器,直到找到一个正常工作的为止。在一个 DNS 服务器无法解析所有域的环境中,管理员可将 RHEL 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。
例如,您要将服务器连接到虚拟专用网络(VPN),VPN 中的主机使用 example.com 域。在这种情况下,您可以以下方式配置 RHEL ,以处理 DNS 查询:
-
仅将
example.com的 DNS 请求发送到 VPN 网络中的 DNS 服务器。 - 将所有其他请求发送到使用默认网关在连接配置文件中配置的 DNS 服务器。
您可以将 NetworkManager 配置为启动 dnsmasq 的实例。然后,此 DNS 缓存服务器侦听 loopback 设备上的端口 53。因此,该服务只能从本地系统访问,而不可从网络访问。
使用这个配置,NetworkManager 将 nameserver 127.0.0.1 条目添加到 /etc/resolv.conf 文件中,dnsmasq 会动态将 DNS 请求路由 NetworkManager 连接配置文件中指定的相应的 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参数。
-
可以解析
-
dnsmasq服务没有运行,或配置为在与localhost不同的接口上侦听。
流程
安装
dnsmasq软件包:yum install dnsmasq
# yum install dnsmasqCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/NetworkManager/NetworkManager.conf文件,并在[main]部分中设置以下条目:dns=dnsmasq
dns=dnsmasqCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
NetworkManager服务:systemctl reload NetworkManager
# systemctl reload NetworkManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在
NetworkManager单元的systemd日志中搜索服务使用不同的 DNS 服务器的域:journalctl -xeu NetworkManager
# journalctl -xeu NetworkManager ... Jun 02 13:30:17 <client_hostname>_ dnsmasq[5298]: using nameserver 198.51.100.7#53 for domain example.com ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
tcpdump数据包嗅探器来验证 DNS 请求的正确路由:安装
tcpdump软件包:yum install tcpdump
# yum install tcpdumpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在一个终端上,启动
tcpdump以捕获所有接口上的 DNS 流量:tcpdump -i any port 53
# tcpdump -i any port 53Copy 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.comCopy 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.1:cat /etc/resolv.conf nameserver 127.0.0.1
# cat /etc/resolv.conf nameserver 127.0.0.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果缺少条目,请检查
/etc/NetworkManager/NetworkManager.conf文件中的dns参数。验证
dnsmasq服务是否侦听loopback设备上的端口53:ss -tulpn | grep "127.0.0.1:53"
# ss -tulpn | grep "127.0.0.1:53" udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:* users:(("dnsmasq",pid=7340,fd=18)) tcp LISTEN 0 32 127.0.0.1:53 0.0.0.0:* users:(("dnsmasq",pid=7340,fd=19))Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务没有侦听
127.0.0.1:53,请检查NetworkManager单元的日志条目:journalctl -u NetworkManager
# journalctl -u NetworkManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow