学习 Linux 101:配置客户端 DNS

概述

在本教程中,学习在 Linux 客户端系统上配置域名系统 (DNS)。学习:

  • 查询远程 DNS 服务器。
  • 配置本地名称解析并使用远程 DNS 服务器。
  • 修改名称解析的顺序。
  • 调试与名称解析相关的错误。
  • 注意 systemd-resolved。

域名系统

域名系统 (DNS) 是一种去中心化的分层系统,用于管理与连接到互联网的计算机关联的名称。DNS 的最重要功能是将名称映射到 IP 地址,当然系统也会维护其他信息。权威服务器系统用于管理顶级域。管理员可以在子域上委派权限。因此,该系统既稳健,又具备容错性。本教程重点介绍 DNS 的客户端以及如何与 DNS 服务器进行交互。

本教程将帮助您围绕 Linux 管理员 (LPIC-1) 考试 101 的 109 主题中的 109.4 目标进行应考准备。该目标的权重为 2。本教程反映了 2018 年 10 月 29 日更新的 5.0 版本的目标。

前提条件

要想最充分地利用本系列教程,您应该掌握 Linux 的基本知识,还应该有一个正常工作的 Linux 系统,您可以在这个系统上练习本教程中涵盖的命令。对于本教程,您还需要一个或多个网络连接。有时,不同版本程序的输出格式也有所不同。因此您的结果可能不一定与这里显示的清单和数字完全相同。

本教程中的示例来自 Fedora 33、Slackware 14.2 和 Ubuntu 20.04.1 LTS。

名称

首先,快速回顾一下我们的教程“学习 Linux 101:永久网络配置”中的资料。

Linux 系统有一个名称,称为主机名,此名称在系统(不论是独立系统还是连接到网络的系统)中用于标识该系统。通常,如果系统是网络的一部分,那么将使用相同的主机名来标识该系统。当系统连接到网络或互联网时,它将具有一个更严格的名称,此名称是 DNS 的一部分。DNS 名称由两部分组成:主机名和域名。标准域名 (FQDN) 由主机名、句点和域名组成(例如,myhost.mydomain 或 host99.cybershields.com)。域名通常包含多个由句点分隔的部分(例如,ibm.com 或 lpi.org)。

查询远程 DNS 服务器

使用 host 命令从 DNS 服务器查询信息。清单 1 显示了一些基本示例。注意,cybershields.com 具有 IPv4 地址和邮件服务器记录。在另一端,google.com 同时具有 IPv4 和 IPv6 记录以及多个邮件服务器记录。

清单 1:host 命令的基本用法
[ian@attic5-f33 ~]$ host cybershields.com
cybershields.com has address 192.185.225.101
cybershields.com mail is handled by 0 mail.cybershields.com.
[ian@attic5-f33 ~]$ host ibm.com
ibm.com has address 129.42.38.10
ibm.com mail is handled by 5 mx0a-001b2d01.pphosted.com.
ibm.com mail is handled by 5 mx0b-001b2d01.pphosted.com.
[ian@attic5-f33 ~]$ host google.com
google.com has address 172.217.164.142
google.com has IPv6 address 2607:f8b0:4004:808::200e
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.

您会发现的另一个常见项目是别名,如清单 2 所示。别名允许将多个域名映射到单个地址记录,这可以简化维护名称服务器记录的任务。默认情况下,host 命令将以递归方式追踪别名,直至最终解析出一个或多个结果。在此处显示的示例中,www.cybershields.com 是 cybershields.com 的别名。另一方面,www.lpi.org 不使用别名。最后,ibm.com 域显示了一系列别名,这些别名最终解析为一个 IPv4 地址和两个 IPv6 地址。您可以尝试使用其他常见的子域,例如 mail 或 ftp,例如:
host mail.google.com

