所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 域名系统

掌握 Linux Hosts 文件:本地 DNS 控制完整指南

无论你是一个开发者在测试新应用程序,一个系统管理员在排查DNS传播问题,还是仅仅想要屏蔽令人分心的网站,/etc/hosts 文件是任何Linux系统上最强大且被充分利用不足的工具之一。本指南提供了一个深入的、实用的演练,涵盖了你需要了解的一切——从理解hosts文件是什么到在你的VPS Hosting环境中安全地编辑它。

1. 什么是 Hosts 文件?{#what-is-the-hosts-file}

hosts 文件是一个纯文本系统文件,将人类可读的主机名(如 www.example.com)映射到其对应的 IP 地址。它充当本地静态 DNS 解析器,关键是操作系统在进行任何外部 DNS 查询*之前*会查询它。

这意味着 hosts 文件中的条目优先级绝对高于外部名称服务器返回的 DNS 记录。这一特性使其成为一个非常多功能的工具,可用于:

  • 本地开发环境 — 在不涉及实时 DNS 记录的情况下,使用真实域名测试网站。
  • DNS 故障排除 — 临时强制域名解析到特定 IP,以测试服务器配置。
  • 网站屏蔽 — 将不需要的域名重定向到不可路由的地址,有效阻止访问。
  • 暂存和上线前测试 — 在全局切换 DNS 之前预览新的服务器设置。
  • 网络安全 — 在操作系统级别阻止已知的恶意域名。

> 技术说明:在 Linux 上,解析顺序由 /etc/nsswitch.conf 文件管理。默认配置通常将 files(即 /etc/hosts)放在 dns 之前,确保始终首先检查本地条目。

2. Linux 上的 Hosts 文件位置在哪里?

在所有主要 Linux 发行版上——包括 Ubuntu、Debian、CentOS、Rocky Linux、AlmaLinux 和 Arch Linux——hosts 文件位于:

/etc/hosts

此路径在各发行版中是一致的,无论您使用什么环境都很容易使用。该文件由 root 拥有,编辑需要提升的权限。

/etc/hosts 的默认内容

新配置的 Linux 服务器——例如运行在 AlexHost VPS 托管上的服务器——通常包含类似以下的默认条目:

127.0.0.1       localhost
127.0.1.1       your-hostname.example.com your-hostname

# The following lines are desirable for IPv6 capable hosts
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

这些条目确保:

    localhost 始终解析为环回地址 127.0.0.1(IPv4)和 ::1(IPv6)。
    服务器自己的主机名在本地解析,无需外部 DNS 查询。
    
    除非您有特定且充分理解的原因,否则不要删除这些默认条目。删除它们可能会导致系统服务、邮件传递和应用程序框架出现意外行为。
    3. 理解Hosts文件的结构
    Hosts文件遵循简单、一致的格式。每个非空白、非注释行代表一个单一映射,并遵循以下语法:
    IP_address    hostname    [alias1]    [alias2]    ...
    
    
    
    
    字段
    描述
    
    
    
    
    IP_address
    主机名应解析到的IPv4或IPv6地址
    
    
    hostname
    主要的完全限定域名(FQDN)或短主机名
    
    
    alias(可选)
    一个或多个应解析到相同IP的其他名称
    
    
    
    
    关键格式规则
    
    空白符:字段由空格或制表符分隔。多个空格是可以接受的。
    注释:行上#字符后的任何文本都被视为注释,系统会忽略。
    大小写敏感性:主机名在实践中不区分大小写,但小写是约定俗成的做法。
    每行一个IP:每行以恰好一个IP地址开头,后跟一个或多个主机名。
    
    实际示例
    将单个域映射到localhost:
    127.0.0.1    example.com
    在一行上将多个主机名映射到相同的IP:
    127.0.0.1    example.com    www.example.com    staging.example.com
    通过将域指向不可路由的地址来阻止域:
    0.0.0.0    ads.tracker.com
    强制域解析到特定的远程服务器IP:
    203.0.113.42    mywebsite.com    www.mywebsite.com
    添加内联注释以供文档说明:
    # Local development environment - Project Alpha
    127.0.0.1    alpha.local    api.alpha.local
    
    # Blocked domains - updated 2025-01-15
    0.0.0.0    malicious-site.com
    4. 如何在 Linux 上编辑 Hosts 文件(分步指南)
    因为 /etc/hosts 是系统配置文件,你需要 root 或 sudo 权限来修改它。下面是一个完整的、生产环境安全的工作流程。
    步骤 1:编辑前创建备份
    这是一个不可协商的最佳实践。在进行任何更改之前,始终备份该文件:
    sudo cp /etc/hosts /etc/hosts.bak
    你可以验证备份是否已创建:
    ls -lh /etc/hosts*
    如果出现问题,可以立即恢复:
    sudo cp /etc/hosts.bak /etc/hosts
    步骤 2:用文本编辑器打开 Hosts 文件
    使用 nano(推荐给初学者和快速编辑):
    sudo nano /etc/hosts
    nano 用户友好,在屏幕底部显示键盘快捷键,在几乎所有 Linux 发行版上默认可用。
    使用 vim(有经验的管理员首选):
    sudo vim /etc/hosts
    使用 vi(在最小化安装中可用):
    sudo vi /etc/hosts
    步骤 3:添加、修改或删除条目
    文件打开后,导航到适当的位置并进行更改。以下是最常见的操作:
    添加新映射(附加到文件末尾):
    127.0.0.1    myproject.local    www.myproject.local
    阻止网站:
    0.0.0.0    facebook.com    www.facebook.com
    覆盖域的 DNS(例如,测试新服务器):
    198.51.100.25    mywebsite.com    www.mywebsite.com
    步骤 4:保存并退出编辑器
    在 nano 中:
    
    按 CTRL + O 写入(保存)文件。
    按 Enter 确认文件名。
    按 CTRL + X 退出。
    
    在 vim 或 vi 中:
    
    按 Esc 确保你处于命令模式。
    输入 :wq 并按 Enter 写入并退出。
    要不保存退出,输入 :q! 并按 Enter。
    
    步骤 5:验证更改的语法
    在测试之前,目视确认你的条目看起来正确:
    cat /etc/hosts
    你也可以使用 grep 快速查找特定条目:
    grep "myproject.local" /etc/hosts
    步骤 6:测试新映射
    使用 ping 验证主机名是否解析到预期的 IP 地址:
    ping -c 4 myproject.local
    对于被阻止的域(映射到 0.0.0.0 或 127.0.0.1),ping 应该失败或立即返回:
    ping -c 2 facebook.com
    你也可以使用 getent 进行更直接的 hosts 文件查询:
    getent hosts myproject.local
    此命令查询系统的名称解析堆栈(包括 /etc/hosts)并返回解析的 IP,使其比 ping 更可靠用于验证目的。
    5. Hosts 文件的常见用例
    5.1. 本地网络开发
    这可以说是开发人员中最常见的用例。与其通过 http://localhost:3000 或 http://127.0.0.1:8080 访问本地项目,你可以分配一个有意义的、类似生产环境的域名。
    示例设置:
    添加到 /etc/hosts:
    127.0.0.1    myproject.local    api.myproject.local    admin.myproject.local
    保存后,在浏览器中导航到 http://myproject.local。你的请求将在本地解析,无需接触外部 DNS 服务器。
    此方法特别有价值,当:
    
    你的应用程序使用虚拟主机并需要特定的 Host 标头。
    你在本地测试SSL 证书(使用映射到正确域名的自签名证书)。
    你需要模拟多子域架构(例如 api.、admin.、cdn.)。
    
    如果你在带有 cPanel 的 VPS 上运行多个项目,hosts 文件也可以帮助你在 DNS 传播完成前测试域名配置。
    5.2. 阻止不需要的网站
    Hosts 文件是一个轻量级、零依赖的内容阻止器。通过将域重定向到 0.0.0.0(相比 127.0.0.1 更优选,因为它失败更快,无需连接尝试),你可以在操作系统级别阻止访问 — 同时影响所有浏览器和应用程序。
    阻止社交媒体干扰:
    0.0.0.0    facebook.com    www.facebook.com
    0.0.0.0    twitter.com    www.twitter.com
    0.0.0.0    reddit.com    www.reddit.com
    阻止已知的广告投放或跟踪域:
    0.0.0.0    doubleclick.net
    0.0.0.0    ads.google.com
    0.0.0.0    tracking.example-analytics.com
    > 专业提示:社区维护的阻止列表(例如来自 StevenBlack hosts 项目的列表)将数万个广告、跟踪和恶意软件域编译成单个 hosts 文件格式,你可以将其合并到你的 /etc/hosts 中。
    5.3. 上线前服务器测试和 DNS 切换
    当将网站迁移到新服务器时 — 例如,从共享网络托管迁移到专用服务器 — DNS 传播可能需要几分钟到 48 小时。Hosts 文件让你可以立即从本地计算机预览新服务器,而不会影响其他用户。
    场景:你正在将 mywebsite.com 迁移到 IP 为 203.0.113.42 的新服务器。
    添加到你的本地 /etc/hosts:
    203.0.113.42    mywebsite.com    www.mywebsite.com
    现在,当你在浏览器中访问 mywebsite.com 时,你将看到新服务器的内容。全球其他访问者在 DNS 传播之前仍会看到旧服务器。确认一切正常工作后,删除该条目并让 DNS 接管。
    此技术对以下情况非常有价值:
    
    在上线前验证网络服务器配置。
    在新服务器上测试 SSL 证书。
    确认迁移后的电子邮件路由和应用程序行为。
    
    5.4. 绕过 DNS 解析故障
    如果 DNS 服务器暂时不可用或返回不正确的结果,你可以使用 hosts 文件作为紧急覆盖来恢复对关键服务的连接。
    示例:
    # Emergency override - DNS server outage 2025-01-15
    198.51.100.10    internal-api.company.com
    198.51.100.11    database.company.com
    一旦解决了底层 DNS 问题,请记住删除这些条目,以避免过时的映射在将来造成混淆。
    5.5. 多服务器开发环境
    在具有多个虚拟机或容器的复杂开发设置中,hosts 文件可以将友好名称映射到每个服务:
    192.168.1.10    db.local         # Database server
    192.168.1.11    cache.local      # Redis/Memcached
    192.168.1.12    queue.local      # Message broker
    192.168.1.13    search.local     # Elasticsearch
    这消除了记住 IP 地址的需要,使配置文件更具可读性和可移植性。
    6. 编辑后刷新 DNS 缓存
    在大多数现代 Linux 系统上,对 /etc/hosts 的更改对新连接立即生效。但是,如果您的系统或应用程序缓存 DNS 响应,您可能需要刷新该缓存以确保立即使用新的映射。
    对于使用 systemd-resolved 的系统(Ubuntu 18.04+、Debian 10+、大多数现代发行版):
    sudo systemctl restart systemd-resolved
    或者,刷新缓存而不进行完整重启:
    sudo resolvectl flush-caches
    验证缓存已刷新:
    sudo resolvectl statistics
    对于使用 nscd(名称服务缓存守护程序)的系统:
    sudo systemctl restart nscd
    对于使用 NetworkManager 的系统:
    sudo systemctl restart NetworkManager
    对于使用 dnsmasq 的系统:
    sudo systemctl restart dnsmasq
    检查您的系统使用哪个 DNS 解析器
    systemctl list-units --type=service | grep -E "resolved|nscd|dnsmasq|NetworkManager"
    > 浏览器缓存: 请注意,Web 浏览器维护自己的内部 DNS 缓存,独立于操作系统。修改 /etc/hosts 后,您可能还需要清除浏览器的 DNS 缓存。在 Chrome/Chromium 中,导航到 chrome://net-internals/#dns 并点击清除主机缓存。
    7. 最佳实践和安全考虑
    ✅ 编辑前始终备份
    sudo cp /etc/hosts /etc/hosts.bak.$(date +%Y%m%d_%H%M%S)
    在备份文件名中使用时间戳可以确保您可以跟踪多个版本。
    ✅ 使用注释记录您的更改
    # Added 2025-01-15 by admin@example.com - staging server test
    203.0.113.42    staging.mywebsite.com
    这在多人可能访问服务器的团队环境中尤为重要。
    ✅ 及时删除临时条目
    为测试或紧急覆盖添加的条目应在不再需要时立即删除。陈旧的条目可能会在几个月后导致难以诊断的连接问题。
    ✅ 验证您的语法
    格式不正确的 hosts 文件条目不会导致系统崩溃,但会无声地解析失败。始终使用以下方式仔细检查您的条目:
    getent hosts <hostname>
    ⚠️ 安全警告:Hosts 文件劫持
    恶意软件有时会修改 /etc/hosts 以将合法域名(例如银行网站或更新服务器)重定向到攻击者控制的 IP。这是一种称为 hosts 文件劫持的已知攻击向量。
    通过以下方式防护:
    
    设置限制性文件权限:sudo chmod 644 /etc/hosts
  • 使用 auditdAIDE 等工具监控文件的未授权更改。
  • 定期审查文件内容:cat /etc/hosts
  • ⚠️ Hosts 文件不是适当 DNS 的替代品

    对于生产环境,hosts 文件应仅用于临时覆盖和本地开发。对于永久域名管理,始终使用适当的 DNS 记录。如果您需要专业地注册和管理域名,通过可靠的提供商进行 域名注册可确保您的 DNS 基础设施强大且可扩展。

    8. 结论

    /etc/hosts 文件是每个 Linux 管理员和开发人员工具包中看似简单但功能强大的工具。它能够在本地覆盖 DNS 解析 — 零延迟、无外部依赖、无基础设施更改 — 使其对以下用途不可或缺:

    • 开发人员在本地构建和测试应用程序。
    • 系统管理员管理服务器迁移和 DNS 切换窗口。
    • 安全意识强的用户阻止恶意或不需要的域。
    • DevOps 工程师编排多服务本地环境。

    本指南的关键要点:

    任务命令 / 操作
    打开 hosts 文件sudo nano /etc/hosts
    编辑前备份sudo cp /etc/hosts /etc/hosts.bak
    验证映射getent hosts <hostname>
    使用 ping 测试ping -c 4 <hostname>
    刷新 DNS 缓存sudo resolvectl flush-caches
    从备份恢复sudo cp /etc/hosts.bak /etc/hosts

    无论您是运行精简的开发环境还是在 AlexHost VPS 托管上管理生产服务器群,掌握 hosts 文件是一项基础技能,每次需要快速、可靠的本地 DNS 覆盖时都会带来回报。自信地编辑、记录您的更改,并始终保留备份 — 祝您路由愉快!