问题现象
某天,服务器上出现了这样一幕:
- 能访问公网 IP:
ping 223.5.5.5正常,延迟约 27ms - 但访问不了域名:
nslookup www.baidu.com直接报错
csharp
connection timed out; no servers could be reached
网络明明是通的,域名却解析不了。这通常意味着问题不在"网通不通",而在"DNS 找谁问"。
排查过程
第一步:ping 公共 DNS,验证基础网络
bash
ping -c 2 223.5.5.5
结果通,说明服务器到外网的链路正常。但要注意:ICMP 通不代表 DNS 的 UDP 53 端口通,这一步只能排除"完全断网"的可能,不能证明 DNS 没问题。
第二步:指定 DNS 服务器查询
bash
nslookup www.baidu.com 223.5.5.5
成功返回了百度的 IP(36.152.44.132 等)。这一步很关键------它证明服务器到外网 DNS 的通道是正常的,问题不在网络出口,而在本机的 DNS 配置。
第三步:检查本机 DNS 配置
bash
cat /etc/resolv.conf
结果只有一行:
bash
# Generated by NetworkManager
没有任何 nameserver 记录。
系统根本不知道向谁发起解析请求,于是默认查询超时------问题定位了。
根因:/etc/resolv.conf 中缺少 nameserver 配置。
解决方案
由于该文件由 NetworkManager 管理,直接手改会在重启网络后被覆盖,所以通过 nmcli 把配置固化下来。
1. 确认活动连接名
bash
nmcli -t -f NAME,DEVICE connection show --active
主网卡为 enp125s0f0(其余 br-*、docker0 为 Docker 网桥,忽略即可)。
2. 设置 DNS 并禁止 DHCP 自动下发覆盖
bash
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. 验证
bash
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 固化配置,基本能覆盖大部分域名解析故障。