清单 2:主机别名
[ian@attic5-f33 ~]$ host www.cybershields.com
www.cybershields.com is an alias for cybershields.com.
cybershields.com has address 192.185.225.101
cybershields.com mail is handled by 0 mail.cybershields.com.
[ian@attic5-f33 ~]$ host www.lpi.org
www.lpi.org has address 65.39.134.165
[ian@attic5-f33 ~]$ host lpi.org
lpi.org has address 65.39.134.165
lpi.org mail is handled by 0 aspmx.l.google.com.
lpi.org mail is handled by 10 aspmx2.googlemail.com.
lpi.org mail is handled by 5 alt2.aspmx.l.google.com.
lpi.org mail is handled by 10 aspmx5.googlemail.com.
lpi.org mail is handled by 10 aspmx3.googlemail.com.
lpi.org mail is handled by 5 alt1.aspmx.l.google.com.
lpi.org mail is handled by 10 aspmx4.googlemail.com.
[ian@attic5-f33 ~]$ host www.ibm.com
www.ibm.com is an alias for www.ibm.com.cs186.net.
www.ibm.com.cs186.net is an alias for outer-ccdn-dual.ibmcom.edgekey.net.
outer-ccdn-dual.ibmcom.edgekey.net is an alias for outer-ccdn-dual.ibmcom.edgekey.net.globalredir.akadns.net.
outer-ccdn-dual.ibmcom.edgekey.net.globalredir.akadns.net is an alias for e2874.dscx.akamaiedge.net.
e2874.dscx.akamaiedge.net has address 104.68.247.188
e2874.dscx.akamaiedge.net has IPv6 address 2600:1408:5c00:3a2::b3a
e2874.dscx.akamaiedge.net has IPv6 address 2600:1408:5c00:384::b3a

host 命令有若干选项,包括用于搜索特定记录类型的选项。表 1 显示了您可能会看到的一些常见记录类型。

表 1. 一些常见的 DNS 记录类型
类型 Request For Comments (RFC) 用法
A RFC 1035 IPv4 地址的地址记录。
AAAA RFC 3596 IPv6 地址的地址记录。
CNAME RFC 1035 一个记录到另一个记录的规范名称或别名。查找通常以递归方式继续。
MX RFC 1035 和 RFC 7505 邮件交换。将域名映射到一个或多个邮件传输代理。
PTR RFC 1035 指向 CNAME 的指针。返回 CNAME,不进行递归。
SOA RFC 1035 和 RFC 2308 开始授权。有关 DNS 区域的信息,包括主名称服务器、域管理员的电子邮件、域序列号以及其他信息。
TXT RFC 1035 最初用于人类可读的文本,但现在经常包含机器可读的信息。

使用 host 命令的 -t 选项可仅搜索特定类型的 DNS 记录。清单 3 显示了一些示例。如果未指定类型,将使用默认类型或类型集。对于域名查询,默认设置是搜索 A、AAAA 和 MX 记录。

清单 3:搜索特定 DNS 记录类型
[ian@attic5-f33 ~]$ host -t cname www.cybershields.com
www.cybershields.com is an alias for cybershields.com.
[ian@attic5-f33 ~]$ host -t A www.cybershields.com
www.cybershields.com is an alias for cybershields.com.
cybershields.com has address 192.185.225.101
[ian@attic5-f33 ~]$ host -t MX cybershields.com
cybershields.com mail is handled by 0 mail.cybershields.com.
[ian@attic5-f33 ~]$ host -t AAAA cybershields.com
cybershields.com has no AAAA record
[ian@attic5-f33 ~]$ host -t aaaa www.google.com
www.google.com has IPv6 address 2607:f8b0:4004:814::2004

注意,cybershields.com 没有 AAAA 记录,host 命令报告了这种情况。您可能还会看到一条错误消息,指出未找到域。现在来看清单 4 中显示的示例。

清单 4:host 命令可能返回的不同内容
[ian@attic5-f33 ~]$ # Canonical record found
[ian@attic5-f33 ~]$ host ftp.cybershields.com
ftp.cybershields.com is an alias for cybershields.com.
cybershields.com has address 192.185.225.101
cybershields.com mail is handled by 0 mail.cybershields.com.
[ian@attic5-f33 ~]$ # Specifically requested record type not found
[ian@attic5-f33 ~]$ host -t aaaa cybershields.com
cybershields.com has no AAAA record
[ian@attic5-f33 ~]$ # Domain name not found at all
[ian@attic5-f33 ~]$ host ftp.lpi.org
Host ftp.lpi.org not found: 3(NXDOMAIN)
[ian@attic5-f33 ~]$ # No returned data and no error
[ian@attic5-f33 ~]$ host ftp.ibm.com

