Linux DNS 解析失败问题解决

6次阅读

Linux DNS 解析失败问题解决

linux 系统出现 dns 解析失败,通常表现为 ping www.example.comUnknown host,或 curlwget 无法访问域名,但用 IP 地址可以正常通信。问题核心在于系统未能正确将域名转换为 IP 地址,需从配置、服务、网络三方面逐层排查。

检查 /etc/resolv.conf 是否有效

该文件是 Linux 解析 DNS 的核心配置,定义了使用的 DNS 服务器地址。

  • 运行 cat /etc/resolv.conf,确认至少含有一行 nameserver,例如:
    nameserver 8.8.8.8nameserver 114.114.114.114
  • 若为空、被注释、或指向本地不可达地址(如 127.0.0.53 但 systemd-resolved 未运行),解析必然失败
  • 注意:某些发行版(如 ubuntu 18.04+)使用 systemd-resolved 管理该文件,手动修改可能被覆盖;应改用 resolvectl 或配置 /etc/systemd/resolved.conf

验证 DNS 服务是否正常运行

即使 resolv.conf 正确,后端 DNS 服务异常也会导致解析中断。

  • 若使用 systemd-resolved:执行 systemctl status systemd-resolved,确保状态为 active (running);再运行 resolvectl status 查看当前上行 DNS 服务器和链路状态
  • 若使用 dnsmasqbind:检查对应服务状态,如 sudo systemctl status dnsmasq
  • 临时绕过本地服务测试:直接用 dig @8.8.8.8 google.comnslookup github.com 114.114.114.114,若成功说明本地 DNS 服务或转发链路异常

确认网络连接与防火墙限制

DNS 查询依赖 udp 53 端口(偶尔 TCP 53),网络不通或策略拦截会导致超时或无响应。

  • ping -c 3 8.8.8.8 测试基础连通性;若不通,先解决路由或网卡问题
  • nc -zv 8.8.8.8 53timeout 3 bash -c 'echo > /dev/tcp/8.8.8.8/53' 2>/dev/NULL && echo ok || echo fail 检查 53 端口是否可达
  • 检查本机防火墙:sudo ufw status(Ubuntu)或 sudo firewall-cmd --list-allcentos/RHEL),确认未屏蔽出站 UDP 53
  • 企业或校园网络可能劫持或过滤公共 DNS,可尝试更换为 DoH(如 cloudflare-dns.com)或切换至内网指定 DNS

排查 NSS 与解析顺序配置

Linux 使用 /etc/nsswitch.conf 决定主机名解析的优先级来源(如 files、dns、mdns4)。

  • 查看关键行:host: files dns 表示先查 /etc/hosts,再走 DNS;若误写为 host: files,则完全跳过 DNS
  • 检查 /etc/hosts 是否存在错误条目(如把 www.baidu.com 指向了错误 IP),导致解析被提前终止
  • 部分环境启用 mDNS(如 Avahi),若配置不当可能干扰常规 DNS;可临时注释 mdns4 测试
text=ZqhQzanResources