/etc/hosts 文件在域名解析中优先级最高,系统按 nsswitch.conf 中 hosts: files dns 顺序先查该文件,匹配成功即返回;其条目需符合 ip 主机名格式,支持注释与别名,修改后多数程序自动生效。

Linux 的 /etc/hosts 文件在域名解析中具有最高优先级,它会在 DNS 查询之前被系统读取并生效。
hosts 文件的解析顺序
Linux 系统默认使用 GNU C 库(glibc)的 getaddrinfo() 或 gethostbyname() 进行主机名解析。其行为由 /etc/nsswitch.conf 中的 hosts: 行控制。典型配置为:
hosts: files dns
这表示:先查 /etc/hosts(files),匹配成功则立即返回,不再继续;失败才转向 DNS 服务器查询。
hosts 条目生效的关键规则
每行格式为:IP地址 主机名 [别名...],需注意以下细节:
- 注释以
#开头,整行忽略 - 同一 IP 可对应多个主机名,用空格分隔,但只有第一个为主机名,其余为别名
- 重复 IP + 不同主机名的条目,仅首条生效;重复主机名的条目,仅首条被采用
- IPv4 和 IPv6 地址不可混用在同一行,需分开书写
- 修改后无需重启服务,大多数程序下次解析时自动读取(部分长期运行进程如某些 daemon 可能缓存结果,需手动触发或重启)
与 DNS、systemd-resolved 的关系
即使启用了 systemd-resolved 或设置了其他 DNS 管理工具(如 NetworkManager、dnsmasq),只要 nsswitch.conf 中 files 在 dns 前,/etc/hosts 仍优先生效。
例外情况:
- 若
nsswitch.conf被改为hosts: dns(移除files),则跳过 hosts 文件 - 容器环境(如 Docker)通常挂载自己的
/etc/hosts,宿主机的修改不影响容器内解析 - 某些应用(如 Chrome)内置 DNS 缓存或使用自己的解析逻辑,可能绕过系统 hosts
验证 hosts 是否生效
推荐使用底层工具确认,避免被缓存干扰:
-
getent hosts example.local—— 直接调用 NSS 接口,最准确反映系统行为 -
ping -c1 example.local—— 观察解析出的 IP 是否匹配 hosts 设置 -
nslookup example.local或dig example.local—— 这两个走纯 DNS 查询,不会查 hosts,仅用于对比 DNS 结果