这表明 ftp.ibm.com 有某种记录,但不是返回的少数缺省类型之一。添加 -a 选项可以让 host 命令请求所有记录类型,如清单 5 所示。

清单 5:请求主机的所有 DNS 记录
ian@attic5-f33 ~]$ host -a ftp.ibm.com
Trying "ftp.ibm.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32432
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ftp.ibm.com.            IN    ANY

;; ANSWER SECTION:
ftp.ibm.com.        1799    IN    TXT    "atlassian-domain-verification=WAjTH82C5Zx475WLKAA2nrdlsoA/kN0ej9igrLrED4h15KMHPOm+A5H3GndKAxDC"

Received 136 bytes from 127.0.0.53#53 in 101 ms

注意,使用 -a 选项可返回更详细的信息以及 TXT 记录。

如果要查看更多输出,可以使用 -d(调试)或 -v(详细输出)。这两个选项是等效的。清单 6 显示了搜索 lpi.org 时所有输出的示例。

清单 6:详细主机输出
[ian@attic5-f33 ~]$ host -va lpi.org
Trying "lpi.org"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33935
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;lpi.org.            IN    ANY

;; ANSWER SECTION:
lpi.org.        519    IN    TXT    "v=spf1 include:spfa.mailendo.com include:_spf.google.com ip4:69.90.69.224/27 ip4:65.39.134.128/26 ~all"
lpi.org.        519    IN    A    65.39.134.165
lpi.org.        519    IN    NS    dns1.easydns.com.
lpi.org.        519    IN    NS    dns3.easydns.ca.
lpi.org.        519    IN    NS    dns2.easydns.net.
lpi.org.        519    IN    MX    0 aspmx.l.google.com.
lpi.org.        519    IN    MX    10 aspmx4.googlemail.com.
lpi.org.        519    IN    MX    10 aspmx5.googlemail.com.
lpi.org.        519    IN    MX    10 aspmx2.googlemail.com.
lpi.org.        519    IN    MX    10 aspmx3.googlemail.com.
lpi.org.        519    IN    MX    5 alt1.aspmx.l.google.com.
lpi.org.        519    IN    MX    5 alt2.aspmx.l.google.com.
lpi.org.        519    IN    SOA    dns1.easydns.com. zone.easydns.com.1605290523 3600 600 1209600 300

Received 462 bytes from 127.0.0.53#53 in 25 ms

您还可以从 host 命令获得多少信息?参阅联机帮助页或信息页,以了解关于其他几个选项的更多详细信息。

对 host 命令使用特定 DNS 服务器

注意清单 6 的最后一行,其中显示了来自 127.0.0.53#53 的数据。我将在本教程的后面部分讲解该 IP 地址。那是我自己系统上的本地地址,真正的 DNS 信息来自哪里,我当然没有运行完整的本地 DNS 服务器。为了提高速度,DNS 信息在本地进行缓存,并且我系统上的 systemd-resolved 守护程序为 host 命令提供响应。

您可以通过向命令添加相应 IP 地址来指定用于主机查询的名称服务器,如清单 7 所示。

清单 7:对主机搜索使用特定 DNS 服务器
[ian@attic5-f33 ~]$ $ Using Google public DNS
bash: $: command not found...
[ian@attic5-f33 ~]$ # Using Google public DNS
[ian@attic5-f33 ~]$ host -t A lpi.org 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:

lpi.org has address 65.39.134.165
[ian@attic5-f33 ~]$ #using Sprintlink (Public) DNS
[ian@attic5-f33 ~]$ host -t A lpi.org 204.117.214.10
Using domain server:
Name: 204.117.214.10
Address: 204.117.214.10#53
Aliases:

lpi.org has address 65.39.134.165

