服务器无法解析域名?一次 DNS 配置缺失的排查与修复

0 阅读2分钟

问题现象

某天,服务器上出现了这样一幕:

  • 能访问公网 IP:ping 223.5.5.5 正常,延迟约 27ms
  • 但访问不了域名:nslookup www.baidu.com 直接报错
connection timed out; no servers could be reached

网络明明是通的,域名却解析不了。这通常意味着问题不在"网通不通",而在"DNS 找谁问"。

排查过程

第一步:ping 公共 DNS,验证基础网络

ping -c 2 223.5.5.5

结果通,说明服务器到外网的链路正常。但要注意:ICMP 通不代表 DNS 的 UDP 53 端口通,这一步只能排除"完全断网"的可能,不能证明 DNS 没问题。

第二步:指定 DNS 服务器查询

nslookup www.baidu.com 223.5.5.5

成功返回了百度的 IP(36.152.44.132 等)。这一步很关键——它证明服务器到外网 DNS 的通道是正常的,问题不在网络出口,而在本机的 DNS 配置。

第三步:检查本机 DNS 配置

cat /etc/resolv.conf

结果只有一行:

# Generated by NetworkManager

没有任何 nameserver 记录。

系统根本不知道向谁发起解析请求,于是默认查询超时——问题定位了。

根因:/etc/resolv.conf 中缺少 nameserver 配置。

解决方案

由于该文件由 NetworkManager 管理,直接手改会在重启网络后被覆盖,所以通过 nmcli 把配置固化下来。

1. 确认活动连接名

nmcli -t -f NAME,DEVICE connection show --active

主网卡为 enp125s0f0(其余 br-*、docker0 为 Docker 网桥,忽略即可)。

2. 设置 DNS 并禁止 DHCP 自动下发覆盖

nmcli connection modify "enp125s0f0" ipv4.dns "223.5.5.5 119.29.29.29"
nmcli connection modify "enp125s0f0" ipv4.ignore-auto-dns yes
nmcli connection up "enp125s0f0"

3. 验证

cat /etc/resolv.conf          # 应出现 nameserver 223.5.5.5 等记录
nslookup www.baidu.com        # 不带参数应能直接解析
curl -I https://www.baidu.com # 确认 HTTPS 访问正常

注意事项

  • ignore-auto-dns yes 用于防止 DHCP 下发的 DNS 覆盖手动配置,这是配置能"持久生效"的关键。
  • connection up 后网络会短暂中断几秒,属正常现象。
  • 若 nmcli connection modify 报连接非持久化错误,可使用简写 nmcli con mod enp125s0f0 ... 重试。
  • 临时应急也可直接 echo "nameserver 223.5.5.5" >> /etc/resolv.conf,但重启或重启网络后会失效,仅用于快速验证。

小结

这次故障的排查思路其实很清晰:先分清"网络不通"和"DNS 不通",再分清"外网 DNS 不通"和"本机 DNS 配置缺失"。ping 通只能说明链路层没问题,nslookup 指定服务器查询成功则把嫌疑锁定在本机配置上,最后 resolv.conf 里空空如也的 nameserver 让真相水落石出。

遇到类似问题时,记住这条排查链:ping IP → nslookup 指定 DNS → 检查 resolv.conf → 用 nmcli 固化配置,基本能覆盖大部分域名解析故障。