resolv.conf文件分析
resolv.conf 文件是 Linux 和其他类 Unix 系统中用于配置域名系统 (DNS) 解析器库 (resolver) 的主要文件。当应用程序需要将主机名解析为 IP 地址(或反之)时,解析器库会查阅此文件以获取相关配置信息。
常见问题
- nameserver 解析条数限制
在C库resolv.h头文件中,定义了最大使用的上游服务器条数,参考宏MAXNS,所以默认路由器的等网络设备会使用dnsmasq、smartdns等软件进行配置dns,然后会增加nameserver 127.0.0.1和nameserver ::1来使用第三方解析软件进行解析。
文件位置
该文件通常位于 /etc/resolv.conf。
主要配置指令
根据 resolv.conf(5)
man page,以下是一些关键的配置指令:
-
nameserver
- 作用: 指定 DNS 服务器的 IP 地址。解析器库会按照列出的顺序向这些服务器发送查询请求。
- 语法:
nameserver IP_ADDRESS
- 示例:
nameserver 8.8.8.8
- 说明: 可以指定多个
nameserver
行。通常建议至少配置两个或三个,以提供冗余。解析器会尝试第一个nameserver
,如果超时或失败,则尝试下一个。
-
domain
- 作用: 指定本地的域名。如果查询的主机名不包含点 (
.
),解析器会自动将此域附加到主机名后面进行查询。 - 语法:
domain LOCAL_DOMAIN_NAME
- 示例:
domain example.com
- 说明:
domain
和search
指令是互斥的。如果两者都存在,则最后出现的那个生效。
- 作用: 指定本地的域名。如果查询的主机名不包含点 (
-
search
- 作用: 指定一个主机名查找的搜索列表。当查询一个不包含点 (
.
) 的短主机名时,解析器会依次尝试将列表中的每个域名附加到该主机名后面进行查询,直到找到匹配项或尝试完所有列表项。 - 语法:
search DOMAIN1 DOMAIN2 ...
- 示例:
search eng.example.com sales.example.com example.com
- 说明: 搜索列表通常包含本地子域和父域。
domain
和search
指令是互斥的。
- 作用: 指定一个主机名查找的搜索列表。当查询一个不包含点 (
-
sortlist
- 作用: 允许对
gethostbyname
返回的地址进行排序。它基于地址/网络掩码对。匹配sortlist
中条目的地址会优先于不匹配的地址。 - 语法:
sortlist ADDRESS/NETMASK ...
- 示例:
sortlist 130.155.160.0/255.255.240.0 130.155.0.0
- 说明: 这在具有多个网络接口或需要优先访问特定子网时很有用。
- 作用: 允许对
-
options
- 作用: 允许设置解析器库的内部变量。
- 语法:
options OPTION ...
- 常见选项:
ndots:n
: 设置在进行初始绝对查询之前,主机名中必须包含的点 (.
) 的数量阈值。默认值为 1。如果主机名中的点数小于n
,则会先尝试附加search
列表中的域名。timeout:n
: 设置等待 DNS 服务器响应的初始超时时间(秒)。默认通常是 5 秒。attempts:n
: 设置在放弃之前向 DNS 服务器发送查询的最大次数。默认通常是 2 次。rotate
: 使解析器轮询nameserver
列表中的服务器,而不是总是从第一个开始尝试。这有助于负载均衡。debug
: (已弃用,但旧系统可能仍支持)开启调试模式。
- 示例:
options ndots:2 timeout:2 attempts:3 rotate
工作原理简述
- 应用程序调用解析器库函数(如
gethostbyname
或getaddrinfo
)。 - 解析器读取 resolv.conf 文件获取配置。
- 如果要解析的主机名是完全限定域名 (FQDN) 或其点数大于等于
options ndots
的值,则直接向nameserver
列表中的服务器查询。 - 如果要解析的是短主机名(点数小于
ndots
),则会依次尝试将search
列表(或domain
指定的域)附加到主机名后进行查询。 - 解析器按照
nameserver
列表顺序(或根据rotate
选项)向 DNS 服务器发送查询。 - 根据
timeout
和attempts
选项处理超时和重试。 - 如果配置了
sortlist
,则对返回的地址进行排序。 - 将结果返回给应用程序。
示例
# /etc/resolv.conf
# Generated by NetworkManager or similar tool
search mycorp.net internal.mycorp.net
nameserver 192.168.1.1
nameserver 8.8.8.8
options timeout:1 attempts:2 rotate
在这个例子中:
- 解析器会首先搜索
mycorp.net
和internal.mycorp.net
域来解析短主机名。 - 它会首先尝试向
192.168.1.1
发送查询,如果失败或超时,则尝试8.8.8.8
。 rotate
选项意味着下次查询可能会先尝试8.8.8.8
。- 初始超时设置为 1 秒,最多尝试 2 次。
注意事项
- 在现代 Linux 发行版中,
/etc/resolv.conf
文件通常由网络管理服务(如 NetworkManager 或 systemd-resolved)动态生成和管理。直接编辑此文件所做的更改可能会在网络重启或系统重启后被覆盖。 - 如果使用
systemd-resolved
,实际的配置文件可能是 resolv.conf 或 stub-resolv.conf,而 resolv.conf 可能是一个指向这些文件的符号链接,或者是一个静态的备用文件。配置systemd-resolved
通常通过resolved.conf(5)
和resolvectl(1)
命令进行。 - 理解 resolv.conf 的配置对于诊断网络连接和 DNS 解析问题至关重要。