我的 DNS 信息在哪里

/etc 中有三个与 DNS 名称解析有关的配置文件。

第一个配置文件是 /etc/hosts,这通常是一个很小的文件,在引导期间使用,或用于隔离的网络。此配置文件至少包含本地主机的条目,通常是 localhost 或 localhost.localdomain。我通常在我的家庭网络上添加其他 Linux 系统的条目。

清单 8 显示了我的 Ubuntu 20.03.1 LTS 系统的样本,而清单 9 显示了我的 Slackware 14.2 系统中的文件。

清单 8:Ubuntu 20.04 LTS 上的 /etc/hosts 示例
ian@attic5-u20:~$ cat /etc/hosts
127.0.0.1    localhost
127.0.1.1    attic5-u20
192.168.1.24    attic4

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
清单 9:Slackware 14.2 上的 /etc/hosts 示例
ian@attic4-sl42:~$ cat /etc/hosts
#
# hosts        This file describes a number of hostname-to-address
#        mappings for the TCP/IP subsystem.  It is mostly
#        used at boot time, when no name servers are running.
#        On small systems, this file can be used instead of a
#        "named" name server.  Just add the names, addresses
#        and any aliases to this file...
#
# By the way, Arnt Gulbrandsen <agulbra@nvg.unit.no> says that 127.0.0.1
# should NEVER be named with the name of the machine.  It causes problems
# for some (stupid) programs, irc and reputedly talk.:^)
#

# For loopbacking.
127.0.0.1        localhost
127.0.0.1        attic4-sl42.cybershields.org attic4-sl42
192.168.1.25            attic5

# End of hosts.

第二个配置文件是 /_etc/_resolv.conf。该文件包含至少一个且至多三个名称服务器的条目。该文件还可以将域和服务器记录作为选项。域记录要么来自您的主机名,如果您使用动态主机配置协议 (DHCP) 获得我们的 IP 地址,那么通常是 localdomain。您可能还会看到 lan,如清单 10 所示。如果使用简短的主机名,例如 host99,那么 DNS 搜索还将附加域名。因此它还将搜索 host99.lan

清单 10:Slackware 14.2 上的 /_etc/_resolv.conf 示例
ian@attic4-sl42:~$ cat /etc/resolv.conf
# Generated by dhcpcd from eth0.dhcp
# /etc/resolv.conf.head can replace this line
domain lan
nameserver 192.168.1.1
# /etc/resolv.conf.tail can replace this line

清单 11 展示了我的 Ubuntu 20.04.1 LTS 系统中的 resolv.conf 文件。注意,此文件具有搜索条目,但没有域条目。这两个条目在功能上相似,不同之处在于搜索条目可能包含一列以空格或制表符分隔的域名,这些域名将连续用于添加到简单名称中。域条目仅支持一个这样的名称。

清单 11:Ubuntu 20 上的 /etc/resolv.conf 示例
ian@attic5-u20:~$ cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8).Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved.This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf.To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0 trust-ad
search lan

注意,搜索和域条目指定的域为“lan”。您可以将此名称或 local(不推荐)或 localdomain 视为本地域的名称,尤其是在自动生成的 resolv.conf 文件中,因为这两个文件都是自动生成的。

现在,我将域名 cybershields.com 添加到我的 Ubuntu 系统上的搜索条目中。清单 12 显示了有关搜索或域工作方式的两个示例。Galaxy-A20 是我本地局域网上的智能手机。正如我在前面清单中向您展示的那样,cybershields.com 域具有 MX 记录。

清单 12:域搜索示例
ian@attic5-u20:~$ host Galaxy-A20
Galaxy-A20.lan has address 192.168.1.69
Host Galaxy-A20.lan not found: 3(NXDOMAIN)
Host Galaxy-A20.lan not found: 3(NXDOMAIN)
ian@attic5-u20:~$ host mail
mail.cybershields.com has address 192.185.225.101

使用多个名称服务器

