第 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 服务器。

23.1. 在 NetworkManager 中使用 dnsmasq 将特定域的 DNS 请求发送到所选的 DNS 服务器

您可以将 NetworkManager 配置为启动一个 dnsmasq 实例。然后,此 DNS 缓存服务器侦听 loopback 设备上的端口 53。因此,该服务只能从本地系统访问,而不可从网络访问。

使用这个配置,NetworkManager 将 nameserver 127.0.0.1 条目添加到 /etc/resolv.conf 文件中,dnsmasq 会动态将 DNS 请求路由到 NetworkManager 连接配置文件中指定的对应 DNS 服务器。

先决条件

  • 系统配置了多个网络管理器连接。
  • 在负责解析特定域的 NetworkManager 连接配置文件中配置 DNS 服务器和搜索域。

    例如,要确保 VPN 连接中指定的 DNS 服务器解析 example.com 域的查询,VPN 连接配置文件必须包含以下设置:

    • 可以解析 example.com的 DNS 服务器
    • ipv4.dns-searchipv6.dns-search 参数中将搜索域设置为 example.com
  • dnsmasq 服务没有运行或配置为侦听除 localhost 之外的不同的接口。

步骤

  1. 安装 dnsmasq 软件包:

    # dnf install dnsmasq
  2. 编辑 /etc/NetworkManager/NetworkManager.conf 文件,并在 [main] 部分中设置以下条目:

    dns=dnsmasq
  3. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager

验证

  1. NetworkManager 单元的 systemd 日志中搜索服务使用不同的 DNS 服务器的域:

    # journalctl -xeu NetworkManager
    ...
    Jun 02 13:30:17 client_hostname dnsmasq[5298]: using nameserver 198.51.100.7#53 for domain example.com
    ...
  2. 使用 tcpdump 数据包嗅探器验证 DNS 请求的正确路由:

    1. 安装 tcpdump 软件包:

      # dnf install tcpdump
    2. 在一个终端上,启动 tcpdump 以捕获所有接口上的 DNS 流量:

      # tcpdump -i any port 53
    3. 在另一个终端上,解析存在异常的域的主机名,以及另一个域,例如:

      # host -t A www.example.com
      # host -t A www.redhat.com
    4. tcpdump 输出中验证 Red Hat Enterprise Linux 只向指定的 DNS 服务器并通过对应的接口发送对 example.com 域的 DNS 查询:

      ...
      13:52:42.234533 tun0   Out IP server.43534 > 198.51.100.7.domain: 50121+ A? www.example.com. (33)
      ...
      13:52:57.753235 enp1s0 Out IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33)
      ...

      Red Hat Enterprise Linux 将 www.example.com 的 DNS 查询发送到 198.51.100.7 上的 DNS 服务器,并将 www.redhat.com 的查询发送到 192.0.2.1

故障排除

  1. 验证 /etc/resolv.conf 文件中的 nameserver 条目是否指向 127.0.0.1

    # cat /etc/resolv.conf
    nameserver 127.0.0.1

    如果缺少该条目,请检查 /etc/NetworkManager/NetworkManager.conf 文件中的 dns 参数。

  2. 验证 dnsmasq 服务是否侦听 loopback 设备上的端口 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))

    如果服务没有侦听 127.0.0.1:53,请检查 NetworkManager 单元的日志条目:

    # journalctl -u NetworkManager