Linux能上网但DNS解析失败,该怎么彻底修复?

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

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如下:

Linux能上网但DNS解析失败,该怎么彻底修复?

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:

    Linux能上网但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 特点
Google 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问题时,请遵循以下逻辑顺序进行排查和修复:

  1. 诊断:使用ping(IP vs. 域名)和dig确认是DNS解析问题。
  2. 检查配置:查看/etc/resolv.conf,注意其是否为符号链接。
  3. 定位管理者:使用systemctl status systemd-resolvednmcli确定是哪个服务在管理DNS。
  4. 正确配置:通过修改/etc/systemd/resolved.conf或使用nmcli命令来设置可靠的DNS服务器(如Google或Cloudflare的DNS)。
  5. 检查防火墙:确保出站的53端口未被阻止。
  6. 重启服务:应用配置后,重启相关的网络或DNS服务。
  7. 验证:再次使用digping域名,确认问题已解决。

通过这种系统性的方法,绝大多数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,或者使用NetworkManagernmcli工具为特定网络连接配置DNS。

Q2: dignslookup 这两个命令有什么区别?在排查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

Like (0)
小编小编
Previous 2025年10月25日
Next 2025年10月25日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注