在类 Unix 操作系统中,域名系统(DNS)的配置是确保网络连接顺畅的关键环节,它负责将人类易于记忆的域名(如 www.google.com)翻译成机器能够识别的 IP 地址(如 250.199.100),理解和正确设置 DNS,不仅能解决无法访问网站的问题,还能优化网络访问速度、增强安全性和实现复杂的网络架构,本文将深入探讨在 Unix 系统中配置 DNS 的核心方法、现代实践以及相关的诊断工具。

传统核心:/etc/resolv.conf 文件
在绝大多数 Unix 和 Linux 发行版中,/etc/resolv.conf 是最直接、最基础的 DNS 配置文件,它由系统的解析器库读取,以确定向哪些 DNS 服务器发送查询请求,虽然现代系统常常通过服务来动态管理此文件,但理解其内部结构至关重要。
该文件通常包含以下几种关键指令:
-
nameserver:这是最重要的指令,用于指定 DNS 服务器的 IP 地址,您可以指定多个nameserver,系统会按照从上到下的顺序依次查询,直到获得响应或全部失败。- 示例:
nameserver 8.8.8.8(使用 Google 的公共 DNS)。 - 通常建议至少配置两个,一个主用,一个备用,以提供冗余,一个是您的路由器地址(如
168.1.1),另一个是公共 DNS。
- 示例:
-
search:此指令定义了一个域名列表,当您尝试解析一个不包含完整域名的简单主机名(如server1)时,系统会自动将这些域名依次附加到主机名后面进行查询。- 示例:
search example.com corp.example.com,当您访问mail时,系统会依次尝试解析mail.example.com和mail.corp.example.com。
- 示例:
-
domain:与search类似,但只能指定一个本地域名,它主要用于较旧的系统,如果同时存在search和domain,search指令会优先生效。 -
options:此指令允许您设置一些解析器行为的选项,以微调 DNS 查询过程。timeout:设置等待每个 DNS 服务器响应的超时时间(秒)。attempts:设置在放弃之前向每个服务器重试查询的次数。rotate:在多个nameserver之间轮询查询,而不是严格按顺序,这可以分散负载。ndots:n:设置一个点数阈值,如果主机名中的点数少于n,则会先应用search列表进行查询;反之,则直接将其视为完整域名进行查询。
一个典型的 /etc/resolv.conf 文件示例如下:
# 使用 Google 和 Cloudflare 的公共 DNS 作为备用
nameserver 192.168.1.1
nameserver 8.8.8.8
nameserver 1.1.1.1
# 本地搜索域
search mycompany.local
# 设置超时和轮询
options timeout:2 attempts:3 rotate
现代实践:systemd-resolved 服务
在许多现代 Linux 发行版(如 Ubuntu 18.04+、Debian 10+、Fedora 等)中,DNS 管理已由 systemd-resolved 服务接管,该服务提供了一个本地缓存式的 DNS 存根解析器,它能显著提高 DNS 查询性能,并更智能地处理不同网络环境下的 DNS 配置。

在使用 systemd-resolved 的系统上,手动编辑 /etc/resolv.conf 文件通常是无效的,因为该文件可能是一个由服务管理的符号链接,正确的配置方式是编辑 /etc/systemd/resolved.conf 文件。
该文件的结构与 resolv.conf 类似,但使用 INI 风格的节,主要配置位于 [Resolve] 部分:
DNS=:用于指定 DNS 服务器的 IP 地址,格式与nameserver相同,支持 IPv4 和 IPv6。FallbackDNS=:指定备用 DNS 服务器,当从网络连接(如 DHCP)自动获取的 DNS 服务器无效时,系统会使用这里的配置。Domains=:作用类似于search指令。LLMNR=和MulticastDNS=:用于配置本地链路多播名称解析,适用于小型本地网络中的设备发现。
一个 /etc/systemd/resolved.conf 的配置示例:
[Resolve] # 指定上游 DNS 服务器 DNS=8.8.8.8 1.1.1.1 # 配置备用 DNS FallbackDNS=9.9.9.9 208.67.222.222 # 设置搜索域 Domains=example.com # 禁用 LLMNR 和 MulticastDNS(除非您需要) LLMNR=no MulticastDNS=no
修改此文件后,需要重启 systemd-resolved 服务以使配置生效:
sudo systemctl restart systemd-resolved
解析顺序:/etc/nsswitch.conf 的角色
系统在进行名称解析时,并不仅仅依赖于 DNS。/etc/nsswitch.conf(Name Service Switch configuration)文件定义了系统查询各种信息数据库(如主机名、用户密码等)的顺序和来源,对于 DNS 解析,关键在于 hosts 这一行。
典型的配置如下:
hosts: files dns
这行配置告诉系统:
- 首先查询
files:即检查/etc/hosts文件,这是一个静态的本地映射文件,用于强制将某个域名指向特定 IP。 - 然后查询
dns:/etc/hosts中没有找到匹配项,再通过前面配置的 DNS 服务器进行查询。
/etc/hosts 文件中的条目拥有最高优先级,这在本地开发、屏蔽恶意网站或进行快速测试时非常有用。

