Linux hosts 文件优先级解析

2次阅读

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

Linux hosts 文件优先级解析

linux/etc/hosts 文件在域名解析中具有最高优先级,它会在 DNS 查询之前被系统读取并生效。

hosts 文件的解析顺序

Linux 系统默认使用 gnu C 库(glibc)的 getaddrinfo()gethostbyname() 进行主机名解析。其行为由 /etc/nsswitch.conf 中的 hosts: 行控制。典型配置为:

hosts: files dns

这表示:先查 /etc/hostsfiles),匹配成功则立即返回,不再继续;失败才转向 DNS 服务器查询。

hosts 条目生效的关键规则

每行格式为:IP地址 主机名 [别名...],需注意以下细节:

  • 注释以 # 开头,整行忽略
  • 同一 IP 可对应多个主机名,用空格分隔,但只有第一个为主机名,其余为别名
  • 重复 IP + 不同主机名的条目,仅首条生效;重复主机名的条目,仅首条被采用
  • IPv4 和 IPv6 地址不可混用在同一行,需分开书写
  • 修改后无需重启服务,大多数程序下次解析时自动读取(部分长期运行进程如某些 daemon 可能缓存结果,需手动触发或重启)

与 DNS、systemd-resolved 的关系

即使启用了 systemd-resolved 或设置了其他 DNS 管理工具(如 NetworkManager、dnsmasq),只要 nsswitch.conffilesdns 前,/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.localdig example.local —— 这两个走纯 DNS 查询,不会查 hosts,仅用于对比 DNS 结果
text=ZqhQzanResources