日常运维中,有时会碰到服务器能正常上网、公网域名也能解析,但本机 /etc/hosts 里配置的主机名却无法解析的情况。本文记录一次真实排障过程,供大家参考。
一、问题现象
在服务器上直接 ping 主机名,提示"未知的名称或服务",/etc/hosts 文件中的条目仿佛完全失效;使用 dig 向本机 DNS(127.0.0.1)查询也直接超时。
# ping centosping: centos: 未知的名称或服务# ping centos.localdomainping: centos.localdomain: 未知的名称或服务# dig @127.0.0.1 centos; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> @127.0.0.1 centos; (1 server found);; global options: +cmd;; connection timed out; no servers could be reached
二、问题分析及原因
经过测试发现:公网域名可以正常解析,说明系统到外部 DNS 服务器的解析链路是通的;但 /etc/hosts 却无法解析。
这种"外部解析正常、本地 hosts 失效"的现象,通常说明问题并不在 hosts 文件本身,而在于名称解析的顺序与规则——也就是 Name Service Switch(NSS)的配置。
/etc/nsswitch.conf 决定了各类名称(如 hosts、passwd、group 等)按什么顺序、经由哪些服务来解析。如果这里的 hosts 行被改动,files(本地 hosts 文件)没有被正确启用或顺序异常,就会导致 hosts 无法解析。
三、解决方法
打开 /etc/nsswitch.conf,果然发现 hosts 行被修改过:
# vim /etc/nsswitch.confhosts: qt dns [!UNAVAIL=return] files
在这一行里,files 被放到了最后,中间还加入了 [!UNAVAIL=return],导致本机 hosts 文件的解析没有按预期生效。
解决办法很简单:找一台同样版本、配置正常的操作系统,参考它的 nsswitch.conf,把 hosts 行改回正确配置即可。
附1:正确的配置
# cat /etc/nsswitch.confpasswd: files sssshadow: files sssgroup: files sss# 关键行:files 在前,保证本地 hosts 优先生效hosts: qt files dns myhostnameservices: files sssnetgroup: files sssautomount: filesaliases: files nisplus
小结:名称解析类问题,很多时候并不是 DNS 本身坏了,而是解析顺序的配置被"动了手脚"。遇到"公网能解析、本地 hosts 失效"的情况,先检查 /etc/nsswitch.conf 往往能快速定位并解决。