配置方法对比与验证
为了更清晰地理解两种主要配置方法的区别,可以参考下表:
| 特性 | /etc/resolv.conf (传统) |
systemd-resolved (现代) |
|---|---|---|
| 配置文件 | /etc/resolv.conf |
/etc/systemd/resolved.conf |
| 手动编辑 | 直接编辑,但可能被网络管理器覆盖 | 编辑配置文件,然后重启服务 |
| DNS 缓存 | 默认无 | 内置本地缓存,性能更优 |
| 动态更新 | 依赖外部网络管理器(如 NetworkManager) | 自身处理,与网络状态无缝集成 |
| 适用系统 | 旧版 Unix/Linux、嵌入式系统、服务器 | 现代桌面和服务器 Linux 发行版 |
配置完成后,使用命令行工具验证 DNS 设置是否正确工作是必不可少的一步。
host:一个简单明了的工具。host www.google.com
nslookup:一个经典的交互式查询工具。nslookup www.github.com
dig(Domain Information Groper):功能最强大、信息最丰富的工具,强烈推荐用于故障排查。dig @8.8.8.8 www.archlinux.org
这个命令指定使用 Google 的 DNS 服务器(
@8.8.8.8)来查询www.archlinux.org,并返回详细的 DNS 响应信息,包括查询时间、TTL 值、权威服务器等。
相关问答FAQs
Q1: 为什么我直接修改了 /etc/resolv.conf 文件,但重启计算机或网络服务后,我的更改又被还原了?
A1: 这种情况通常发生在使用 systemd-resolved 或 NetworkManager 等现代网络管理服务的系统上,这些服务会动态地、自动地管理 /etc/resolv.conf 文件的内容,以确保 DNS 配置与当前网络状态(如 DHCP 获取的信息)同步,当您手动修改后,服务在下一次刷新时就会用其默认配置覆盖您的更改,正确的做法是:
- 如果您的系统使用
systemd-resolved,请编辑/etc/systemd/resolved.conf文件进行配置,然后运行sudo systemctl restart systemd-resolved。 - 如果您的系统使用 NetworkManager,您可以通过其图形界面或
nmcli命令行工具为特定的网络连接配置 DNS 服务器。 您需要找到“真正”的配置入口,而不是修改被动态生成的文件。
Q2: /etc/hosts 文件和 DNS 解析有什么关系?如果我在 /etc/hosts 中设置了一个域名,它还会去查询 DNS 服务器吗?
A2: /etc/hosts 是一个本地的、静态的域名到 IP 地址的映射文件,它与 DNS 的关系由 /etc/nsswitch.conf 文件中的 hosts 行决定,通常该行配置为 hosts: files dns,这规定了查询顺序:系统首先检查 files(即 /etc/hosts),只有在 /etc/hosts 中找不到对应条目时,才会继续执行 dns 查询,如果您在 /etc/hosts 中添加了一条记录(0.0.1 example.com),那么当您访问 example.com 时,系统会立即返回 0.0.1,而不会向任何外部 DNS 服务器发送请求,这个特性常用于本地开发环境的域名映射、加速频繁访问的本地服务或屏蔽广告域名。