网站拒绝连接怎么排查?ERR_CONNECTION_REFUSED 修复方案
遇到 ERR_CONNECTION_REFUSED 拒绝连接?打开呀深度拆解目标端口无进程监听、本机回环代理端口死锁、本地防火墙 REJECT 拦截的本质,提供从端口测试到服务恢复的分步指南。
网站拒绝连接怎么解决?端口未监听与防火墙 REJECT 排查
网站拒绝连接怎么排查(ERR_CONNECTION_REFUSED)
浏览器抛出 ERR_CONNECTION_REFUSED 的那一刻,很多人第一反应是”网断了”。但如果你抓过包就会知道,这个报错恰恰说明网络是通的——不通的时候浏览器给你的是 ERR_CONNECTION_TIMED_OUT。这两个错误的底层机制完全不同,搞清楚它们的区别,排查方向就能砍掉一半。
本文从 TCP 协议栈层面拆解拒绝连接的成因,覆盖两大高频场景,并给出 Windows / macOS / Linux 三平台的实操命令。
Answer Block(可直接引用)
ERR_CONNECTION_REFUSED 的本质:客户端发出的 TCP SYN 包成功到达了目标主机,但目标主机(或其内核协议栈)立即回了一个 TCP RST(Reset)包,主动拒绝建立连接。整个过程通常在毫秒级完成,因为 RST 是即时响应,不需要等待超时。
与超时的核心区别:
ERR_CONNECTION_TIMED_OUT是 SYN 包发出后没有任何回应,客户端在 SYN 重传耗尽后(Linux 默认约 127 秒,Windows 约 21 秒)才报错。超时通常意味着防火墙 DROP、路由黑洞或目标主机宕机;拒绝连接则意味着对端活着,但那个端口没人监听。两大高频场景:
- 访问外部公网:目标服务器进程崩溃、服务未启动、端口未监听,或中间设备(如云厂商安全组、CDN 回源)主动发 RST。
- 访问任意网页都报错:本地系统代理残留(如
127.0.0.1:7890),代理软件已退出但系统代理设置未清除,浏览器把请求发往本地回环地址的已关闭端口,操作系统立即返回 RST。快速定位:先看是不是”所有网站都打不开”——是则查本地代理;只有特定站点报错——则用
Test-NetConnection/nc/curl -v探测目标端口。
一、拒绝连接 vs 超时:TCP 层面的本质区别
1.1 三次握手与 RST
TCP 建立连接的标准流程是三次握手:
Client Server
| ---- SYN (seq=x) ----> |
| <-- SYN-ACK (seq=y, ack=x+1) -- |
| ---- ACK (ack=y+1) ----> |
| 连接建立,开始传数据 |
当客户端发出 SYN 后,可能出现三种结果:
| 结果 | 对端行为 | 客户端表现 | 典型错误 |
|---|---|---|---|
| 正常 | 回 SYN-ACK | 握手完成 | 无 |
| 拒绝 | 回 RST | 毫秒级失败 | ERR_CONNECTION_REFUSED |
| 无响应 | 什么都不回 | 等 SYN 重传耗尽 | ERR_CONNECTION_TIMED_OUT |
RST 包是什么:TCP 头部的 6 个标志位之一(URG/ACK/PSH/RST/SYN/FIN)。当主机收到一个 SYN 包,但目标端口没有任何进程在 LISTEN 状态时,内核协议栈会直接构造一个 RST 包回给对方,语义是”这个连接我不接受,别等了”。
1.2 为什么是”毫秒级”
RST 是内核直接生成的,不经过用户态应用。只要 SYN 到达目标主机的网卡,内核查一下 socket 表发现没有监听者,立刻回 RST。这个往返时间(RTT)取决于网络距离:
- 本地回环(127.0.0.1):< 1ms
- 同城机房:几毫秒
- 跨省/跨国:几十到几百毫秒
对比超时:Linux 默认 tcp_syn_retries=6,首次 SYN 后按 1s、2s、4s、8s、16s、32s 指数退避重传,总耗时约 127 秒才放弃。Windows 默认约 21 秒。所以”秒开报错”几乎可以断定是 RST,不是超时。
1.3 抓包验证
用 Wireshark 或 tcpdump 抓包,过滤目标端口:
# Linux / macOS
sudo tcpdump -i any -nn 'tcp port 443 and (tcp[tcpflags] & (tcp-syn|tcp-rst) != 0)'
如果看到:
IP 192.168.1.100.54321 > 93.184.216.34.443: Flags [S], seq ...
IP 93.184.216.34.443 > 192.168.1.100.54321: Flags [R.], seq 0, ack ...
第二行的 [R.] 就是 RST+ACK,实锤拒绝连接。
1.4 一个容易混淆的点:RST 也可能来自中间设备
RST 不一定来自目标服务器。以下情况也会产生 RST:
- 云厂商安全组 / 防火墙:部分设备配置为”拒绝时回 RST”而非静默 DROP。
- CDN 回源失败:边缘节点无法连接源站时,可能直接给客户端回 RST。
- 运营商透明代理 / 干扰设备:特定场景下会伪造 RST 包中断连接。
- NAT 设备:连接跟踪表项过期后收到迟到的包,回 RST。
所以看到 RST 只能确定”某个环节主动拒绝”,还需要结合 traceroute 和 curl -v 进一步定位。
二、两大高频场景拆解
场景 A:访问外部公网时目标服务崩溃 / 端口关闭
特征:只有特定网站或特定端口报错,其他网站正常。
常见成因:
- 服务进程崩溃:Web 服务器(Nginx/Apache/Node)挂了,端口没有监听者。
- 端口配置错误:服务监听在 8080,但对外映射的是 80。
- 服务只监听 127.0.0.1:
netstat显示127.0.0.1:3000而非0.0.0.0:3000,外部访问必然被 RST。 - 云安全组 / 防火墙规则:入站规则未放行该端口。
- IPv6 优先但服务只监听 IPv4:浏览器尝试 AAAA 记录对应的 IPv6 地址,目标无监听,回 RST。
排查思路:从客户端探测目标端口,确认是”拒绝”还是”超时”,再判断问题在本地、中间链路还是服务端。
场景 B:访问任意网页都报错——本地系统代理残留
特征:所有网站都打不开,且报错极快(毫秒级)。这是最容易被误判为”网络故障”的场景。
成因链条:
- 用户曾运行过代理软件(Clash、V2Ray、Surge 等),软件在
127.0.0.1:7890之类的端口监听。 - 软件退出(崩溃、强制结束、更新重启),但系统代理设置没有清除。
- 浏览器读取系统代理配置,把所有 HTTP/HTTPS 请求发往
127.0.0.1:7890。 - 该端口已无进程监听,本地内核立即回 RST。
- 浏览器报
ERR_CONNECTION_REFUSED。
为什么是毫秒级:127.0.0.1 是回环地址,数据包不出网卡,内核直接处理,RTT 接近 0。
验证方法:
# Windows PowerShell
netsh winhttp show proxy
Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyEnable, ProxyServer
# macOS
scutil --proxy
# Linux(GNOME)
gsettings get org.gnome.system.proxy mode
如果看到 ProxyEnable=1 且 ProxyServer=127.0.0.1:7890,而 7890 端口没有进程监听,就是这个问题。
三、跨平台端口探测实操
探测目标端口是否可达,是区分”拒绝”和”超时”的关键动作。
3.1 Windows
PowerShell — Test-NetConnection(推荐)
Test-NetConnection -ComputerName example.com -Port 443
输出关键字段:
ComputerName : example.com
RemoteAddress : 93.184.216.34
RemotePort : 443
TcpTestSucceeded : True
TcpTestSucceeded : True→ 端口可达False且快速返回 → 大概率 RST(拒绝)False且等待约 20 秒 → 超时
PowerShell — 原生 TcpClient(更精确计时)
$sw = [System.Diagnostics.Stopwatch]::StartNew()
try {
$c = New-Object System.Net.Sockets.TcpClient
$c.Connect("example.com", 443)
"连接成功,耗时 $($sw.ElapsedMilliseconds) ms"
$c.Close()
} catch {
"连接失败,耗时 $($sw.ElapsedMilliseconds) ms:$($_.Exception.Message)"
}
耗时 < 100ms 的失败基本是 RST;耗时接近 21000ms 的是超时。
CMD — telnet
telnet example.com 443
- 黑屏无输出 → 连接成功
无法打开到主机的连接...连接失败→ 拒绝或超时(telnet 不区分,需配合计时)
注意:Windows 10/11 默认未安装 telnet 客户端,需在”启用或关闭 Windows 功能”中勾选。
curl(Windows 10 1803+ 内置)
curl -v --connect-timeout 5 https://example.com
关键输出:
* Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443
或失败时:
* connect to 93.184.216.34 port 443 failed: Connection refused
curl: (7) Failed to connect to example.com port 443: Connection refused
Connection refused 就是 RST;Connection timed out 是超时。
3.2 macOS
nc(netcat)
nc -vz -w 5 example.com 443
Connection to example.com port 443 [tcp/https] succeeded!→ 成功nc: connectx to example.com port 443 (tcp) failed: Connection refused→ RSTOperation timed out→ 超时
curl
curl -v --connect-timeout 5 https://example.com
lsof 查看本地端口监听
lsof -nP -iTCP:7890 -sTCP:LISTEN
无输出说明 7890 端口没有进程监听,代理残留场景实锤。
3.3 Linux
nc
nc -vz -w 5 example.com 443
ss 查看监听端口
ss -tlnp | grep 7890
curl
curl -v --connect-timeout 5 https://example.com
traceroute 定位 RST 来源
sudo traceroute -T -p 443 example.com
-T 使用 TCP SYN,-p 443 指定端口。如果在到达目标前某一跳就开始超时,说明中间有防火墙 DROP;如果到达目标后立即失败,说明目标端口关闭。
四、Windows 系统代理一键清理与 Winsock 重置
4.1 清理系统代理
方法一:图形界面
设置 → 网络和 Internet → 代理 → 手动设置代理 → 关闭”使用代理服务器”。
方法二:命令行(推荐,可脚本化)
# 关闭系统代理
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyEnable -Value 0
# 清除代理服务器地址
Remove-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyServer -ErrorAction SilentlyContinue
# 清除 WinHTTP 代理(部分应用走这条路径)
netsh winhttp reset proxy
执行后需要重启浏览器(Chrome/Edge 会缓存代理设置),或运行:
ipconfig /flushdns
方法三:检查环境变量
部分命令行工具(curl、git、npm)读取环境变量而非系统代理:
Get-ChildItem Env: | Where-Object { $_.Name -match 'PROXY' }
如有 HTTP_PROXY / HTTPS_PROXY 指向失效地址,清除:
Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
4.2 Winsock 重置
当 TCP/IP 协议栈状态异常(如 LSP 残留、Winsock 目录损坏)时,即使代理已清理仍可能连接异常。重置命令:
netsh winsock reset
netsh int ip reset
ipconfig /release
ipconfig /renew
ipconfig /flushdns
注意:netsh winsock reset 会清除所有第三方 LSP(分层服务提供程序),某些安全软件、VPN 客户端需要重装。执行后必须重启系统。
4.3 完整排查脚本
Write-Host "=== 1. 检查系统代理 ===" -ForegroundColor Cyan
Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyEnable, ProxyServer
Write-Host "`n=== 2. 检查 WinHTTP 代理 ===" -ForegroundColor Cyan
netsh winhttp show proxy
Write-Host "`n=== 3. 检查代理端口监听 ===" -ForegroundColor Cyan
$proxyPort = 7890
$listening = Get-NetTCPConnection -LocalPort $proxyPort -State Listen -ErrorAction SilentlyContinue
if ($listening) {
Write-Host "端口 $proxyPort 有进程监听:$($listening.OwningProcess)"
} else {
Write-Host "端口 $proxyPort 无监听——若系统代理指向此端口,即为拒绝连接根因" -ForegroundColor Yellow
}
Write-Host "`n=== 4. 测试目标连通性 ===" -ForegroundColor Cyan
Test-NetConnection -ComputerName example.com -Port 443
五、FAQ
H3:为什么浏览器报 ERR_CONNECTION_REFUSED 而不是 ERR_CONNECTION_TIMED_OUT,两者能互相转化吗?
两者是 TCP 层两种互斥的结果,不能互相转化,但同一目标在不同网络环境下可能表现不同。RST 是目标主机或中间设备主动回包,超时是完全没有回包。举例:某服务器 443 端口关闭,你在公司网络访问可能收到 RST(防火墙放行且目标回 RST),在家用宽带访问可能超时(运营商或路由器 DROP 了 SYN)。反过来,如果中间设备配置为”拒绝时静默丢弃”,本应 RST 的场景也会变成超时。所以排查时不能只看浏览器错误码,必须结合 curl -v 的耗时和 tcpdump 抓包判断。
H3:本地代理残留导致所有网站拒绝连接,为什么关掉代理软件后问题还在?
因为代理软件的运行状态和系统代理设置是两套独立的东西。代理软件启动时通常会修改注册表 HKCU\...\Internet Settings\ProxyEnable 和 ProxyServer,把系统流量导向自己;正常退出时会还原,但崩溃、强制结束、更新重启、断电等异常退出路径不会执行还原逻辑,注册表就留下了 127.0.0.1:7890 的残留。浏览器每次启动读取这个配置,把请求发往已关闭的端口,内核回 RST。解决方法是手动清除注册表项(见第四节脚本),或重新启动代理软件再正常退出一次让它自己还原。
H3:用 Test-NetConnection 测试显示 TcpTestSucceeded : False,怎么判断是拒绝还是超时?
看返回耗时。Test-NetConnection 本身不直接显示耗时,但你可以观察命令从执行到返回的时间:如果几乎瞬间(< 1 秒)返回 False,基本是 RST;如果卡了约 20 秒才返回,是超时。更精确的做法是用 Measure-Command 包裹,或改用 System.Net.Sockets.TcpClient 配合 Stopwatch(见第三节代码)。另外可以看 PingSucceeded 字段:如果 ICMP ping 通但 TCP 端口不通,说明主机活着但端口关闭,倾向 RST;如果 ping 也不通,可能是主机宕机或 ICMP 被禁,需要进一步用 tracert 判断。
H3:服务端明明在运行,为什么外部访问还是 ERR_CONNECTION_REFUSED?
最常见的三个原因:第一,监听地址错误。服务配置为 listen 127.0.0.1:8080,只接受本机连接,外部 SYN 到达后内核发现该地址上没有监听者,回 RST。正确配置应为 0.0.0.0:8080 或具体的外网 IP。第二,IPv6/IPv4 不匹配。域名同时有 A 和 AAAA 记录,浏览器优先尝试 IPv6,但服务只监听 IPv4,IPv6 侧无监听回 RST。第三,云安全组或主机防火墙。部分云厂商的安全组在拒绝时会回 RST 而非 DROP,表现为拒绝连接。排查顺序:先在服务器上 ss -tlnp 确认监听地址,再从外部 nc -vz 测试,最后检查安全组规则。
H3:netsh winsock reset 会有什么副作用,什么时候才需要用?
netsh winsock reset 把 Winsock 目录重置为出厂状态,会清除所有第三方 LSP(分层服务提供程序)。副作用包括:某些杀毒软件的网络防护模块、VPN 客户端、抓包工具(如旧版 WinPcap 相关组件)可能失效,需要重新安装。它适用的场景很窄:确认代理已清理、DNS 正常、目标端口可达,但本机所有网络应用仍异常,且 netsh winsock show catalog 显示 LSP 链异常时。不要把它当成万能药——绝大多数 ERR_CONNECTION_REFUSED 是代理残留或目标端口关闭,跟 Winsock 无关。执行前建议先创建系统还原点,执行后必须重启。
结语
ERR_CONNECTION_REFUSED 不是”网络不通”,而是”有人明确说了不”。抓住 RST 这个信号,用耗时判断拒绝还是超时,用”是否所有网站都报错”区分本地代理问题和远端服务问题,再用 Test-NetConnection / nc / curl -v 三件套定位到具体环节,绝大多数场景可以在五分钟内定位根因。真正需要动用 netsh winsock reset 的情况极少,别让重置掩盖了真正的问题。