本文翻译自:http://www.man7.org/linux/man-pages/man5/resolv.conf.5.html
解析器(resolver
)是C类库中的一组程序,它提供对因特网域名系统(DNS)的访问。当解析器程序第一次被进程调用时,它会读取解析器配置文件中包含的信息。该文件是易于阅读的,并包含具有值的关键字列表,这些关键字提供各种类型的解析器信息。该配置文件被认为是一个受信任的DNS信息源。
如果这个文件不存在,那么解析器将只查询本机上的名称服务器;解析器根据主机名和域搜索路径确定域名,根据域名构造域搜索路径。
配置选项如下:
nameserver
名称服务器的IP地址
解析器应该查询的名称服务器的网络地址,既可以是IPv4地址(点标记法),也可以是IPv6地址(冒号标记法)。最多可以列出MAXNS
(当前是3,查看<resolv.h>
)个名称服务器,每个名称服务器跟在一个关键字后面。如果有多个名称服务器,那么解析器类库按照它们被列出的顺序查询它们。如果配置文件中没有nameserver
条目,那么默认使用本机上的名称服务器
domain
本地域名
大多数对域内的名称的查询可以使用相对于本地域的短名称。如果该选项被设置为".",那么根域名会被使用。如果配置文件中没有domain
条目,那么解析器根据gethostname(2)
返回的本地主机名确定域。域部分取自本地主机名中第一个"."之后的内容。如果主机名不包含域部分,那么根域会被使用
search
用于主机名查找的搜索列表
解析器通常根据本地域名确定该搜索列表;默认情况下,它只包含本地域名。可以通过列出期望的域搜索路径的方式改变它,域搜索路径跟在search
关键字之后,名称之间使用空格或制表符分割。如果名称中点(".")的数量少于ndots
(默认值是1),那么解析器将依次把搜索路径中的每个元素追加到名称后面,然后尝试查询,直到匹配成功。对于使用多个子域名的环境,为了避免中间人攻击和对根DNS服务器产生不必要的查询,请阅读下面的options ndots:n
。注意:这个过程可能很慢,并且当用于被列出的域的服务器不在本地时,将产生大量的网络流量,如果用于某个域的服务器不可用,那么查询将超时。
搜索列表当前被限制到6个域,总共256个字符
sortlist
该选项用来对gethostbyname(3)
返回的地址进行排序。通过 IP地址-子网掩码对 指定排序列表。子网掩码是可选的,默认是自然子网掩码。 IP地址和可选的子网掩码对 之间用斜线("/")分隔。最多可以指定10个对。下面是一个例子:
sortlist 130.155.160.0/255.255.240.0 130.155.0.0
options
选项用于修改某些内部的解析器变量,语法是:
options option ...
option的可选值如下所示:
debug
设置_res.options中的RES_DEBUG
ndots:n
在发起初始的绝对查询之前,为 被传递给res_query(3)
的名称中必须出现的点的数量 设置阈值。默认值是1,这意味着:如果名称中有点,那么在把search list中的元素追加到它后面之前,先把它当作一个绝对名称进行查询。n的上限是15
timeout:n
设置 在解析器通过其它名称服务器重试之前,它将花费多长时间等待远程名称服务器的响应。该时间可能不是任何 解析器API调用 所花费的总时间,并且不保证单个 解析器API调用 映射到单个超时时间上。单位是秒,默认值是RES_TIMEOUT(当前是5,查看<resolv.h>
)。n的上限是30
attempts:n
设置 在解析器放弃查询并向调用程序返回错误之前,它将向名称服务器发送多少次查询。默认值是RES_DFLRETRY(当前是2,查看<resolv.h>
)。n的上限是5
rotate
设置_res.options中的RES_ROTATE,该选项导致:解析器从被列出的名称服务器中,以轮询的方式,进行选择。开启该选项时,解析器把查询负载分散到所有被列出的服务器上,而不是所有客户端每次先尝试第一个被列出的服务器
no-check-names
设置_res.options中的RES_NOCHECKNAME,该选项禁用新式的BIND检查,也就是不检查输入的主机名或邮件名称中的不可用字符,比如:下划线("_")、非ASCII字符或控制字符
inet6
设置_res.options中的RES_USE_INET6。如果开启该选项,那么gethostbyname(3)
函数在发起A查询之前,会尝试AAAA查询,并在AAAA记录不存在,但A记录集存在时,映射IPv6 "tunneled form" 中的IPv4响应。从glibc 2.25开始,该选项被弃用了;应用程序应该使用getaddrinfo(3)
,而不是gethostbyname(3)
ip6-bytestring (since glibc 2.3.4)
Sets RES_USEBSTRING in _res.options. This causes reverse IPv6 lookups to be made using the bit-label format described in RFC 2673; if this option is not set (which is the default), then nibble format is used. This option was removed in glibc 2.25, since it relied on a backward-incompatible DNS extension that was never deployed on the Internet.
ip6-dotint/no-ip6-dotint (glibc 2.3.4 to 2.24)
Clear/set RES_NOIP6DOTINT in _res.options. When this option is clear (ip6-dotint), reverse IPv6 lookups are made in the (deprecated) ip6.int zone; when this option is set (no-ip6-dotint), reverse IPv6 lookups are made in the ip6.arpa zone by default. These options are available in glibc versions up to 2.24, where no-ip6-dotint is the default. Since ip6-dotint support long ago ceased to be available on the Internet, these options were removed in glibc 2.25.
edns0 (since glibc 2.6)
设置_res.options中的RES_USE_EDNS0。该选项用于开启对RFC 2671中描述的DNS扩展的支持
single-request (since glibc 2.10)
设置_res.options中的RES_SNGLKUP。默认情况下,从2.9版本开始,glibc并发地执行IPv4和IPv6查询。某些DNS服务器不能正确地处理这些查询,并使请求超时。该选项禁用该行为,使glibc顺序地执行IPv6和IPv4请求(代价是:解析过程变慢)
single-request-reopen (since glibc 2.9)
设置_res.options中的RES_SNGLKUPREOP。解析器使用相同的socket发送A和AAAA请求。某些硬件会错误地只发回一个回复。当上述情况发生时,客户端系统会等待第二个回复。打开该选项改变这个行为,以便当来自同一个端口的两个请求不能被正确处理时,解析器在发送第二个请求之前,关掉socket,并打开一个新的
no-tld-query (since glibc 2.14)
设置_res.options中的RES_NOTLDQUERY。当一个非限定名称是顶级域名(TLD)时,该选项使res_nsearch()
不尝试解析它。当站点把localhost当作一个TLD,而不把localhost作为搜索列表中的一个或多个元素时,该选项会导致问题。如果RES_DEFNAMES和RES_DNSRCH都没被设置,那么该选项不会产生影响
use-vc (since glibc 2.14)
设置_res.options中的RES_USEVC。该选项强制使用TCP进行DNS解析
no-reload (since glibc 2.26)
设置_res.options中的RES_NORELOAD。该选项禁用自动地重新加载已更改的配置文件
domain
和search
关键字是互斥的。如果存在这些关键字的多个实例,那么最后一个实例会被采用。
可以通过把LOCALDOMAIN环境变量设置为空白分隔的搜索域列表,重写系统的resolv.conf
文件中的search
关键字。
可以通过把RES_OPTIONS环境变量设置为空白分隔的解析器选项列表,修改系统的resolv.conf
文件中的options
关键字。
关键字和值必须出现在同一行上。关键字(比如,nameserver
)必须是一行的开始。值跟在关键字后面,使用空白进行分隔。
第一列是分号(;)或哈希字符(#)的行被视为注释。