/etc/hosts
100%

DNS · 第 4 课

/etc/hosts

了解本地主机文件映射如何参与 Linux 名称解析,以及如何安全地测试它们。

/etc/hosts 为本地系统的名称服务栈提供静态的地址到名称条目。它适用于回环名称、引导阶段的依赖和范围严格受限的测试,但不会向其他主机发布记录,也不会更新 DNS。

读取文件

每行先写一个 IPv4 或 IPv6 地址,后跟一个或多个名称:

127.0.0.1       localhost
192.0.2.25      app-test.example.net app-test
2001:db8::25    app-test-v6.example.net app-test-v6

注释以 # 开头。按照惯例,一些工具会把第一个名称视为规范名称,后续名称视为别名,但不同应用程序和解析器 API 的行为并不一致。应避免为同一个名称添加重复或冲突的条目。

普通 /etc/hosts 映射行的第一项是什么?

解析器顺序

名称服务切换(Name Service Switch)配置通常位于 /etc/nsswitch.conf,它决定系统解析器函数如何组合 files、DNS、多播系统和其他来源。常见配置行如下:

hosts: files dns

在检查策略前,不要假定文件总是排在第一位。应用程序也可能使用自己的 DNS 库、缓存、代理或加密解析器,从而不遵循系统解析路径。

什么决定系统解析器是否先于 DNS 查询 /etc/hosts

通过系统解析器测试

使用 getent 走一遍已配置的系统名称服务路径:

$ getent ahosts app-test.example.net

dig 会直接查询 DNS,通常不显示 /etc/hosts 映射。这个差异很有用:如果 getent 成功而 dig 没有结果,可能意味着本地来源或解析器策略有所不同。

哪种工具更适合检查常规系统解析能否看到 hosts 文件条目?

安全编辑

保留必需的 localhost 和主机身份条目,验证目标地址,并通过具备特权的编辑工具进行可恢复的修改。不要为了随手测试而覆盖真实公共域名,这可能意外重定向凭据或应用程序流量。请使用专用测试名称,并在实验结束后删除该条目。

编辑后,应测试实际使用的应用程序,因为它可能保留缓存或采用不同的解析器。记录持久化覆盖项,以免它们在用途结束后仍悄然存在。

为什么要使用专用测试名称,而不覆盖公共服务名称?

解析器服务器配置

传统上,/etc/resolv.conf 列出 DNS 解析器设置,但它往往由 NetworkManager、systemd-resolved、DHCP 或其他管理器生成。应先检查符号链接和文件注释,然后修改负责生成它的配置源,而不是编辑随后会被覆盖的生成文件。

编辑 /etc/resolv.conf 前应该做什么?

课程已完成

你已完成 /etc/hosts

现在,你可以把 /etc/hosts 用作受控的本地解析器输入。

  • 以地址开头编写映射,并有意识地选择名称和别名。

  • 检查名称服务切换顺序,不要自行假定。

  • getent 测试系统解析,用 dig 单独测试 DNS。

  • 使用专用临时名称,并验证实际应用程序。

  • 通过配置所有者修改解析器服务器。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
下一节
返回 DNS