/etc/resolv.conf 中最多可以有三个 nameserver 条目。您指定这些条目的顺序就是其使用顺序。如果找不到第一台服务器,那么会尝试第二台服务器,依此类推。我将为 1.1.1.1 名称服务器添加一个条目以进行说明,如清单 13 所示。回想一下,host 命令的 -v 选项显示哪个名称服务器提供了每条信息。

清单 13:多个名称服务器
ian@attic5-u20:~$ tail -n 4 /etc/resolv.conf
nameserver 1.1.1.1
nameserver 127.0.0.53
options edns0 trust-ad
search lan cybershields.com
ian@attic5-u20:~$ host -v cybershields.com
Trying "cybershields.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52249
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;cybershields.com.        IN    A

;; ANSWER SECTION:
cybershields.com.    13913    IN    A    192.185.225.101

Received 50 bytes from 1.1.1.1#53 in 27 ms
Trying "cybershields.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52643
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;cybershields.com.        IN    AAAA

;; AUTHORITY SECTION:
cybershields.com.    85912    IN    SOA    ns6597.hostgator.com. root.gator3299.hostgator.com.2020110303 86400 7200 3600000 86400

Received 102 bytes from 1.1.1.1#53 in 27 ms
Trying "cybershields.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25553
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;cybershields.com.        IN    MX

;; ANSWER SECTION:
cybershields.com.    13912    IN    MX    0 mail.cybershields.com.

Received 55 bytes from 1.1.1.1#53 in 31 ms

名称服务开关和 /etc/nsswitch.conf

传统上,glibc 库中的名称查找功能是使用诸如 /etc/passwd 或 /etc/hosts 之类的文件来配置的。随着诸如网络信息服务 (NIS) 和域名服务 (DNS) 之类的其他名称服务的出现,需要更好的解决方案。名称服务开关(简称 NSS)功能应运而生,该功能是根据 Sun Microsystems 在 Solaris 2 的 C 库中使用的方法设计的。

清单 14 显示了我的 Slackware 系统中的 /etc/nsswitch.conf 文件。

清单 14:Slackware 的 /etc/nsswitch.conf 文件
ian@attic4-sl42:~$ cat /etc/nsswitch.conf              
#
# /etc/nsswitch.conf
#
# An example Name Service Switch config file.This file should be
# sorted with the most-used services at the beginning.
#
# The entry '[NOTFOUND=return]' means that the search for an
# entry should stop if the search in the previous entry turned
# up nothing.Note that if the search failed due to some other reason
# (like no NIS server responding) then the search continues with the
# next entry.
#
# Legal entries are:
#
#      nisplus or nis+         Use NIS+ (NIS version 3)
#      nis or yp               Use NIS (NIS version 2), also called YP
#      dns                     Use DNS (Domain Name Service)
#      files                   Use the local files
#      [NOTFOUND=return]       Stop searching if not found so far
#

# passwd:      files nis
# shadow:      files nis
# group:       files nis

passwd:      compat
group:       compat

hosts:       files dns
networks:      files

services:       files
protocols:      files
rpc:          files
ethers:       files
netmasks:       files
netgroup:       files
bootparams:     files

automount:      files
aliases:        files

hosts 行指示主机查找将首先使用本地文件,然后使用 DNS。我的 Ubuntu 20 系统中使用了下面的另一个常见条目:
hosts: files mdns4_minimal [NOTFOUND=return] dns

mdns4_minimal 服务是多播 DNS(有关更多详细信息,可参阅 RFC 6762)。此服务在本地域中的本地 LAN 上搜索主机,例如 mylaptop.local。Apple 的 Bonjour 以及 Avahi 使用此服务来发现本地设备,例如打印机或扫描仪。通常,您不希望将搜索到的本地名称发送到公用 DNS 服务器,因此限定条件 [NOTFOUND=return] 导致终止对 .local 名称的搜索,并向请求者返回 not found 指示。

将 getent 与 NSS 结合使用

使用 getent 命令来查询各种名称服务开关 (NSS) 数据源。您指定所需的数据库和密钥。如果未指定密钥,系统会枚举一些数据库,但并非所有数据库都支持。清单 15 显示了一些简单的示例。参阅联机帮助页或信息页以了解允许用于数据库的名称。

