ERR_CONNECTION_REFUSED:其含义及完整修复方法
ERR_CONNECTION_REFUSED 错误意味着您的浏览器向网络服务器发送了连接请求,而该服务器主动拒绝了它——不是忽略它,而是明确拒绝了 TCP 握手。这与超时(ERR_CONNECTION_TIMED_OUT)或 DNS 故障(ERR_NAME_NOT_RESOLVED)是根本不同的故障模式,这种区别在诊断根本原因时至关重要。
实际上,当 Chrome 显示”无法访问此网站。ERR_CONNECTION_REFUSED”时,意味着以下三种情况之一:目标服务器未在请求的端口上监听,防火墙或安全层正在向您的客户端发送 TCP RST(重置)数据包,或者您的本地网络堆栈配置错误,在请求到达服务器之前就将其错误路由。确定这三种情况中哪一种适用于您的情况,是最快找到解决方案的途径。
了解 TCP 层机制
大多数浏览器故障排除指南将 ERR_CONNECTION_REFUSED 视为模糊的”网络问题”。事实并非如此。在 TCP 层,连接被拒绝意味着服务器(或中间设备)响应您浏览器的 SYN 数据包时发回了 RST/ACK 数据包。这是明确的拒绝,而非静默丢弃。
这种区别具有实际的诊断意义:如果连接被防火墙静默丢弃,您将看到 ERR_CONNECTION_TIMED_OUT。连接被拒绝意味着某些东西正在主动响应——这意味着主机在网络层是可达的,但目标端口上的服务不可用或被阻止。
常见的端口级原因包括:
- 网络服务器进程(Apache、Nginx、Node.js)已崩溃或停止
- 服务器正在非标准端口上监听,而 URL 未指定该端口
- 基于主机的防火墙(iptables、ufw、Windows Defender 防火墙)正在拒绝端口 80 或 443 上的连接
- 反向代理(HAProxy、Nginx、Cloudflare)配置不正确,向上游返回 RST 数据包
- 代理后面的应用程序已崩溃,导致代理没有可转发的后端
根本原因:结构化分析
客户端原因
| 原因 | 机制 | 诊断信号 |
|---|---|---|
| — | — | — |
| 浏览器缓存损坏 | 过期的缓存重定向或连接数据 | 错误仅在一个浏览器中出现 |
| 代理设置配置错误 | 浏览器通过失效代理路由流量 | 所有网站或特定域名出现错误 |
| DNS 缓存过期 | 缓存的 IP 指向不再托管该网站的服务器 | `nslookup` 返回与缓存不同的 IP |
| 浏览器过时 | TLS 协商失败被误报为连接拒绝 | 在更新的浏览器中错误消失 |
| VPN 或隧道配置错误 | 流量通过无法正常工作的出口节点路由 | 禁用 VPN 后错误消失 |
| 防病毒/防火墙拦截 | 安全软件代表操作系统发送 RST | 禁用软件后错误消失 |
服务器端原因
| 原因 | 机制 | 诊断信号 |
|---|---|---|
| — | — | — |
| 网络服务器进程停止 | 端口 80/443 上无监听器 | `curl -v` 显示”连接被拒绝” |
| 端口配置错误 | 服务器绑定到错误的接口或端口 | `netstat -tlnp` 显示预期端口上无监听器 |
| SSL 证书错误导致崩溃 | TLS 配置错误导致服务器拒绝 HTTPS | 仅在 HTTPS 上出现错误,HTTP 正常 |
| 资源耗尽 | 服务器文件描述符或内存不足 | 错误间歇性出现,通常在高负载下 |
| IP 地址更改但 DNS 未传播 | DNS 仍解析到旧的已停用 IP | `dig` 显示旧 IP,新服务器在其他位置 |
| 服务器上的防火墙规则 | 针对客户端 IP 范围的 iptables DROP 或 REJECT 规则 | 仅特定用户/地区出现错误 |
分步诊断和修复指南
第 1 步:确定问题是全局性的还是本地性的
在修改任何本地设置之前,先确认网站是对所有人都无法访问,还是仅对您无法访问。使用以下工具:
- downforeveryoneorjustme.com — 简单的上线/下线检查
- isitdownrightnow.com — 包含响应时间历史记录
- ping.pe — 同时从全球多个位置 ping 目标
如果网站可以从外部节点访问,但无法从您的机器访问,则问题在本地。如果全球范围内均无法访问,则问题在服务器端,超出您的控制范围——请联系网站管理员或等待。
对于管理自己基础设施的服务器管理员,全球无法访问的网站需要立即调查网络服务器进程、防火墙规则和上游网络。如果您正在运行 VPS 托管环境,请首先检查服务器的进程列表和防火墙配置。
第 2 步:验证服务器是否正在监听(针对服务器管理员)
如果您管理相关服务器,请通过 SSH 登录并运行以下命令,确认哪些端口上有监听:
sudo ss -tlnp | grep -E ':80|:443'如果端口 80 或 443 的输出为空,则您的网络服务器进程未在运行。重启它:
# For Nginx
sudo systemctl restart nginx
# For Apache
sudo systemctl restart apache2
# Check status
sudo systemctl status nginx同时验证您的防火墙是否阻止了入站连接:
# Check iptables rules
sudo iptables -L INPUT -n -v
# If using ufw
sudo ufw status verbose如果端口 443 被阻止,请允许它:
sudo ufw allow 443/tcp
sudo ufw allow 80/tcp
sudo ufw reload对于运行独立服务器的管理员,还需检查您的托管服务提供商的上游防火墙或安全组规则是否在网络边界处阻止了该端口——这与操作系统级防火墙是分开的。
第 3 步:重启路由器并清除本地网络状态
对于客户端问题,重启路由器可以清除 NAT 表、DHCP 租约以及任何瞬态路由故障。拔掉路由器电源 30 秒,然后重新连接。当错误在没有任何配置更改的情况下突然出现时,此方法尤为有效。
第 4 步:刷新 DNS 缓存
指向旧的或已停用 IP 地址的过期 DNS 缓存条目是客户端出现 ERR_CONNECTION_REFUSED 的最常见原因之一。缓存 IP 处的服务器可能不再运行目标网站。
在 Windows 上:
ipconfig /flushdns在 macOS 上(Ventura、Sonoma 及大多数现代版本):
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder在 Linux 上(systemd-resolved):
sudo systemd-resolve --flush-caches刷新后,验证域名现在解析到哪个 IP:
nslookup example.com
# or
dig +short example.com将其与网站的已知 IP 进行比较。如果不同,DNS 传播可能仍在进行中。
第 5 步:清除浏览器缓存和 Cookie
在 Google Chrome 中,导航到 chrome://settings/clearBrowserData 或使用键盘快捷键:
- Windows/Linux:
Ctrl + Shift + Delete - macOS:
Cmd + Shift + Delete
将时间范围设置为所有时间,勾选缓存的图片和文件以及 Cookie 和其他网站数据,然后点击清除数据。在重新测试之前,完全重启 Chrome(不仅仅是标签页)。
如需快速测试而不清除数据,请打开无痕窗口(Ctrl + Shift + N)。如果网站在无痕模式下可以加载,但在普通窗口中无法加载,则问题出在缓存资源或浏览器扩展程序上。
第 6 步:审查并禁用代理设置
配置错误或失效的代理服务器是所有网站同时出现 ERR_CONNECTION_REFUSED 的常见原因。Chrome 默认使用系统代理设置。
在 Windows 上:
导航到设置 > 系统 > 代理,如果”使用代理服务器”在您不知情的情况下被启用,请将其禁用。或者,从提升权限的命令提示符运行:
netsh winhttp reset proxy在 macOS 上:
前往系统设置 > 网络,选择您的活动接口,点击详细信息,然后点击代理选项卡,取消勾选所有活动的代理协议。
禁用代理后,测试网站。如果可以加载,则代理配置是原因所在。请正确重新配置或完全删除它。
第 7 步:更改 DNS 解析器
您的 ISP 默认 DNS 解析器可能返回不正确的结果、遭遇中断,或主动屏蔽某些域名。切换到公共解析器可以排除这一变量。
推荐的公共 DNS 解析器:
| 提供商 | 主要 DNS | 次要 DNS | 特性 |
|---|---|---|---|
| — | — | — | — |
| Google Public DNS | `8.8.8.8` | `8.8.4.4` | 高可用性,全球任播 |
| Cloudflare | `1.1.1.1` | `1.0.0.1` | 平均响应时间最快,注重隐私 |
| OpenDNS | `208.67.222.222` | `208.67.220.220` | 内容过滤选项 |
| Quad9 | `9.9.9.9` | `149.112.112.112` | 恶意软件拦截,尊重隐私 |
在 Windows 上(通过 PowerShell):
Set-DnsClientServerAddress -InterfaceAlias "Wi-Fi" -ServerAddresses ("1.1.1.1","1.0.0.1")在 macOS 上:
前往系统设置 > 网络 > [您的接口] > 详细信息 > DNS,删除现有条目,并添加 1.1.1.1 和 1.0.0.1。
在 Linux 上(systemd-resolved):
编辑 /etc/systemd/resolved.conf:
[Resolve]
DNS=1.1.1.1 1.0.0.1
FallbackDNS=8.8.8.8 8.8.4.4然后重启解析器:
sudo systemctl restart systemd-resolved第 8 步:临时禁用防火墙和防病毒软件
某些防病毒产品和基于主机的防火墙通过本地代理拦截 HTTPS 流量,当其检测引擎失败或目标域名在屏蔽列表中时,可能会发出 RST 数据包。临时禁用它们(仅用于诊断目的)可以确认它们是否是原因所在。
如果禁用安全软件解决了错误,请为目标域名添加特定例外,而不是让软件保持禁用状态。测试后立即重新启用它。
第 9 步:使用不同的浏览器和网络进行测试
在 Firefox、Edge 或 Safari 中测试该 URL。如果在其他浏览器中可以加载,则问题特定于 Chrome——可能是配置文件损坏、扩展程序故障或 Chrome 特定的代理设置。尝试创建新的 Chrome 配置文件以隔离问题。
如果网站在所有浏览器中都无法访问,请切换到移动热点。如果通过移动数据可以加载,则您的 ISP 或家庭路由器是问题所在。
第 10 步:检查 SSL/TLS 配置问题(服务器管理员)
SSL 证书配置错误可能导致服务器崩溃或拒绝 TLS 连接,在某些边缘情况下,Chrome 将其报告为 ERR_CONNECTION_REFUSED 而非证书错误。使用以下命令从命令行进行测试:
curl -vI https://yourdomain.com在详细输出中查找 TLS 握手阶段。此处的失败表明存在证书或密码套件问题。您也可以使用以下命令进行测试:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com如果您的 SSL 证书已过期或配置错误,续期或更换证书即可解决问题。确保您的 SSL 证书有效、链完整,并安装在正确的服务器接口上。
ERR_CONNECTION_REFUSED 与类似浏览器错误的比较
了解此错误与相关错误的区别可以防止误诊:
| 错误代码 | TCP 行为 | 最可能的原因 |
|---|---|---|
| — | — | — |
| `ERR_CONNECTION_REFUSED` | 服务器发送 RST 数据包 | 服务未运行,防火墙 REJECT 规则,失效代理 |
| `ERR_CONNECTION_TIMED_OUT` | 无响应(数据包被丢弃) | 防火墙 DROP 规则,路由故障,服务器过载 |
| `ERR_NAME_NOT_RESOLVED` | DNS 查询失败 | DNS 配置错误,域名不存在 |
| `ERR_SSL_PROTOCOL_ERROR` | TLS 握手失败 | TLS 版本不匹配,证书错误 |
| `ERR_EMPTY_RESPONSE` | 连接建立,无数据发送 | 服务器接受连接但应用程序立即崩溃 |
| `ERR_ADDRESS_UNREACHABLE` | 无路由到达主机 | 路由表问题,接口停止 |
高级边缘情况和注意事项
IPv6 与 IPv4 解析冲突:如果域名解析到 IPv6 地址,但您的网络不能正确支持 IPv6,Chrome 可能会尝试被拒绝的 IPv6 连接,然后无法快速回退到 IPv4。临时禁用网络适配器上的 IPv6 可以确认这一点。在 Linux 上,您可以使用 curl -4 https://example.com 强制使用 IPv4。
Cloudflare 或 CDN 缓存过期的源站错误:如果网站使用 Cloudflare 且源站服务器宕机,Cloudflare 可能会暂时提供缓存版本,然后开始返回 521(源站拒绝连接)或 522 错误,根据错误的代理方式,Chrome 可能将其显示为 ERR_CONNECTION_REFUSED。
本地开发环境:开发人员在访问 localhost:3000 或类似地址时经常看到 ERR_CONNECTION_REFUSED。原因几乎总是开发服务器进程未运行、已崩溃,或绑定到与预期不同的端口上的 127.0.0.1。运行 ss -tlnp | grep node(或相关进程)以确认实际监听的内容。
邮件服务器端口冲突:如果您在同一台服务器上运行邮件托管和网络应用程序,请确保 SMTP(25、587)、IMAP(993)和 HTTP/HTTPS(80、443)之间的端口冲突不会导致网络服务器无法绑定。
共享托管限制:在共享网络托管环境中,连接拒绝可能表明托管服务提供商的服务器过载、账户已被暂停,或域名的 DNS 尚未指向正确的共享 IP。请检查您的托管控制面板中的账户状态和 DNS 配置。
实用决策矩阵:优先应用哪种修复方案
使用此检查清单进行高效分类:
- 错误同时出现在所有网站上 — 首先检查代理设置和 VPN/防火墙配置
- 错误仅出现在某个特定域名上 — 检查网站是否全局宕机;然后刷新 DNS 缓存
- 错误仅在 Chrome 中出现,其他浏览器正常 — 清除 Chrome 缓存,禁用扩展程序,或创建新的 Chrome 配置文件
- 错误仅在您的网络上出现,移动数据正常 — 重启路由器;检查 ISP 级别的 DNS 或防火墙
- 错误在服务器配置更改后出现 — 检查服务器上的网络服务器进程状态、端口绑定和防火墙规则
- 错误在高负载下间歇性出现 — 调查服务器上的资源耗尽情况(文件描述符、内存、连接限制)
- 错误仅在 HTTPS 上出现,HTTP 正常 — 调查 SSL 证书有效性和 TLS 配置
- 错误在更改 DNS 设置后出现 — 还原 DNS 更改并刷新缓存;验证新解析器是否可达
常见问题
ERR_CONNECTION_REFUSED 和 ERR_CONNECTION_TIMED_OUT 有什么区别?
ERR_CONNECTION_REFUSED 意味着服务器(或防火墙)主动发送了 TCP 重置数据包,立即拒绝连接。ERR_CONNECTION_TIMED_OUT 意味着在超时期间内未收到响应——数据包被静默丢弃。连接被拒绝出现得更快,表明主动拒绝,而超时则表明路由或防火墙 DROP 规则。
ERR_CONNECTION_REFUSED 可能由过期的 SSL 证书引起吗?
间接地,是的。在某些服务器配置中,过期或配置错误的 SSL 证书会导致网络服务器进程在启动时失败,或在处理 TLS 连接时崩溃,导致端口 443 上没有监听器。Chrome 随后报告 ERR_CONNECTION_REFUSED,因为没有任何东西在监听,即使根本原因是证书问题。
为什么 ERR_CONNECTION_REFUSED 只出现在某个特定网站上?
如果错误仅限于单个域名,最可能的原因是:目标服务器的网络服务已崩溃,服务器的防火墙正在阻止您的 IP 范围,域名的 DNS 记录指向没有运行任何服务的旧 IP 地址,或者网站已被关闭。从不同的网络或服务器使用 curl -v https://thatdomain.com 来隔离原因。
如何修复 localhost 上的 ERR_CONNECTION_REFUSED?
应用服务器未运行或绑定到与您请求的不同端口。在 Linux/macOS 上使用 ss -tlnp,或在 Windows 上使用 netstat -ano | findstr :PORT 确认监听内容。启动应用服务器进程,并确保它绑定到预期端口上的 0.0.0.0 或 127.0.0.1。
刷新 DNS 总能修复 ERR_CONNECTION_REFUSED 吗?
仅当根本原因是过期的 DNS 缓存条目指向服务不再运行的 IP 地址时才有效。如果服务器宕机、防火墙阻止连接或代理配置错误,刷新 DNS 将不起作用。在刷新前后使用 dig 或 nslookup 验证 DNS 解析,以确认 DNS 是否确实是问题所在。
