在Linux操作系统中,域名系统(DNS)扮演着互联网“电话簿”的角色,负责将我们易于记忆的域名(如www.google.com)转换为机器能够理解的IP地址(如142.250.199.68),当DNS出现问题时,您会发现虽然可以访问特定IP,但无法通过域名浏览网页、更新软件或连接远程服务器,本文旨在提供一个系统性的、从诊断到修复的完整指南,帮助您解决Linux环境中遇到的各类DNS问题。

第一步:诊断DNS问题
在进行任何修复操作之前,首先需要准确地诊断问题根源,这一步至关重要,它能帮助我们区分是网络连接问题、DNS解析问题,还是特定服务的问题。
基础连通性测试
使用ping命令是检验网络连通性的最基本方法,我们需要进行两次测试:
-
测试IP地址连通性:
ping 8.8.8.8
如果此命令成功,说明您的机器到互联网的物理连接是正常的。
-
测试域名连通性:
ping google.com
如果此命令失败(显示“unknown host”或“ping: cannot resolve google.com”),但IP地址可以ping通,那么几乎可以肯定是DNS解析出现了问题。
使用专业DNS查询工具
ping命令只能告诉我们能否解析,而dig(Domain Information Groper)或nslookup则能提供更详细的诊断信息。dig是现代Linux发行版推荐使用的工具。
- 使用
dig进行查询:dig google.com
dig的输出非常详尽,我们主要关注以下几个部分:QUESTION SECTION:确认您查询的域名。ANSWER SECTION:这里显示了查询到的IP地址,如果此部分为空,说明解析失败。SERVER:显示本次查询是由哪个DNS服务器(例如0.0.53#53)处理的,这能帮助我们了解当前系统的DNS上游服务器是谁。Query time:查询耗时,可以用来判断DNS响应速度是否过慢。
如果dig也无法返回ANSWER SECTION,则证实了DNS解析服务本身存在故障。
第二步:检查核心配置文件
Linux的DNS客户端配置主要由/etc/resolv.conf文件管理,这是第一个需要检查的地方。
使用以下命令查看其内容:
cat /etc/resolv.conf
一个典型的resolv.conf如下:

nameserver 127.0.0.53
options edns0 trust-ad
search .
nameserver:此行指定了系统使用的DNS服务器地址,可以有多个,系统会按顺序尝试。search:定义了域名搜索列表,当您尝试访问一个不含点的域名(如“intranet”)时,系统会自动附加这些后缀进行查询。
重要提示:在现代的Linux发行版(如Ubuntu 18.04+, Fedora, CentOS 8+)中,/etc/resolv.conf通常是一个由systemd-resolved服务管理的符号链接,直接手动编辑此文件,更改很可能会在系统重启或网络服务重启后被覆盖,您可以通过ls -l /etc/resolv.conf命令来确认它是否为符号链接。
第三步:排查DNS管理服务
由于/etc/resolv.conf可能被其他服务管理,我们需要找到并配置真正的“幕后管理者”。
systemd-resolved服务
这是目前最主流的本地DNS解析和缓存服务,它提供了一个本地存根DNS服务器(监听在127.0.0.53),负责处理所有DNS请求。
-
检查服务状态:
systemctl status systemd-resolved
确保服务处于
active (running)状态。 -
查看其配置的DNS服务器:
resolvectl status
此命令会清晰列出每个网络接口当前获取到的DNS服务器信息。
-
永久修改DNS设置:
要为systemd-resolved设置全局DNS服务器,不应编辑/etc/resolv.conf,而应编辑其配置文件/etc/systemd/resolved.conf。sudo nano /etc/systemd/resolved.conf
在
[Resolve]部分,取消注释并修改DNS=行,[Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=9.9.9.9 #Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #DNSOverTLS=no #Cache=yes保存文件后,需要重启
systemd-resolved服务使配置生效:sudo systemctl restart systemd-resolved
NetworkManager
在桌面环境或使用NetworkManager管理的服务器上,DNS设置通常由它控制。
- 查看当前连接的DNS设置:
nmcli dev show | grep DNS
- 为特定连接修改DNS:
列出所有网络连接:nmcli connection show
为您的活动连接(Wired connection 1”)设置DNS:

sudo nmcli connection mod "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1"
重启网络连接以应用更改:
sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"
第四步:其他潜在问题与解决方案
如果上述步骤未能解决问题,还需考虑以下因素:
防火墙限制
防火墙可能会阻止DNS查询所使用的端口(UDP 53和TCP 53)。
- 使用
ufw(Ubuntu默认):sudo ufw status sudo ufw allow out 53
- 使用
firewalld(CentOS/Fedora默认):sudo firewall-cmd --list-all sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
更换可靠的公共DNS服务器
有时问题出在ISP提供的DNS服务器上,它们可能响应慢或不稳定,更换为公共DNS是一个有效的解决方案。
| 提供商 | 主DNS | 备用DNS | 特点 |
|---|---|---|---|
| 8.8.8 | 8.4.4 | 速度快,全球可用 | |
| Cloudflare | 1.1.1 | 0.0.1 | 注重隐私和性能 |
| Quad9 | 9.9.9 | 112.112.112 | 自动阻止恶意域名 |
选择一个您信任的提供商,并按照上文介绍的方法(修改resolved.conf或使用nmcli)将其配置到您的系统中。
修复流程小编总结
当遇到Linux DNS问题时,请遵循以下逻辑顺序进行排查和修复:
- 诊断:使用
ping(IP vs. 域名)和dig确认是DNS解析问题。 - 检查配置:查看
/etc/resolv.conf,注意其是否为符号链接。 - 定位管理者:使用
systemctl status systemd-resolved和nmcli确定是哪个服务在管理DNS。 - 正确配置:通过修改
/etc/systemd/resolved.conf或使用nmcli命令来设置可靠的DNS服务器(如Google或Cloudflare的DNS)。 - 检查防火墙:确保出站的53端口未被阻止。
- 重启服务:应用配置后,重启相关的网络或DNS服务。
- 验证:再次使用
dig或ping域名,确认问题已解决。
通过这种系统性的方法,绝大多数Linux DNS故障都可以被快速、准确地定位并修复。
相关问答FAQs
Q1: 为什么我每次手动编辑 /etc/resolv.conf 文件后,重启系统或网络服务,我的更改就消失了?
A1: 这个现象在现代Linux发行版中非常普遍,原因是/etc/resolv.conf文件不再是一个静态配置文件,而是一个由系统服务动态生成的符号链接,最常见的“幕后管理者”是systemd-resolved服务,该服务会从网络连接信息(如DHCP获取)或其自身的配置文件(/etc/systemd/resolved.conf)中读取DNS设置,然后覆盖/etc/resolv.conf,直接编辑它是徒劳的,正确的做法是找到并配置管理它的服务,例如通过编辑/etc/systemd/resolved.conf来设置全局DNS,或者使用NetworkManager的nmcli工具为特定网络连接配置DNS。
Q2: dig 和 nslookup 这两个命令有什么区别?在排查DNS问题时应该优先使用哪个?
A2: dig(Domain Information Groper)和nslookup(Name Server Lookup)都是用于查询DNS的工具,但它们在设计和输出上有所不同。nslookup是一个较老的工具,其交互模式对初学者可能更友好一些,但它的输出格式相对固定,且在某些现代Linux发行版中被认为是“遗留”工具,相比之下,dig是BIND软件套件的一部分,功能更强大,输出更详细、更灵活,并且明确显示了查询的每一个细节(如查询的DNS服务器、响应时间、返回的记录类型等),在进行专业的DNS故障排查时,dig因其丰富的信息和标准化的输出而成为首选工具,它能帮助您更深入地理解整个DNS解析过程,从而更准确地定位问题。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/261990.html