💻 同一局域网内 DNS 一台能解析、一台失败的排查全过程
💻 同一局域网内 DNS 一台能解析、一台失败的排查全过程
🧩 背景
项目部署中,我遇到一个奇怪的现象:
- 两台机器 A 和 B 同处局域网
- 访问域名
harbor.internal.xxxx.com:- A 能 ping 通,curl 正常
- B 提示
Name or service not known,解析失败
这个域名是通过 内网 DNS 服务器(192.168.2.8) 提供的,不对公网开放。
🧪 初步排查
1. 检查 DNS 设置
cat /etc/resolv.conf
发现两台机器都显示:
nameserver 127.0.0.53
这表面上“相同”,其实不一定。Ubuntu 默认使用 systemd-resolved 做 DNS 管理,127.0.0.53 只是一个本地转发器,真正的 DNS 是隐藏在后面的。
2. 使用 dig 测试
在 B 机器上执行:
dig harbor.internal.xxxx.com
结果:
;; ->>HEADER<<- status: NXDOMAIN
说明 DNS 服务器根本不知道这个域名。
A 机器返回正常 IP,说明是 DNS 配置不一致导致的解析失败。
🔍 深度排查
使用 resolvectl status 代替 systemd-resolve(Ubuntu 24.04 起推荐):
resolvectl status
结果如下:
A 机器(正常):
Link 2 (eno145)
Current DNS Server: 192.168.2.8
DNS Servers: 192.168.2.8 114.114.114.114
B 机器(异常):
Link 2 (eno8303)
Current DNS Server: 114.114.114.114
DNS Servers: 192.168.2.8 114.114.114.114
虽然 B 也配置了内网 DNS,但当前默认使用的是公网 DNS 114.114.114.114,自然无法解析私有域名。
✅ 问题根因
虽然两台机器都用了
127.0.0.53,但其实际转发 DNS 不同!
B 机器默认走了公网 DNS,无法识别 internal.xxxx.com 这类私有域名,导致返回 NXDOMAIN。
🛠 解决方案
方法一:临时修复(立刻生效)
sudo resolvectl dns eno8303 192.168.2.8
sudo resolvectl domain eno8303 ~. internal.xxxx.com
如果你还有第二块网卡(如 eno145),可以也配置:
sudo resolvectl dns eno145 192.168.2.8
sudo resolvectl domain eno145 ~. internal.xxxx.com
验证解析是否成功:
dig harbor.internal.xxxx.com
方法二:持久化设置(防止重启失效)
编辑 /etc/systemd/resolved.conf:
[Resolve]
DNS=192.168.2.8
Domains=~. internal.xxxx.com
FallbackDNS=114.114.114.114
含义:
- DNS= → 优先使用内网 DNS;
- FallbackDNS= → 如果主 DNS 挂了,就用它;
- Domains=~. internal.xxx.com → 指定要走内网域名规则(局部解析)。
然后重启服务:
sudo systemctl restart systemd-resolved
📌 经验总结
| 排查步骤 | 工具/命令 | 要点 |
|---|---|---|
| 查看 DNS 配置 | cat /etc/resolv.conf |
通常是 127.0.0.53 |
| 查看实际 DNS | resolvectl status |
看当前 DNS Server 是谁 |
| 验证 DNS 是否能解析 | dig xxx.com / nslookup |
看是否返回 IP |
| 临时修复 | resolvectl dns |
设置正确 DNS 和域 |
| 持久化配置 | 修改 resolved.conf |
避免重启失效 |
📝 结语
这个问题表面看起来是“网络问题”,实际是 DNS 使用优先级被悄悄改变。借此总结,今后碰到:
- 某些机器能解析,某些不行;
- 同网段,域名解析不一致;
/etc/resolv.conf看起来没问题;
时,第一时间想到 resolvectl 查实际 DNS 设置!

浙公网安备 33010602011771号