在Linux中,resolver(域名解析器)是一组进行域名转换函数组成的库。

具体来说,就是通过查询DNS(Domain Name Server)将域名转换为IP地址

/etc/resolv.conf是域名解析器的配置文件。

nameserver

指定域名解析器查询的DNS(Domain Name Server)的IP地址

最大指定3个不同的nameserver。nameserver的值为DNS(Domain Name Server)的IP地址。

解析器按文件中给定的顺序进行查询。

示例如下:

$cat /etc/resolv.conf
nameserver 192.168.3.1
nameserver 114.114.114.114
nameserver 8.8.8.8

在示例中,解析器在查询域名时会先查询192.168.3.1;如果超时则查询下一个114.114.114.114;如果还超时则继续查询8.8.8.8。

尽管配有多个nameserver,但是当解析器在查询域名队列时,会逐个对域名列表中的每个域名依次查询配置的3个nameserver。

如果第1个域名在使用第1个nameserver查询时阻塞,那么整个域名队列的查询都会阻塞,而不是轮换使用第2个nameserver来查询第2个域名

对于nameserver不会轮换的方式,可以通过配置rotate参数来解决,详情请见rotate

配置域名服务器的一个技巧是应该将最可靠的DNS(Domain Name Server)放在顶部。这将防止不必要的重试,并最终减少域名解析过程的延迟。

指定搜索域列表

如果未指定,search的默认值gethostname函数确定的本地域。

查询域名时,解析器会将域名与搜索域结合起来,形成一个完全限定域名(FQDN)以供查询。

配置示例如下:

cat /etc/resolv.conf
search departmentA.org departmentB.org
nameserver 8.8.8.8

示例中定义了两个搜索域,分别为departmentA.orgdepartmentB.org。当解析器尝试解析域名nodeA时,它将依次和搜索域列表值组合成FQDN来查询。

比如首先和departmentA.org组成FQDN(nodeA.departmentA.org),并使用该FQDN执行DNS查询。如果失败,则会和departmentB.org组成FQDN(nodeA.departmentB.org)并继续DNS查询。

另一方面,当解析器尝试解析域名nodeA.com时,它会首先将nodeA.com作为完全限定域名(FQDB)进行查询。如果DNS无法解析它,则会将其与搜索域组合起来形成nodeA.com.departmentA.org并重试查询。

能否第一次就被当作完全限定域名(FQDN)来进行查询取决于域名中存在的点的数量,可以通过options ndots: 1来进行配置,详见ndots

默认情况下,如果域名中至少有1个点,解析器则会其作为完全限定域名(FQDN)来查询,而不是将其与任何搜索域组合

sortlist

在解析器将单个域名解析为多个IP地址的情况下,用于确定IP地址列表的优先顺序

主要用于解析为多个IP地址的域名。

使用sortlist,可以优先考虑一个特定的IP地址或一系列IP地址。

配置格式:IP[/netmask],示例如下:

$cat /etc/resolv.conf
nameserver 114.114.114.114
sortlist
47.110.160.0/255.255.240.0 47.110.0.0

在示例中,如果解析具有多个IP地址的域名时,[IP地址/网络掩码]匹配47.110.0.0/255.255.0.0的域名将优先排序。

如果没有指定网络掩码,将使用IP地址的自然网络掩码。

例如,IP地址47.110.0.0是一个A类子网,其自然网络掩码为255.0.0.0。因此,在sortlist中,47.110.0.047.110.0.0/255.0.0.0等同。

options

在options中可以指定更多选项来进一步调整Linux中的DNS查询机制。

timeout

解析器请求DNS(Domain Name Server)的超时时间

单位为s。可以指定最大值为30s。

示例如下:

$ cat /etc/resolv.conf
nameserver 114.114.114.114
options timeout:5

示例中指定了解析器请求nameserver列表中的每一个不会超过5s。如果配置了3个nameserver,那么最大请求时间为15s。

ndots

指定解析器将域名作为完全限定域名(FQDN)的条件,即域名中含有的最少点的个数

默认值为1,允许的最大值为15。

默认情况下,只要域名中具有1个点,比如baidu.comnodeA.com,那么解析器就会将其当作完全限定域名(FQDN)来进行查询,而不是将其和配置的搜索域列表结合起来进行查询,详情参见search

示例如下:

$cat /etc/resolv.conf
nameserver 114.114.114.114
options ndots:3

在示例中,如果域名中含有1或2个点,则解析器在解析式会将其和配置的搜索域列表中的逐个组合起来进行查询,而不是当作完全限定域名。

attempt

指定解析器请求nameserver列表的轮询次数

默认值为2,允许的最大值为5。

工作方式:只有当配置的nameserver列表中所有nameserver都未返回结果时,才会进行下一轮,而该字段指的就是会进行几轮。

示例如下:

cat /etc/resolv.conf
nameserver 8.8.4.4
nameserver 1.1.1.1
nameserver 8.8.8.8
options attempts:5

示例中配置了三个不同的nameserver。

解析器首先向8.8.4.4进行查询。如果超时,解析器将继续向1.1.1.1进行查询。此时在1.1.1.1处的查询并不算进行了1轮,只有当3个nameserver都查询一遍之后才算轮询了1次。

如果3个nameserver都没有相应,示例中最多会请求15次,每个nameserver请求5次。

rotate

指定解析器以循环方式轮换向已配置的nameserver列表进行查询

如果没有此选项,那么解析器从待查询的域名队列逐个获取域名,然后依次向配置的nameserver列表进行查询。

如果向第1个nameserver查询第1个域名时阻塞,则不会继续查询域名队列中第2个。如果配置了该选项则会向第2个nameserver查询第2个域名,对配置的nameserver依次轮换。

主要用于nameserver负载均衡。

参考文档

The /etc/resolv.conf File | Baeldung on Linux