文档首页> 技术教程> /etc/hosts 与 DNS 的优先级关系

/etc/hosts 与 DNS 的优先级关系

发布时间:2026-03-04 16:53        更新时间:2026-03-04 18:48
改了 /etc/hosts 却发现程序还在连旧 IP?多半是解析顺序或缓存的问题。这篇把 hosts 与 DNS 谁先谁后讲清楚。 谁先谁后 Linux 的域名解析顺序由 /etc/nsswitch.conf 决定,hosts 行一般写着: ``` hosts: files dns ``` files 在前,表示 /etc/hosts 优先于 DNS 查询:hosts 里配过的域名不再向外询问,没配的才走 DNS。想看某个域名最终解析到哪,`getent hosts 域名` 给出的是真实生效的结果。这里有个经典误区:`dig 域名` 和 `nslookup 域名` 是直接向 DNS 服务器发问的,会绕过 hosts——验证 hosts 是否生效,一律用 getent 或 ping,这个差异坑过很多人。nsswitch 本身是一套通用机制,passwd、group 等条目的查询顺序同样由它决定,理解了 hosts 行,其余行也就能读懂了。 hosts 的正确用法 每行格式是"IP 域名",一行可以跟多个域名,注释用井号,例如: ``` 10.0.0.21 api.internal.example.com 10.0.0.22 www.example.com ``` 典型场景:新服务器上线前,把 www.example.com 临时指到预发机器的 IP,本机验证通过后再切 DNS。对运维来说,这是流量切换前的最后一道验证,成本为零,收益却很大。它还有个日常用途:给内网服务起短名字,比如把 git.internal 指到内网地址,团队统一维护一份 hosts 模板分发,配合配置管理工具最省心。 不生效的常见原因 一是文件写错,IP 与域名之间混进了不可见字符,`cat -A` 能看出来;二是缓存,systemd-resolved 维护的 DNS 缓存用 `resolvectl flush-caches` 清空;三是程序自身的解析方式,比如浏览器内置的加密 DNS 可能完全绕过 hosts,测试时改用 curl 才作数;四是改错了机器——多人协作时先 `hostname` 确认自己连的是哪台,这类乌龙比想象中常见。IPv6 也别漏:hosts 里只留了 ::1 一行而业务走 IPv4 时,记得把 IPv4 映射补上,`ping -4`、`ping -6` 分别验证。hosts 是每台机器各管各的,改动没有集中视图,改了哪台要记录在案。 一条实用建议:hosts 改动属于临时手段,测试完记得删,遗留条目几个月后会变成没人解释得通的"灵异问题"。顺云云主机做跨节点迁移预演时,hosts 临时指向加 curl 验证的组合同样适用。