localhost 是计算机用来指代自身的主机名。当程序连接到 localhost 时,它连接回同一台机器,因此网络流量停留在本地,而不会发往外部网络。
本指南讲解什么是 localhost,它如何映射到 127.0.0.1 和 ::1 等回环地址,以及它在开发、测试和网络诊断中如何使用。示例使用了 Linux 命令,但核心概念同样适用于 Linux、macOS、Windows、BSD 及其他联网系统。
localhost 的含义
每个现代操作系统都有一个特殊的虚拟网络接口,称为回环接口(loopback interface)。与物理网卡不同,回环接口完全存在于软件中。发往它的任何数据包都会立即被路由回同一台机器,而不经过任何硬件或外部网络。
在 IPv4 中,回环接口被分配给 IP 地址 127.0.0.1。整个 127.0.0.0/8 网段都被 IETF 保留给回环使用,意味着从 127.0.0.1 到 127.255.255.254 的任意地址都会路由回本地机器。实际上,127.0.0.1 是标准使用的地址。
在 IPv6 中,回环地址是 ::1。
在 Linux 上,localhost 通常先通过 /etc/hosts 文件解析,然后再查询 DNS:
cat /etc/hosts
127.0.0.1 localhost 127.0.1.1 hostname # IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback
在大多数 Linux 系统上,/etc/hosts 中的条目会在 DNS 解析之前,依据 /etc/nsswitch.conf 中的解析器顺序被检查。某些系统还会通过 nss-myhostname 之类的 NSS 模块解析 localhost。其他操作系统也有相同的 localhost 概念,但 hosts 文件路径和解析器配置有所不同。
localhost、127.0.0.1 与 0.0.0.0 的区别
localhost、127.0.0.1 和 0.0.0.0 经常被一起提及,但它们的作用各不相同。
localhost是一个主机名。它通常解析为 IPv4 的127.0.0.1,也可能解析为 IPv6 的::1。127.0.0.1是标准的 IPv4 回环地址。连接到它始终意味着连接到同一台机器。::1是 IPv6 回环地址。它的作用与127.0.0.1相同,但用于 IPv6 流量。0.0.0.0不是回环地址。当服务器绑定到0.0.0.0时,它会监听所有可用的 IPv4 接口,包括回环接口和面向网络的接口。
对于仅本地的开发,将服务绑定到 localhost 或 127.0.0.1。要让服务能被网络上其他设备访问,则将其绑定到机器的局域网 IP 或 0.0.0.0,并确保防火墙放行该端口。
回环流量如何工作
当你向 127.0.0.1 或 localhost 发送请求时,TCP/IP 协议栈识别出回环地址,并在内部将数据包路由回同一台机器。流量不会到达物理网络接口(NIC),也不会经过任何路由器或外部网络。
这与普通网络流量不同——普通流量通过物理或虚拟网络接口发出,由路由器转发,并跨越网络到达目的地。
在 Linux 上,你可以用 ip 命令验证回环接口处于活动状态:
ip a show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
用 ping 测试回环
在 Linux 上,你可以使用 ping 命令验证回环接口是否工作:
ping -c 4 localhost
PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.035 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.043 ms 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.041 ms 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.040 ms --- localhost ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3075ms
接近零的响应时间证明流量没有离开本机。
localhost 与端口号
仅有主机名不足以访问一个服务。地址 localhost 标识机器,端口号则标识这台机器上接收连接的程序。这就是为什么本地开发 URL 形如 http://localhost:8080 而不只是 http://localhost。
当你打开不带端口的 http://localhost 时,浏览器会填入该方案的默认端口——http 是 80,https 是 443。监听在 8080 端口的开发服务器无法通过这种方式访问,浏览器会报告连接被拒绝。
要查看哪些程序正在监听 TCP 连接,以及它们使用的地址和端口,运行 ss 命令:
sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("node",pid=2841,fd=21))
LISTEN 0 4096 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=1044,fd=7))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=445,fd=3))
LISTEN 0 511 *:80 *:* users:(("nginx",pid=1190,fd=6))
Local Address:Port 列是你要读取的部分。127.0.0.1:8080 表示服务只接受来自同一机器的连接,因此 http://localhost:8080 可用,而来自其他设备的请求则不行。0.0.0.0:22 表示服务监听每个 IPv4 接口。视系统而定,*:80 可以表示一个地址族的通配监听。这些服务可能接受来自其他设备的连接,但实际可达性还取决于防火墙、路由和网络配置。检查监听端口的指南涵盖了 netstat 和 lsof 的等价用法。
在默认的 Linux 系统上,进程需要 CAP_NET_BIND_SERVICE 能力才能绑定到 1024 以下的端口。Root 通常拥有该能力,但也可以授予非 Root 服务,且特权端口阈值可配置。这也是开发服务器默认使用 3000、5000、8000、8080 等较高端口的原因之一。
常见用例
应用开发与测试
Web 服务器和开发工具在本地运行时,默认绑定到 localhost 或 127.0.0.1。这使应用只能从同一台机器访问,而不能从网络访问。例如,运行在 8080 端口的本地 Web 服务器通过 http://localhost:8080 访问。
为测试覆盖域名
你可以在 /etc/hosts 中将域名映射到回环地址,将其流量重定向到本地服务器。例如,添加下面这行会把对 example.com 的所有请求路由到你的本地机器:
127.0.0.1 example.com
这在部署前用其生产域名在本地测试站点时很有用。
屏蔽域名
在 /etc/hosts 中将域名映射到 127.0.0.1 会把对它的请求留在本地机器,但监听该请求端口的本地服务仍可能应答。一些屏蔽列表用 0.0.0.0 作为捷径,但它是未指定地址而非回环地址,客户端对其处理并不一致。要实现可靠的屏蔽,应使用 DNS 过滤或浏览器层面的拦截器。
网络诊断
ping 127.0.0.1 可确认本地机器的 TCP/IP 协议栈工作正常,且与网络硬件或连通性无关。如果 ping 127.0.0.1 失败,说明本地网络协议栈本身存在问题。
故障排查
localhost 拒绝连接
你请求的地址和端口上没有进程在监听。确认服务正在运行,然后用 sudo ss -tlnp 检查它实际绑定到了哪里。即使进程正常运行,如果服务监听的端口与 URL 中的不同,也会产生此错误。
服务在 127.0.0.1 上应答,但在 localhost 上不应答localhost 可以解析为 ::1 和 127.0.0.1,而遵循系统解析器顺序的客户端会先尝试 IPv6 地址。当服务只绑定到 127.0.0.1 时,第一次尝试会被拒绝,且不回退到 IPv4 的客户端就会停在那里。检查你的解析器返回的顺序:
getent ahosts localhost
::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM localhost 127.0.0.1 DGRAM 127.0.0.1 RAW
要么将服务配置为同时监听 ::1,要么在 URL 中显式使用 127.0.0.1 而非 localhost。
bind: address already in use
同一地址上已有另一个进程占用了该端口。注意 127.0.0.1:8080 与 0.0.0.0:8080 会冲突,因为 0.0.0.0 也覆盖了回环地址。参见如何找出占用端口的进程来识别并停止它。
新的 /etc/hosts 条目没有生效
该文件在新的连接时读取,但浏览器和长期运行的应用程序会缓存已解析的名称。请重启客户端,在运行 systemd-resolved 的系统上用 sudo resolvectl flush-caches 刷新缓存。还要检查是否有将同一主机名映射到不同地址的重复条目。解析器可能返回多个地址,应用程序可能选择了一个你没预料到的。
ping localhost 报告未知主机
先检查 getent hosts localhost 的结果。Linux 可通过 /etc/hosts 或 nss-myhostname 之类的 NSS 模块解析 localhost,因此该错误可能意味着 hosts 条目缺失或 /etc/nsswitch.conf 中的解析器顺序配置错误。如果系统使用 files 来源且映射缺失,请恢复 127.0.0.1 localhost。你也可以用 ping -c 4 127.0.0.1 跳过名称解析来测试。如果地址本身不可达,用 ip a show lo 检查回环接口是否处于 UP 状态,并在标志中查找 UP。
快速参考
| 任务 | 命令 / 值 |
|---|---|
| localhost 主机名 | localhost |
| IPv4 回环地址 | 127.0.0.1 |
| IPv6 回环地址 | ::1 |
| 查看 hosts 映射 | cat /etc/hosts |
| 检查回环接口 | ip a show lo |
| 测试回环连通性 | ping -c 4 localhost |
| 仅监听 localhost | 将服务绑定到 127.0.0.1 |
| 监听所有接口 | 将服务绑定到 0.0.0.0 |
常见问题
localhost 和 127.0.0.1 有什么区别?
两者都指回本地机器,但并不完全相同。localhost 是一个主机名,系统解析器可将其映射到 IPv4 地址 127.0.0.1、IPv6 地址 ::1 或两者。使用 127.0.0.1 会跳过主机名解析,直接选择 IPv4。
什么是 0.0.0.0?0.0.0.0 与 localhost 不同。当服务器绑定到 0.0.0.0 时,它会监听所有可用的网络接口,包括回环、局域网及其他接口。当服务器绑定到 127.0.0.1 时,它只接受来自本地机器的连接。
其他设备能连接到我的 localhost 吗?
不能。发往 127.0.0.1 或 localhost 的流量永远不会离开本机。网络上的其他设备无法访问仅绑定到回环接口的服务。要允许外部连接,服务必须绑定到机器的局域网 IP 或 0.0.0.0。
localhost 的 IPv6 等价是什么?
IPv6 回环地址是 ::1。对于 IPv6 流量,它的行为与 127.0.0.1 相同。
为什么我的应用使用 localhost 上的 3000、8080 或 8000 端口?
这些是各种 Web 框架和工具常用的默认开发端口。在默认的 Linux 系统上,80(HTTP)和 443(HTTPS)端口需要 CAP_NET_BIND_SERVICE 能力。更高的端口号不需要该能力,因此开发服务器可以在非特权用户下运行。
结论
localhost 通过回环接口指回当前机器,通常 IPv4 为 127.0.0.1,IPv6 为 ::1。当流量应停留在同一台计算机上时,用它进行本地开发、测试、域名覆盖和网络诊断。
要自定义系统上主机名的解析方式,请参阅编辑 /etc/hosts 文件的指南。