Linux DNS解析顺序由/etc/nsswitch.conf中hosts行控制,如默认“hosts: files dns myhostname”表示先查/etc/hosts,再查DNS,最后查本机名;修改后新进程立即生效,但需注意systemd-resolved、nscd缓存及应用层绕过等问题。

/etc/nsswitch.conf 是 Linux 系统中决定域名解析优先级的核心配置文件。它不直接“配置 DNS”,而是告诉系统:当程序(如 ping、curl、getent)要查一个域名时,先查哪、再查哪、失败了怎么办。其中最关键的一行是:
hosts: files dns myhostname
这一行就定义了 /etc/hosts 和 DNS 的执行顺序与协作逻辑。
hosts 行的含义与常见写法
该行格式为:hosts: <source1> [action] <source2> [action] ...
-
files:指读取/etc/hosts文件 -
dns:指调用 DNS 解析器(最终依赖/etc/resolv.conf或systemd-resolved) -
myhostname:仅在 systemd 环境下生效,用于解析本机 hostname(如hostname命令返回的值)
默认配置 hosts: files dns myhostname 表示:
- 先查
/etc/hosts,匹配成功立即返回,不继续往后走 - 若
/etc/hosts中没找到,才发起 DNS 查询 - 若 DNS 也失败,且请求的是本机名,则返回
127.0.0.1或::1
你可以按需调整顺序或添加控制动作:
-
想让 DNS 优先,hosts 仅作 fallback:
hosts: dns files
注意:部分老程序或 glibc 版本对
dns在前的支持不完全,实际行为可能略有差异。 -
想严格限制:/etc/hosts 查不到就直接失败,不查 DNS:
hosts: files [NOTFOUND=return] dns
这能避免无谓等待 DNS 超时,适合安全或离线环境。
-
启用 systemd-resolved 并设为中间环节(需服务已启用):
hosts: files resolve [!UNAVAIL=return] dns
表示:先查 hosts → 再交由
systemd-resolved处理 → 若其不可用则跳过,直连 DNS。
Smart Model Switcher V5下载智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
⚠️ 动作修饰符(如 [NOTFOUND=return])只作用于紧邻的前一个源;方括号内不能有空格;修改后无需重启系统,但已有进程不会自动重读配置。
验证配置是否生效
别依赖 ping 或 nslookup ——它们可能被缓存或绕过 NSS 机制:
-
✅ 正确方式:用
getentgetent hosts example.local
它严格按
nsswitch.conf执行,并显示结果来源(如files或dns)。 -
? 进阶确认:结合
strace查看实际打开的文件和连接目标strace -e trace=openat,connect getent hosts example.local 2>&1 | grep -E "(hosts|resolv|connect)"
❌
nslookup example.local或dig example.local不查/etc/hosts,仅走 DNS,不能反映 hosts 优先级,只适合对比 DNS 结果。
常见失效原因与应对
systemd-resolved 正在运行:
它会把/etc/resolv.conf软链接到 stub resolver(如127.0.0.53),此时hosts: dns实际走的是systemd-resolved,不是直连上游 DNS。若需直连,可停用该服务或改用resolve源。-
nscd 缓存未清理:
若启用了 Name Service Caching Daemon,修改nsswitch.conf后需刷新缓存:sudo systemctl restart nscd # 或清除 hosts 缓存 sudo nscd -i hosts
容器或 chroot 环境独立配置:
宿主机改了nsswitch.conf,不影响容器内部行为,需单独配置。应用层自行解析:
如 Java 应用设置sun.net.inetaddr.ttl,或 curl 使用--resolve,会跳过系统 NSS,不受此文件控制。
修改注意事项
-
编辑前建议备份:
sudo cp /etc/nsswitch.conf /etc/nsswitch.conf.bak
-
/etc/hosts格式必须规范:- IP 与主机名之间只能用空格或制表符分隔(推荐统一用空格)
- 注释以
#开头,且必须独占一行或放在行首 - IPv4 和 IPv6 地址不能混在同一行
- 错误格式会导致整行被忽略,且无报错提示
修改后,新启动的进程才会使用新规则;长期运行的服务(如 nginx、docker daemon)可能仍用旧缓存,必要时重启对应服务。
不复杂但容易忽略。

















