在现代的Linux操作系统中,配置DNS(域名系统)是一项基础且至关重要的任务,DNS负责将人类易于记忆的域名(如www.google.com)解析为机器能够识别的IP地址(如142.250.199.100),无论是访问互联网、配置内部服务,还是进行网络故障排查,正确配置DNS都是不可或缺的一环,本文将详细介绍在Linux系统中配置DNS的几种主流方法,从传统的配置文件到现代化的系统服务,帮助您根据不同的场景选择最合适的方案。

传统方法:直接编辑 /etc/resolv.conf
这是最经典、最直接的DNS配置方式。/etc/resolv.conf是DNS客户端的核心配置文件,系统中的绝大多数网络应用程序都会读取此文件来获取DNS服务器的地址。
该文件通常包含以下几项关键指令:
nameserver:指定DNS服务器的IP地址,可以指定多个,系统会按从上到下的顺序进行查询。search:定义一个域名搜索列表,当尝试解析一个不包含完整域名的主机名(server1)时,系统会依次尝试将search列表中的域名后缀附加到主机名后进行查询。domain:定义本地主机的域名,它只有一个值,功能与search类似,但优先级更低。options:设置DNS解析器的其他选项,例如超时时间、重试次数等。
手动配置示例:
您可以使用任何文本编辑器(如nano或vim)来修改此文件,要将DNS服务器设置为Google的公共DNS(8.8.8.8)和Cloudflare的DNS(1.1.1.1),并添加一个本地搜索域example.com应如下所示:
# /etc/resolv.conf nameserver 8.8.8.8 nameserver 1.1.1.1 search example.com options timeout:2 attempts:3
重要提示: 在许多现代Linux发行版(如Ubuntu 18.04+、CentOS 7+)中,/etc/resolv.conf文件通常是由网络管理服务(如systemd-resolved或NetworkManager)自动生成和维护的,直接手动编辑此文件,在系统重启或网络服务重启后,您的修改很可能会被覆盖,虽然这种方法简单直接,但更推荐通过下述现代方法进行配置,以确保设置的持久性。
现代方法一:使用 systemd-resolved
systemd-resolved是systemd套件的一部分,为许多现代Linux发行版提供了本地DNS存根解析器,它通过监听本地的回环地址(通常是0.0.53)来处理DNS查询,能够缓存查询结果、提高解析速度,并支持多种上游DNS配置。
要配置systemd-resolved,您需要编辑其主配置文件/etc/systemd/resolved.conf,而不是/etc/resolv.conf。
配置步骤:
-
编辑配置文件: 使用管理员权限打开
/etc/systemd/resolved.conf文件。sudo nano /etc/systemd/resolved.conf
-
修改DNS设置: 在
[Resolve]部分,取消注释(或添加)并修改以下行:[Resolve] DNS=8.8.8.8 1.1.1.1 #FallbackDNS=用于备用DNS Domains=~example.com #LLMNR=no #MulticastDNS=no #DNSSEC=no #DNSOverTLS=no #Cache=yes
DNS=:在这里填入您希望使用的DNS服务器地址,用空格分隔。Domains=:可以设置搜索域,前缀表示仅用于路由解析,不影响单标签主机名的搜索。
-
重启服务并更新链接: 保存文件后,重启
systemd-resolved服务以使更改生效。sudo systemctl restart systemd-resolved
确保
/etc/resolv.conf指向由systemd-resolved管理的存根文件,它应该是一个符号链接:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
-
验证配置: 您可以使用
resolvectl命令来检查当前状态:
resolvectl status
输出会显示全局DNS设置、当前网络接口的DNS信息以及Link(即
Domains=)的配置。
现代方法二:使用 NetworkManager
NetworkManager是一个功能强大的网络管理工具,常见于桌面环境和需要灵活网络配置的服务器,它允许为每个网络连接(如特定的以太网接口或Wi-Fi网络)单独配置DNS。
使用nmcli命令行工具配置:
nmcli是NetworkManager的命令行界面,非常适合脚本化或远程管理。
-
查看当前网络连接:
nmcli connection show
找到您要配置的连接的名称,例如
Wired connection 1或MyWiFi。 -
为指定连接设置DNS:
sudo nmcli connection mod "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1"
将
"Wired connection 1"替换为您的实际连接名称。 -
防止DHCP覆盖DNS设置: 如果您的网络使用DHCP,通常DHCP服务器会提供DNS信息,要强制使用您手动设置的DNS,需要忽略自动获取的DNS:
sudo nmcli connection mod "Wired connection 1" ipv4.ignore-auto-dns yes
-
重新激活连接: 为了让配置生效,需要重新启动网络连接。
sudo nmcli connection up "Wired connection 1"
-
验证配置: 检查
/etc/resolv.conf文件,或直接使用nmcli查看设备状态:nmcli dev show | grep DNS
| 方法 | 主要配置文件 | 管理方式 | 适用场景 |
|---|---|---|---|
直接编辑/etc/resolv.conf |
/etc/resolv.conf |
手动 | 临时测试、嵌入式系统或无网络管理服务的简单环境 |
使用systemd-resolved |
/etc/systemd/resolved.conf |
服务化 | 现代Linux发行版的默认方案,提供缓存和持久化全局配置 |
使用NetworkManager |
通过nmcli或GUI管理 |
连接导向 | 桌面系统、笔记本或多网络环境,可为不同连接设置不同DNS |
相关问答FAQs
我修改了 /etc/resolv.conf,但重启服务器或网络后,设置又变回原来的样子了,这是为什么?
解答: 这个问题的根本原因是您的Linux系统正在使用systemd-resolved或NetworkManager这类网络管理服务,这些服务在启动或网络状态发生变化时,会根据它们自己的内部配置(例如/etc/systemd/resolved.conf或NetworkManager的连接配置文件)来重新生成/etc/resolv.conf文件,您对该文件的任何直接修改都会被覆盖。

正确的做法是:
- 如果系统使用
systemd-resolved,请编辑/etc/systemd/resolved.conf文件,然后重启systemd-resolved服务。 - 如果系统使用
NetworkManager,请使用nmcli命令或图形界面来修改特定网络连接的DNS设置。 通过这些正规途径配置的DNS,才是持久且不会在重启后丢失的。
我已经配置了新的DNS服务器,如何快速测试它是否生效?
解答: 有多种命令可以用来测试DNS配置的有效性,以下是几种常用方法:
-
使用
ping命令: 这是最简单的测试方法。ping一个域名,如果能够返回其IP地址并开始接收数据包,说明DNS解析基本正常。ping www.baidu.com
如果成功,您会看到类似
PING www.a.shifen.com (182.61.200.7)的输出,其中IP地址就是解析出来的结果。 -
使用
nslookup或dig命令: 这是更专业的DNS查询工具,提供更详细的信息。nslookup:nslookup www.github.com
会显示查询到的域名及其对应的IP地址。
dig:dig www.github.com
dig的输出非常详尽,包含了查询的整个过程中的详细信息,包括ANSWER SECTION(应答部分),这里清晰地列出了域名和IP的映射关系,您还可以使用dig @DNS服务器地址 域名来直接向指定的DNS服务器发起查询,dig @8.8.8.8 www.github.com。
-
对于
systemd-resolved用户: 可以使用其配套的resolvectl命令进行查询,结果清晰直观。resolvectl query www.github.com
通过以上任一方法,如果都能成功获取到目标域名的IP地址,就证明您的DNS配置已经正确生效。