6.1. 解析器库

术语 解析器 指的不是一个特殊的应用程序,而是解析器库。这是一个可以在标准 C 库中找到的函数集合。中心例程是gethostbyname(2)gethostbyaddr (2),它们查找与主机名关联的所有 IP 地址,反之亦然。它们可以配置为简单地在hosts中查找信息,查询多个 DNS 名称服务器,或使用网络信息服务 (NIS) 的 hosts 数据库。

解析器函数在被调用时读取配置文件。从这些配置文件中,它们确定要查询哪些数据库,按什么顺序查询,以及与您配置环境方式相关的其他细节。较旧的 Linux 标准库 libc 使用/etc/host.conf作为其主配置文件,但 GNU 标准库版本 2 glibc 使用/etc/nsswitch.conf。我们将依次描述每一个,因为两者都很常用。

6.1.1. host.conf 文件

/etc/host.conf告诉较旧的 Linux 标准库解析器函数要使用哪些服务,以及按什么顺序使用。

中的选项host.conf必须出现在单独的行上。字段可以用空格(空格或制表符)分隔。井号 (#) 引入一个注释,该注释延伸到下一个换行符。以下选项可用

order

此选项确定尝试解析服务的顺序。有效选项包括 bind 用于查询名称服务器,hosts用于在/etc/hosts中查找,以及 nis 用于 NIS 查找。可以指定其中任何一个或全部。它们在行中出现的顺序决定了尝试相应服务的顺序。

multi

multi接受 onoff 作为选项。这决定了/etc/hosts中的主机是否可以有多个 IP 地址,这通常被称为“多宿主”。默认值为 off。此标志对 DNS 或 NIS 查询没有影响。

nospoof

正如我们将在 6.2.4 节 中解释的那样,DNS 允许您通过使用 in-addr.arpa 域来查找属于 IP 地址的主机名。名称服务器尝试提供虚假主机名被称为 欺骗。为了防止这种情况,可以配置解析器以检查原始 IP 地址是否实际上与获得的主机名相关联。如果不是,则拒绝该名称并返回错误。通过将 nospoof 设置为 on 来启用此行为。

alert

此选项接受 onoff 作为参数。如果启用此选项,任何欺骗尝试都将导致解析器向 syslog 工具记录消息。

trim

此选项接受一个参数,指定一个域名,该域名将在查找之前从主机名中删除。这对于hosts条目很有用,您可能只想指定不带本地域名的主机名。如果您在此处指定您的本地域名,它将从附加了本地域名的主机的查找中删除,从而允许在/etc/hosts中成功查找。您添加的域名必须以 (.) 字符结尾(例如,linux.org.au.),以便trim正常工作。

trim 选项会累积;您可以将您的主机视为属于多个域。

示例 vlager 的示例文件显示在 示例 6-1 中。

示例 6-1. host.conf 文件示例

# /etc/host.conf
# We have named running, but no NIS (yet)
order   bind,hosts
# Allow multiple addrs
multi   on
# Guard against spoof attempts
nospoof on
# Trim local domain (not really necessary).
trim    vbrew.com.

6.1.1.1. 解析器环境变量

来自host.conf的设置可以使用许多环境变量覆盖

RESOLV_HOST_CONF

此变量指定一个要读取的文件,而不是/etc/host.conf.

RESOLV_SERV_ORDER

此变量覆盖在中给出的 order 选项host.conf。服务以 hostsbindnis 给出,用空格、逗号、冒号或分号分隔。

RESOLV_SPOOF_CHECK

此变量确定针对欺骗采取的措施。它完全被 off 禁用。值 warnwarn off 通过分别打开和关闭日志记录来启用欺骗检查。值 * 启用欺骗检查,但将日志记录工具保留为在中定义的那样host.conf.

RESOLV_MULTI

此变量使用 onoff 的值来覆盖来自host.conf.

multi 选项

RESOLV_OVERRIDE_TRIM_DOMAINShost.conf此变量指定一个修剪域列表,该列表覆盖在中给出的那些域

。当我们讨论 trim 关键字时,已经解释了修剪域。

RESOLV_ADD_TRIM_DOMAINShost.conf.

此变量指定一个修剪域列表,该列表添加到在中给出的那些域

6.1.2. nsswitch.conf 文件host.confGNU 标准库版本 2 包括一个更强大和更灵活的替代旧的机制。名称服务的概念已扩展到包括各种不同类型的信息。查询这些数据库的所有不同功能的配置选项都已放回单个配置文件中;nsswitch.conf

机制。名称服务的概念已扩展到包括各种不同类型的信息。查询这些数据库的所有不同功能的配置选项都已放回单个配置文件中;文件。

中的选项机制。名称服务的概念已扩展到包括各种不同类型的信息。查询这些数据库的所有不同功能的配置选项都已放回单个配置文件中;文件允许系统管理员配置各种不同的数据库。我们将把讨论限制在与主机和网络 IP 地址解析相关的选项上。您可以通过阅读 GNU 标准库文档轻松找到有关其他功能的更多信息。

必须出现在单独的行上。字段可以用空格(空格或制表符)分隔。井号 (#) 引入一个注释,该注释延伸到下一个换行符。每行描述一个特定的服务;主机名解析是其中之一。每行中的第一个字段是数据库的名称,以冒号结尾。与主机地址解析关联的数据库名称是 hosts。一个相关的数据库是 networks,它用于将网络名称解析为网络地址。每行的其余部分存储选项,这些选项决定了执行该数据库查找的方式。

以下选项可用

dns使用域名系统 (DNS) 服务来解析地址。这仅对主机地址解析有意义,对网络地址解析没有意义。此机制使用/etc/resolv.conf

文件,我们将在本章稍后描述该文件。

files/etc/hosts在本地文件中搜索主机或网络名称及其相应的地址。此选项使用传统的/etc/network

文件。

nisnisplus

使用网络信息系统 (NIS) 来解析主机或网络地址。NIS 和 NIS+ 在 第 13 章 中详细讨论。/etc/nsswitch.conf要查询的服务的列出顺序决定了尝试解析名称时查询它们的顺序。查询顺序列表在

中的服务描述中

文件。服务从左到右查询,默认情况下,当解析成功时搜索停止。

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# Information about this file is available in the `libc6-doc' package.

hosts:          dns files
networks:       files

使用较旧的 libc 标准库来模拟我们配置的主机和网络数据库规范的简单示例显示在 示例 6-2 中。/etc/hosts示例 6-2. nsswitch.conf 文件示例此示例使系统首先在域名系统中查找主机,然后在nsswitch.conf

文件中查找,如果 DNS 找不到主机。网络名称查找将仅使用
[ [!] status = action ... ]

/etc/networks

来尝试

您可以使用“操作项”更精确地控制查找行为,这些操作项描述了在给定先前查找尝试的结果时要采取的操作。操作项出现在服务规范之间,并用方括号 [ ] 括起来。操作语句的一般语法是

有两个可能的动作

return

控制返回到尝试名称解析的程序。如果查找尝试成功,解析器将返回详细信息,否则它将返回零结果。

continue

解析器将移动到列表中的下一个服务,并尝试使用它进行解析。

可选的 (!) 字符指定在测试之前应反转状态值;也就是说,它的意思是“非”。

我们可以对其执行操作的可用状态值是

success

已找到请求的条目,没有错误。此状态的默认操作是 return

notfoundhosts查找中没有错误,但找不到目标主机或网络。此状态的默认操作是 continueunavail查询的服务不可用。这可能意味着 files 服务的

networks

文件不可读,或者 dnsnis 服务的名称服务器或 NIS 服务器没有响应。此状态的默认操作是 continue

tryagain

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# Information about this file is available in the `libc6-doc' package.

hosts:          dns [!UNAVAIL=return] files
networks:       files

此状态表示服务暂时不可用。对于 files 文件服务,这通常表示相关文件被某些进程锁定。对于其他服务,这可能意味着服务器暂时无法接受连接。此状态的默认操作是 continue/etc/hosts如何使用此机制的一个简单示例显示在 示例 6-3 中。hosts示例 6-3. 使用操作语句的 nsswitch.conf 文件示例

此示例尝试使用域名系统系统进行主机解析。如果返回状态不是不可用,则解析器返回它找到的任何内容。如果且仅当 DNS 查找尝试返回不可用状态时,解析器才尝试使用本地

。这意味着我们应该仅在我们的名称服务器因某种原因不可用时才使用文件。6.1.3. 使用 resolv.conf 配置名称服务器查找

当配置解析器库以使用 BIND 名称服务进行主机查找时,您还必须告诉它要使用哪些名称服务器。有一个单独的文件用于此,称为文件。nsswitch.conf

resolv.conf文件。。如果此文件不存在或为空,则解析器假定名称服务器位于您的本地主机上。文件。要在本地主机上运行名称服务器,您必须单独设置它,这将在以下部分中解释。如果您在本地网络上并且有机会使用现有的名称服务器,则应始终首选这样做。如果您使用拨号 IP 连接到互联网,您通常会在

中最重要的是 name server 选项,它给出了要使用的名称服务器的 IP 地址。如果您通过多次给出 name server 选项来指定多个名称服务器,则会按给定的顺序尝试它们。因此,您应该将最可靠的服务器放在首位。当前实现允许您在中最多有三个 name server 语句

。如果没有给出 name server 选项,则解析器会尝试连接到本地主机上的名称服务器。

另外两个选项 domainsearch 允许您对本地域中的主机使用快捷名称。通常,当仅 telnet 到本地域中的另一台主机时,您不想键入完全限定的主机名,而是使用命令行上的 gauss 之类的名称,并让解析器附加 mathematics.groucho.edu 部分。

这正是 domain 语句的目的。它允许您指定一个默认域名,以便在 DNS 无法查找主机名时附加。例如,当给定名称 gauss 时,解析器无法在 DNS 中找到 gauss.,因为没有这样的顶级域。当给定 mathematics.groucho.edu 作为默认域时,解析器会使用附加的默认域重复查询 gauss,这次成功了。

您可能会认为这很好,但是一旦您离开了数学系的域,您又回到了那些完全限定的域名。当然,您也希望拥有像 quark.physics 这样的简写形式,用于物理系的域中的主机。这就是 搜索列表 的用武之地。可以使用 search 选项指定搜索列表,它是 domain 语句的概括。后者给出一个默认域,而前者指定了整个列表,每个域依次尝试,直到查找成功。此列表必须用空格或制表符分隔。searchdomain 语句是互斥的,并且不能出现多次。如果未给出任何选项,则解析器将尝试使用

getdomainname(2)文件。系统调用从本地主机名猜测默认域。如果本地主机名没有域部分,则默认域将假定为根域。

如果您决定将 search 语句放入

,您应该小心添加到此列表中的域。BIND 4.9 之前的解析器库过去在未给出搜索列表时从域名构造默认搜索列表。此默认列表由默认域本身及其所有父域(直到根域)组成。这引起了一些问题,因为 DNS 请求最终到达了从未打算看到的名称服务器。

假设您在 Virtual Brewery,并且想登录到 foot.groucho.edu。由于手指打滑,您将 foot 误输入为 foo,该主机不存在。因此,GMU 的名称服务器会告诉您它不知道这样的主机。使用旧式搜索列表,解析器现在将继续尝试使用附加的 vbrew.comcom 的名称。后者是有问题的,因为 groucho.edu.com 实际上可能是一个有效的域名。他们的名称服务器甚至可能在他们的域中找到 foo,将您指向他们的主机之一——这显然不是预期的。文件。对于某些应用程序,这些伪造的主机查找可能是一个安全问题。因此,您通常应将搜索列表中的域限制为您的本地组织或类似组织。在 Groucho Marx 大学数学系,搜索列表通常设置为 maths.groucho.edugroucho.edu
# /etc/resolv.conf
# Our domain
domain         vbrew.com
#
# We use vlager as central name server:
name server     172.16.1.1

如果默认域让您感到困惑,请考虑 Virtual Brewery 的此示例

文件

。当解析名称 vale 时,解析器查找 vale,如果失败,则查找 vale.vbrew.com

6.1.4. 解析器的健壮性

当在更大的网络中运行 LAN 时,如果中央名称服务器可用,您绝对应该使用它们。名称服务器开发了丰富的缓存,由于所有查询都转发到它们,因此可以加快重复查询的速度。但是,此方案有一个缺点:当 Olaf 大学的主干电缆被火灾摧毁时,他的部门的 LAN 上无法再进行任何工作,因为解析器无法再访问任何名称服务器。这种情况给大多数网络服务带来了困难,例如 X 终端登录和打印。

尽管校园主干网发生故障的情况并不常见,但人们可能希望采取预防措施来应对这种情况。/etc/hosts一种选择是设置一个本地名称服务器,该服务器解析来自您本地域的主机名,并将所有其他主机名的查询转发到主服务器。当然,这仅在您运行自己的域时才适用。/etc/host.conf或者,您可以在/etc/nsswitch.conf中为您的域或 LAN 维护一个备份主机表。这非常简单。您只需确保解析器库首先查询 DNS,然后查询 hosts 文件。在