在管理和维护 CentOS 服务器时,理解并正确配置 DNS 与主机名解析是至关重要的基础技能,这直接关系到服务器能否与网络中的其他设备顺畅通信,以及能否通过友好的名称而非难以记忆的 IP 地址来访问服务,本文将深入探讨在 CentOS 环境下,本地主机文件(/etc/hosts)与 DNS 解析配置(/etc/resolv.conf 及 NetworkManager)的工作原理、配置方法及其协同关系。

本地主机名解析:/etc/hosts 文件
/etc/hosts 是一个存在于所有类 Unix 操作系统(包括 CentOS)中的纯文本文件,它的作用是在本地提供一个静态的、优先级最高的主机名到 IP 地址的映射关系,当系统尝试解析一个主机名时,它会首先查询这个文件。
文件格式与解析优先级
/etc/hosts 文件的每一行通常包含三个字段,由空格或制表符分隔:
IP_address hostname aliases
- IP_address: 目标主机的 IP 地址(IPv4 或 IPv6)。
- hostname: 规范的主机名,通常是完全限定域名(FQDN)。
- aliases: (可选) 主机名的别名,可以有多个。
一个典型的 CentOS 默认 hosts 文件如下所示:
0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
这两行分别定义了 IPv4 和 IPv6 环境下的本地回环地址,关键在于,/etc/hosts 的解析优先级高于 DNS 服务器,这意味着,如果一个主机名同时存在于 hosts 文件和 DNS 记录中,系统将无条件采用 hosts 文件中定义的 IP 地址。
如何编辑 /etc/hosts
编辑此文件需要 root 权限,你可以使用 vi、nano 等文本编辑器,为了方便本地开发,我们希望将域名 dev.example.com 指向本地服务器的 IP 168.1.50。

-
使用 sudo 打开文件:
sudo vi /etc/hosts
-
在文件末尾添加新的一行:
168.1.50 dev.example.com dev -
保存并退出编辑器,此后,任何在服务器上对
dev.example.com或dev的访问请求都会被直接指向168.1.50,而不会去查询外部 DNS。
DNS 解析配置:/etc/resolv.conf 与 NetworkManager
当一个主机名在 /etc/hosts 中找不到对应条目时,系统便会转向 DNS 服务器进行查询。/etc/resolv.conf 文件正是用来指定系统使用哪些 DNS 服务器的配置文件。
/etc/resolv.conf 的核心指令
- nameserver: 指定 DNS 服务器的 IP 地址,可以指定多个,系统会按顺序依次查询,直到获得响应或查询失败。
nameserver 8.8.8.8 nameserver 8.8.4.4 - search: 定义一个域名列表,当查询一个不包含点(如
server1)的主机名时,系统会自动尝试依次附加这些域名进行查询,如果search mydomain.com local,查询server1会依次尝试server1.mydomain.com和server1.local。search mydomain.com - domain: (可选) 定义本地域名,功能与
search类似,但只能指定一个域名。
现代 CentOS 中的持久化配置
在较新的 CentOS 版本(如 7, 8, 9)中,直接手动编辑 /etc/resolv.conf 文件通常不是最佳实践,因为网络服务由 NetworkManager 管理,它在重启或网络配置变更时会覆盖此文件。
为了使 DNS 配置持久化,推荐使用 nmcli(NetworkManager 命令行工具)来修改网络连接的配置,为名为 eth0 的网络接口设置 DNS 服务器:

# 设置 DNS 服务器 sudo nmcli con mod eth0 ipv4.dns "8.8.8.8 1.1.1.1" # 设置 DNS 搜索域 sudo nmcli con mod eth0 ipv4.dns-search "mydomain.com" # 重启网络连接以应用更改 sudo nmcli con down eth0 && sudo nmcli con up eth0
通过这种方式,NetworkManager 会自动生成并维护正确的 /etc/resolv.conf 文件,确保配置在网络重启后依然有效。
为了更清晰地理解两者的关系,可以参考下表:
| 特性 | /etc/hosts |
/etc/resolv.conf (DNS) |
|---|---|---|
| 作用范围 | 本机单台 | 整个网络(通过DNS服务器) |
| 解析优先级 | 高 | 低(在hosts之后查询) |
| 动态性 | 静态,需手动编辑 | 动态,由DNS服务器响应 |
| 适用场景 | 本地开发、测试、屏蔽特定域名、加速常用域名访问 | 解析互联网域名、内部网络服务域名 |
| 管理方式 | 直接编辑文本文件 | 推荐使用 nmcli 等工具管理 |
当一个应用程序(如 ping 或 curl)需要解析主机名时,CentOS 系统遵循以下顺序:
- 查询
/etc/hosts文件,如果找到匹配项,立即返回对应的 IP 地址。 - 如果未找到,则查询
/etc/resolv.conf中配置的nameserver,向 DNS 服务器发起查询请求。
掌握这一流程对于网络故障排查至关重要,当你发现一个域名解析的 IP 地址不符合预期时,首先就应该检查 /etc/hosts 文件中是否存在覆盖条目。
相关问答FAQs
Q1: 我编辑了 /etc/resolv.conf 文件添加了新的 DNS 服务器,但重启服务器后配置就消失了,这是为什么?
A: 这是因为在现代的 CentOS 版本中,网络配置(包括 DNS)由 NetworkManager 服务统一管理。NetworkManager 会在网络启动或重置时根据其自身的配置数据库重新生成 /etc/resolv.conf 文件,从而覆盖你的手动修改,为了使 DNS 配置永久生效,你应该使用 nmcli 命令来修改网络连接的属性,sudo nmcli con mod <连接名称> ipv4.dns "你的DNS服务器地址",然后重启连接,这样,NetworkManager 就会将你的设置持久化保存。
Q2: 如果我在 /etc/hosts 文件和公共 DNS 服务器中都设置了同一个域名(www.google.com),但指向了不同的 IP 地址,我的浏览器最终会访问哪一个?
A: 你的浏览器最终会访问 /etc/hosts 文件中指定的 IP 地址,如前所述,Linux 系统的名称解析顺序是优先查询本地的 /etc/hosts 文件,只有当在该文件中找不到匹配的主机名条目时,系统才会继续向 /etc/resolv.conf 中指定的 DNS 服务器发起查询。/etc/hosts 文件中的配置具有最高的优先级,可以用来强制将某个域名指向任意 IP 地址,常用于开发测试或屏蔽恶意网站。