清单 15:getent 的基本用法
ian@attic5-u20:~$ getent hosts attic4
192.168.1.24    attic4
ian@attic5-u20:~$ getent services ssh
ssh                   22/tcp
ian@attic5-u20:~$ getent hosts www.google.com
2607:f8b0:4004:810::2004 www.google.com
ian@attic5-u20:~$ getent ahostsv4 www.google.com
172.217.13.68   STREAM www.google.com
172.217.13.68   DGRAM  
172.217.13.68   RAW

您可以指定特定服务或源以与 getent 一起使用。例如,清单 16 显示了如何仅使用我的 Slackware 系统上的“files”或“dns”源来查找两个主机。

清单 16:使用 getent 指定特定服务
ian@attic4-sl42:~$ getent -s files hosts attic5          
192.168.1.25    attic5
ian@attic4-sl42:~$ getent -s dns hosts attic5            
ian@attic4-sl42:~$ getent -s files hosts cybershields.com
ian@attic4-sl42:~$ getent -s dns hosts cybershields.com  
192.185.225.101 cybershields.com

使用 systemd-resolvd

如果您的系统使用 systemd 初始化过程而不是 init,需要注意 DNS 解析中的一些差异。systemd-resolved 服务提供网络名称解析,并实现存根 DNS 解析器。主要配置文件是 /etc/systemd/resolved.conf。参阅联机帮助页或信息页以了解 systemd-resolved 使用的其他源。清单 17 显示了一些命令,可以帮助您确定是使用 systemd 还是 init 以及是否正在运行 systemd-resolved。

清单 17:我在使用 init 还是 systemd?
an@attic4-sl42:~$ head -n 2 /etc/os-release
NAME=Slackware
VERSION="14.2"
ian@attic4-sl42:~$ ps -p 1
  PID TTY          TIME CMD
    1 ?        00:00:02 init
ian@attic4-sl42:~$ # Slackware 42 uses init
ian@attic4-sl42:~$ head -n 2 /etc/os-release
NAME=Slackware
VERSION="14.2"
ian@attic4-sl42:~$ ps -p 1
  PID TTY          TIME CMD
    1 ?        00:00:02 init

ian@attic5-u20:~$ # Ubuntu 20 uses systemd
ian@attic5-u20:~$ head -n 2 /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ian@attic5-u20:~$ ps -p 1
    PID TTY          TIME CMD
      1 ?        00:01:02 systemd
ian@attic5-u20:~$ pidof systemd-resolved
744

前面我提到过,我使用的两个 resolv.conf 示例是自动生成的。清单 11 中的 Ubuntu 示例显示了一个名称服务器值 127.0.0.53,这是 systremd-resolved 创建的存根解析器。相比之下,清单 10 中的 Slackware 示例显示了名称服务器 192.168.1.1,这也是我的路由器。该路由器在同一地址提供 DNS 代理服务。检查我在本教程中使用的 host 命令的示例,以查看哪个服务器正在响应。

毫无疑问,只要重新生成这些文件,我对 /etc/resolv.conf 所做的更改都将被覆盖。如果您使用的是 systemd-resolved,可以在 /etc/systemd/resolved.conf 中进行持久性更改;如果您的 resolv.conf 文件是由 dhcp 生成的,可以在 /etc/dhclient.conf 中进行持久性更改。注意,可能有一个 /etc/dhclient.conf.example 文件,其中包含可以设置或更改的内容的示例。

使用 resolvectl status 命令查找您的 systemd-resolved DNS 存根解析器正在上游使用的实际 DNS 服务器。清单 18 显示了部分输出示例。

清单 18:resolvectl 状态的部分输出
ian@attic5-u20:~$ resolvectl status | tail -n 13
Link 2 (enp9s0)
      Current Scopes: DNS                                    
DefaultRoute setting: yes                                    
       LLMNR setting: yes                                    
MulticastDNS setting: no                                     
  DNSOverTLS setting: no                                     
      DNSSEC setting: no                                     
    DNSSEC supported: no                                     
  Current DNS Server: 192.168.1.1                            
         DNS Servers: 192.168.1.1                            
                      2603:6081:1902:7ddb:24f7:f0ff:fe02:30df
          DNS Domain: ~.                                     
                      lan

