配置详解

概述

参考:

/etc/resolv.conf 详解

该文件可以手动管理,或者由某个应用程序(e.g.NetworkManager)来管理。如果由应用程序管理,则会在文件开头以 # 进行备注

配置文件格式:每行以一个关键字开头,后面接一个或多个由空格隔开的参数。

下面是一个最简单的配置文件示例

nameserver 114.114.114.114
nameserver 202.96.128.166

关键字详解

nameserver IP # 指定用来进行域名解析的服务器地址

IP 可以是 ipv4 或者 ipv6 的地址,该关键字最多配置 3 个。当配置大于 1 个的 nameserver 时,则 reslover 按列出的顺序使用。

search STRING # 指定域名的搜索列表

解析域名时,会搜索 search 关键字指定的 STRING ,并将 STRING 附加到要解析的域名后方。效果如下:

~]# cat /etc/resolv.conf
nameserver 114.114.114.114
~]# ping www
ping: www: Name or service not known
~]# cat /etc/resolv.conf
nameserver 114.114.114.114
search qq.com
~]# ping www
PING https.qq.com (123.151.137.18) 56(84) bytes of data.
64 bytes from 123.151.137.18 (123.151.137.18): icmp_seq=1 ttl=55 time=2.17 ms

Note:

  • 如果使用 FQDN (即在域名最后加个 . ),那么解析不会通过 search ,而是直接解析指定的域名
  • 可以指定多个可供搜索的 STRING,在搜索时,从左至右依次尝试。比如我定义了 search qq.com qq1.com qq2.com 这个搜索域,那么在我 ping www 时,解析过程如下:
    • 先解析 www.qq.com,如果解析无结果;则解析 www.qq1.com,如果无结果;则解析 www.qq2.com,如果无结果则返回解析失败的信息。

sortlist STRING

options STRING # 通过 options 指定的参数来配置 resolver 的运行方式

  • attempts:NUM # 当一个 nameserver 上域名查询失败时进行重试的次数,默认是 2 次。当重试次数达到上限则返回错误信息:无法进行域名解析

  • ndots:NUM # 指定域名中必须出现的 . 的个数。默认值为 1,上限为 15。

    • 如果 . 的个数小于 NUM,则会在 search 关键字指定的搜索列表中进行查询;否则直接查询指定域名,当查询无结果时,再去 search 列表查询。
  • timeout:NUM # 在一个 nameserver 上进行域名查询的超时时间,单位是秒

Note:如果想要测试 resolv.conf 文件,不要使用 dig, host, nslook 这类工具,因为他们并没有调用 resolver 的库(i.e.resolv.conf 文件中的 option 内的设置不会生效)可以使用 getent 来测试。一般情况下正常的应用程序,都会调用 resolver,并使用 resolv.conf 文件(比如 ping 程序)。

应用示例

search test.example.com example.com
options timeout:1 attempts:1 rotate
nameserver 192.168.0.1
nameserver 192.168.0.2

假设 192.168.0.1 不返回结果(可能根本就不是台 DNS),我们假设需要解析 “www.devel”,而这个仅仅在 www.devel.example.com 里面有记录,下面是整个执行的步骤:

  1. “www.devel” on 192.168.0.1, wait until timeout (default 5 secs)
  2. “www.devel” on 192.168.0.2, get reply: no such hostname
  3. “www.devel” on 192.168.0.1, wait until timeout (default 5 secs)
  4. “www.devel” on 192.168.0.2, get reply: no such hostname
  5. www.devel.test.example.com” on 192.168.0.1, wait until timeout (default 5 secs)
  6. www.devel.test.example.com” on 192.168.0.2, reply no such hostname
  7. www.devel.test.example.com” on 192.168.0.1, wait until timeout (default 5 secs)
  8. www.devel.test.example.com” on 192.168.0.2, reply no such hostname
  9. www.devel.example.com” on 192.168.0.1, wait until timeout (default 5 secs)
  10. www.devel.example.com” on 192.168.0.2, reply with IP address

默认情况下是 5s 超时,我做了两个简单的测试,把 resolv.conf 的前三个 nameserver 全部换成不存在的 1.1.1.1, 2.2.2.2, 3.3.3.3,然后可以观察下面 strace 跟踪的结果,对于 ping 以及 getent 来说,已经算是上层的应用结果了。

  1. strace -t getent hosts baidu.com
  2. strace ping baidu.com

把 timeout 设置为 1s 的结果可以看下面这个测试结果:

strace -t ping baidu.com(options timeout:1)

nsswitch.conf 详解

该文件是纯 ASCII 文本,列由空格或制表符分隔。第一列指定数据库名称。其余列描述了要查询的源的顺序以及可以由查找结果执行的有限的一组操作。

注意:如果是某个程序使用 nsswitch.conf 或者系统中没有该文件,则 /etc/hosts 文件也就不会被使用。

示例配置:

root@desistdaydream:~/test_dir/c# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files systemd
group:          files systemd
shadow:         files
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

以下数据库由 GNU C 库理解:


最后修改 May 13, 2024: tailscale, jq, clearup (4e49da16)