在Linux操作系统中,“取消DNS”这个说法通常不是一个单一、明确的操作,而是根据用户的具体需求,指向几种不同的配置和管理行为,它可能意味着临时禁用域名解析、修改DNS服务器地址、清除DNS缓存,或是通过特定方式绕过DNS查询,理解这些不同的场景对于正确管理和排查网络问题至关重要。

为何需要管理或“取消”DNS
在日常使用和系统管理中,我们调整DNS设置的动机多种多样,在进行网络故障排查时,可能需要暂时禁用DNS以判断问题是出在域名解析环节还是网络连接本身,为了提升网络访问速度或安全性,用户可能会选择将默认的ISP(互联网服务提供商)DNS服务器更换为公共DNS,如Google DNS(8.8.8.8)或Cloudflare DNS(1.1.1.1),在开发和测试环境中,开发人员常常需要将一个域名指向本地服务器(如127.0.0.1),这时就需要强制绕过正常的DNS查询,出于隐私保护的考虑,一些用户也希望使用不会记录其查询历史的DNS服务。
核心配置文件:/etc/resolv.conf
在Linux系统中,绝大多数DNS解析行为都受到/etc/resolv.conf文件的直接控制,这个文件是解析器库使用的核心配置文件,它告诉系统应该向哪些DNS服务器发送查询请求,一个典型的/etc/resolv.conf如下:
# This file is managed by man:systemd-resolved(8). Do not edit.
nameserver 192.168.1.1
search mydomain.local
options edns0
nameserver:这是最重要的指令,其后跟的是DNS服务器的IP地址,系统会按照从上到下的顺序依次尝试查询,直到获得响应或列表结束。search:定义了一个域名搜索列表,当用户尝试访问一个不含点(如server)的主机名时,解析器会自动将search列表中的域名依次附加到主机名后进行查询,例如尝试server.mydomain.local。options:用于设置解析器的各种选项,如edns0(启用扩展DNS机制)、rotate(轮询nameserver列表以实现负载均衡)等。
直接修改此文件是改变DNS设置最直接的方法,但在现代Linux发行版中,此文件通常由网络管理服务(如systemd-resolved、NetworkManager)自动管理,手动编辑后,更改很可能在系统重启或网络服务重启后被覆盖。
通过/etc/hosts文件“取消”DNS查询
如果目标是让某个特定的域名解析到指定的IP地址,而不是通过DNS服务器查询,最有效的方法就是使用/etc/hosts文件,此文件的优先级高于DNS查询,系统在解析域名时,会首先检查/etc/hosts,如果找到对应条目,就会直接使用该条目中的IP地址,不再向DNS服务器发起请求。
文件格式非常简单:IP_address hostname aliases
要强制将www.example.com指向本地回环地址,可以在/etc/hosts文件中添加以下一行:
0.0.1 www.example.com
添加后,立即生效,这对于开发人员屏蔽广告域名、或是在没有DNS的局域网中通过主机名访问服务器非常有用,要“取消”这种设置,只需删除或注释掉(在行首添加)相应的行即可。
永久更改DNS服务器地址
为了永久性地更改系统的DNS服务器,我们需要通过系统提供的网络管理工具进行配置,而不是直接编辑/etc/resolv.conf。

使用systemd-resolved
在许多现代发行版(如Ubuntu 18.04+、Debian 10+)中,systemd-resolved是默认的DNS解析服务,其配置文件为/etc/systemd/resolved.conf。
- 使用管理员权限编辑该文件:
sudo nano /etc/systemd/resolved.conf
- 在
[Resolve]部分,取消注释(或添加)DNS=和FallbackDNS=行,并填入你想要的DNS服务器地址。[Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=192.168.1.1 #Domains= #LLMNR=no #MulticastDNS=yes #DNSSEC=no #DNSOverTLS=no #Cache=yes
- 保存文件后,重启
systemd-resolved服务使配置生效:sudo systemctl restart systemd-resolved
- 确保
/etc/resolv.conf正确地指向了systemd-resolved生成的存根文件:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
使用NetworkManager(通过nmcli)
对于使用NetworkManager作为网络管理服务的桌面或服务器环境,可以使用其命令行工具nmcli进行操作。
-
查看你的网络连接名称:
nmcli connection show
假设连接名称为
Wired connection 1。 -
为该连接设置IPv4 DNS服务器:
nmcli con mod "Wired connection 1" ipv4.dns "8.8.8.8 8.8.4.4"
-
应用更改,需要先禁用再启用连接:
nmcli con down "Wired connection 1" nmcli con up "Wired connection 1"
更改后,
NetworkManager会自动更新/etc/resolv.conf文件,并且这个设置是持久的。
清除DNS缓存
有时,网络问题并非由DNS服务器本身引起,而是由于本地的DNS缓存中存在过时或错误的记录,清除缓存是解决此类问题的常用步骤,不同的缓存服务有不同的清除命令。

| 缓存服务 | 清除命令 | 常见于 |
|---|---|---|
systemd-resolved |
sudo resolvectl flush-caches |
Ubuntu, Debian |
nscd (Name Service Cache Daemon) |
sudo systemctl restart nscd 或 sudo nscd -i hosts |
CentOS, RHEL (可选安装) |
dnsmasq |
sudo systemctl restart dnsmasq |
常用于轻量级路由器和本地网络 |
执行相应命令后,本地的DNS缓存将被清空,下一次查询会直接向DNS服务器发起请求,从而获取最新的记录。
相关问答FAQs
Q1: 我手动修改了 /etc/resolv.conf 文件,添加了新的DNS服务器,但为什么每次重启后我的修改都消失了?
A1: 这种情况在几乎所有的现代Linux发行版上都会发生,原因是/etc/resolv.conf文件不再是一个静态配置文件,而是由网络管理服务(如systemd-resolved或NetworkManager)动态生成的,这些服务在系统启动或网络状态变化时,会根据其自身的配置(例如/etc/systemd/resolved.conf或NetworkManager的连接配置)来重写/etc/resolv.conf,任何直接的手动修改都会被覆盖,要实现永久性更改,必须通过修改这些网络管理服务的配置文件来完成,具体方法可参考上文中的“永久更改DNS服务器地址”部分。
Q2: 我只想在测试时临时禁用所有DNS解析,让系统无法通过域名访问网络,最快捷的方法是什么?
A2: 最快捷的方法是清空或重命名/etc/resolv.conf文件,使其不包含任何nameserver条目,这会导致系统的解析器找不到任何可用的DNS服务器,从而无法将域名转换为IP地址,你可以使用以下命令之一:
# 方法一:备份并清空文件 sudo cp /etc/resolv.conf /etc/resolv.conf.bak sudo echo "" > /etc/resolv.conf # 方法二:备份并重命名文件 sudo mv /etc/resolv.conf /etc/resolv.conf.bak
执行后,任何尝试使用域名的网络操作(如ping google.com)都会立即失败,测试完成后,只需将备份文件恢复即可:
sudo mv /etc/resolv.conf.bak /etc/resolv.conf
这同样可能被网络管理服务自动恢复,但对于临时的、快速的测试目的来说,这是最直接有效的方法。