关于 systemd-resolved,最后再提示一次,可尝试清单 16 中所示的示例,看看会发生什么。是您期望的结果吗?考虑存根解析器在哪个主机上运行以及如何获取其配置信息。

调试名称解析错误

大多数 DNS 解析错误的原因是 DNS 服务器配置错误导致未找到主机或域。调试的第一步是使用有关已知的主机名运行 host 命令,看看会发生什么。清单 20 显示了一个示例,其中我更改了 resolv.conf 文件,使其不包含任何有效的 DNS 名称服务器条目。

清单 19:没有任何有效的名称服务器
ian@attic5-u20:~$ tail -n 4 /etc/resolv.conf
nameserver 192.168.1.24
# nameserver 127.0.0.53
options edns0 trust-ad
search lan
ian@attic5-u20:~$ host ibm.com
;; connection timed out; no servers could be reached

现在,您知道要检查的主要配置文件和一些有用的命令。

DNS 调试中经常使用的另一个命令是 dig 命令。这个命令非常灵活,默认情况下提供的输出更像是 host 命令的详细输出。dig 的典型调用形式为:

dig @服务名称类型

注意要使用的可选 DNS 服务器名称前面的“@”符号。您可以指定要查找的类型,例如 A、AAAA 或 MX。默认查找类型是 A 或 IPv4 地址。除非需要消除其他选项的歧义,否则 -t 选项是可选的。清单 20 显示了两个简单的示例,首先使用默认名称服务器搜索 lpi.org 的默认 A 记录,然后使用特定名称服务器搜索 google.com 的 AAAA (IPv6) 记录。

清单 20:dig 命令用法示例
ian@attic5-u20:~$ dig lpi.org

; <<>> DiG 9.16.1-Ubuntu <<>> lpi.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18932
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;lpi.org.            IN    A

;; ANSWER SECTION:
lpi.org.        287    IN    A    65.39.134.165

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Nov 29 13:33:09 EST 2020
;; MSG SIZE  rcvd: 52

ian@attic5-u20:~$ dig @8.8.8.8 google.com aaaa

; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.8.8 google.com aaaa
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50553
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN    AAAA

;; ANSWER SECTION:
google.com.        299    IN    AAAA    2607:f8b0:4004:82a::200e

;; Query time: 16 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Nov 29 13:33:35 EST 2020
;; MSG SIZE  rcvd: 67

与以“-”开头的几个命令选项相似,dig也具有以“+”开头的若干查询选项。通常可以打开或关闭这些查询选项。例如,+trace 可跟踪来自根名称服务器的委派路径,查找要搜索的名称,而默认的 +notrace 则不会执行此操作。

hostdig 类似的另一个命令是 nslookup 命令,您可能希望了解这条命令。虽然本主题的 LPI 目标不涉及这条命令,但会经常使用这条命令。

在宾馆之类的场所,经常出现的一种 DNS 查找情况是需要提供某种身份验证才允许使用 wifi 服务。实现的方式通常是劫持您的第一个浏览器查询并将其重定向到门户网站或登录站点的代码。如果您配置了自己的 DNS 服务器,而不是允许 DHCP 系统提供 DNS 服务器,可能无法使用 wifi 服务,因为您绝对无法访问登录页面。在这种情况下,您必须至少临时更改 wifi 配置,以使用 DHCP 服务器提供的 DNS 服务器。

某些互联网服务提供商 (ISP) 会试图将失败的互联网域请求重定向到可能发布广告或提供某种形式的替代帮助的页面,而这可能会引起相关问题。如果您有家庭或小型办公室路由器,可以通过将路由器配置为使用公用 DNS 服务器(例如 1.1.1.1 或 8.8.8.8)来避免此问题。

结束语

对“主题 109.4:配置客户端 DNS”的介绍至此结束。

资源

本文翻译自:Learn Linux 101: Configure client-side DNS(2020-12-04)