文章

bug:Win 代理残留导致断网

bug:Win 代理残留导致断网

适用场景:Windows 上使用 Clash Verge、FlClash、Mihomo 等本地代理客户端后,关闭代理客户端或切换客户端,Claude Code、Codex、CodeBuddy、浏览器或局域网应用突然无法联网。

1. 最终结论

这次问题不是 “电脑没有网络”,而是旧代理配置把软件固定指向了本机端口 127.0.0.1:7897。当原代理客户端关闭,或新客户端监听了别的端口(例如 7890)时,这个端口没有服务监听,于是软件得到 ConnectionRefused(连接被拒绝)。

最终修复后的状态:

  • Claude Code:开、关 FlClash 都能通过 CCSwitch 使用 DeepSeek。
  • CodeBuddy:开、关 FlClash 都能使用。
  • Codex:开启代理时可用;这是它访问 OpenAI 服务所需的正常网络条件,与残留代理无关。
  • 小米智能存储:开、关 FlClash 都正常。
  • FlClash:Windows 系统代理关闭,按需开启虚拟网卡 / TUN,使用规则模式。

2. 背景和现象

最初使用 Clash Verge,混合代理端口是 7897。后来关闭它,或切换到默认端口为 7890 的 FlClash 后,出现以下现象:

软件/服务 典型表现
Claude Code API Error: Unable to connect to API (ConnectionRefused)
CodeBuddy Failed to establish a socket connection to proxies: PROXY 127.0.0.1:7897
Codex 请求中断或连接错误
浏览器、部分桌面应用 关闭代理客户端后无法联网
小米智能存储 登录卡住、设备离线或状态异常

一个很有价值的验证是:FlClash 监听默认 7890 时,上述开发工具不能使用;将它改为 7897 后,工具立即恢复。这说明软件并不是随机网络故障,而是在依赖固定的本地代理地址。

3. 根因:残留的两层代理配置

Windows 上的代理常见有三层。此次前两层都曾指向 127.0.0.1:7897

1
2
3
4
5
6
7
8
9
10
11
12
13
14
应用 / 终端 / 浏览器
       │
       ├─ ① HTTP_PROXY、HTTPS_PROXY、ALL_PROXY(环境变量)
       │       └─ 常被 Node.js、CLI、开发工具读取
       │
       ├─ ② Windows 系统代理(Internet Settings)
       │       └─ 常被浏览器、桌面应用读取
       │
       └─ ③ 直接联网

① 或 ② 指向 127.0.0.1:7897
       │
       ├─ 本地代理正在运行:请求被转发,正常
       └─ 本地代理已关闭:端口无人监听,ConnectionRefused

当时实际存在的关键项是:

1
2
3
4
5
6
HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897
ALL_PROXY=http://127.0.0.1:7897

Windows 系统代理:开启
ProxyServer=127.0.0.1:7897

这解释了为什么更换代理客户端并把端口改回 7897 会暂时恢复:新客户端重新在旧地址上提供服务了,但根因——全局配置残留——仍然存在。

3.1 为什么“执行脚本后仍不行”

环境变量有两份状态:

  1. 注册表中的持久值,供未来登录会话读取。
  2. 已运行进程内存中的副本,例如 Explorer(桌面)、VS Code 和终端。

如果顺序是“先重启 Windows,再执行清理脚本”,Explorer 可能已经把旧变量带入内存。随后从桌面启动的 VS Code 仍可能继承旧的 HTTP_PROXY

因此正确顺序必须是:

1
关闭相关软件 → 执行清理 → 重启 Windows → 再启动软件

重启后,新启动的 Explorer、VS Code 与终端才会从干净的用户环境中继承变量。

4. 排查步骤

以下命令均可在 PowerShell 中执行;它们只读取状态。

4.1 检查用户环境变量

1
reg query HKCU\Environment | Select-String -Pattern 'proxy' -CaseSensitive:$false

如果看到 HTTP_PROXYHTTPS_PROXYALL_PROXY 指向 127.0.0.1:7897,说明开发工具可能被固定代理。

4.2 检查 Windows 系统代理

1
2
3
Get-ItemProperty `
  'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' |
  Select-Object ProxyEnable, ProxyServer, AutoConfigURL

重点看:

  • ProxyEnable : 1:系统代理开启。
  • ProxyServer : 127.0.0.1:7897:系统代理地址。
  • AutoConfigURL:可能存在 PAC 自动代理脚本。

4.3 检查 WinHTTP 代理

1
netsh winhttp show proxy

WinHTTP 与浏览器的系统代理不是同一套设置。一些系统组件和程序会读取它。

4.4 检查本地端口是否真的在监听

1
Get-NetTCPConnection -State Listen -LocalPort 7897 -ErrorAction SilentlyContinue

没有输出代表没有程序在提供 7897 代理服务。如果软件仍要求访问这个端口,连接必然失败。

4.5 区分“代理残留”与“目标服务不能直连”

不要只看“联网失败”这一句话,应看目标是什么:

  • CodeBuddy 明确提示 PROXY 127.0.0.1:7897:优先检查本地代理残留。
  • Claude Code 使用 CCSwitch + DeepSeek 时,目标是 https://api.deepseek.com/anthropic。这是 DeepSeek 官方支持的 Anthropic 兼容地址,也是官方 Claude Code 集成方案。见 DeepSeek Claude Code 集成文档
  • Codex 访问 OpenAI 服务。即使本机没有残留代理,在某些网络环境下仍需要代理;这不是“修复失败”。

5. 修复方案

5.1 推荐的日常配置

对于同时使用国内服务、局域网设备和境外 AI 服务的电脑,推荐:

1
2
3
4
5
FlClash 系统代理:关闭
FlClash 虚拟网卡 / TUN:按需开启
代理模式:规则(Rule)
不要长期使用全局模式(Global)
不要永久设置 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 到本地端口

这样一般软件走正常直连;需要代理的流量由 TUN 和规则决定。关闭 FlClash 后,普通联网不会继续访问已消失的本地端口。

5.2 一键清理脚本

使用前:关闭 FlClash、VS Code、Codex、Claude Code、CodeBuddy 等相关软件;脚本完成后必须重启 Windows。

将下列内容保存为 修复代理残留.bat,右键或双击运行并接受管理员确认:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
@echo off
setlocal EnableExtensions

rem Relaunch as administrator so WinHTTP reset is reliable.
if /I not "%~1"=="elevated" (
  fltmc >nul 2>&1
  if errorlevel 1 (
    echo Requesting administrator permission...
    powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -FilePath '%~f0' -ArgumentList 'elevated' -Verb RunAs"
    exit /b
  )
)

title Repair stale proxy settings
echo ============================================================
echo   Repair stale Windows and developer-tool proxy settings
echo ============================================================
echo.
echo Before continuing, make sure:
echo   1. FLClash, VS Code, Codex, Claude Code and CodeBuddy are closed.
echo   2. FLClash System Proxy is OFF.
echo   3. Do not start any of the above applications before the restart.
echo.
choice /C YN /N /M "Continue? [Y/N]: "
if errorlevel 2 exit /b 0

set "BACKUP=%USERPROFILE%\Desktop\proxy-repair-backup"
if not exist "%BACKUP%" mkdir "%BACKUP%" >nul 2>&1

echo.
echo [1/5] Backing up current registry settings...
reg export "HKCU\Environment" "%BACKUP%\user-environment.reg" /y >nul 2>&1
reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" "%BACKUP%\internet-settings.reg" /y >nul 2>&1

echo [2/5] Removing persistent proxy environment variables...
for %%V in (HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY) do (
  reg delete "HKCU\Environment" /v "%%V" /f >nul 2>&1
)

echo [3/5] Disabling the Windows system proxy...
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f >nul
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /f >nul 2>&1
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /f >nul 2>&1

echo [4/5] Resetting WinHTTP proxy and refreshing DNS...
netsh winhttp reset proxy >nul
ipconfig /flushdns >nul

echo [5/5] Verifying the result...
echo.
echo Windows system proxy:
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable
echo.
echo Remaining ProxyServer or AutoConfigURL ^(no output is expected^):
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer 2>nul
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL 2>nul
echo.
echo Remaining persistent proxy variables ^(no output is expected^):
for %%V in (HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY) do (
  reg query "HKCU\Environment" /v "%%V" 2>nul
)
echo.
netsh winhttp show proxy

echo ============================================================
echo Repair completed.
echo Registry backups were saved to:
echo   %BACKUP%
echo.
echo IMPORTANT: Restart Windows now before starting FLClash, VS Code,
echo Codex, Claude Code or CodeBuddy. This clears old proxy variables
echo that Explorer may still have cached in memory.
echo.
echo After the restart:
echo   1. Keep FLClash closed and start VS Code / Claude Code first.
echo   2. If Claude Code works, the stale-proxy issue is resolved.
echo   3. Start FLClash only when you need its proxy or TUN features.
echo ============================================================
echo.
pause
endlocal

5.3 脚本做了什么

操作 用途
导出注册表备份 方便恢复原设置
删除 HTTP_PROXYHTTPS_PROXYALL_PROXYNO_PROXY 解除开发工具对旧端口的固定依赖
关闭并清空 Windows 系统代理 防止浏览器与桌面程序继续访问旧端口
netsh winhttp reset proxy 清理 WinHTTP 层
ipconfig /flushdns 清除 DNS 缓存,尤其适用于曾使用 Fake-IP 的 TUN
重启 Windows 清除 Explorer、VS Code、终端等已运行进程缓存的旧环境变量

5.4 验证是否修复

重启后、且未开启 FlClash 时,在 PowerShell 执行:

1
2
3
4
5
6
7
reg query HKCU\Environment | Select-String -Pattern 'proxy' -CaseSensitive:$false

Get-ItemProperty `
  'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' |
  Select-Object ProxyEnable, ProxyServer, AutoConfigURL

netsh winhttp show proxy

健康状态应为:

1
2
3
4
5
第一条命令:没有 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 输出
ProxyEnable:0
ProxyServer:空
AutoConfigURL:空
WinHTTP:Direct access(直连)

然后先测试国内网页、Claude Code/DeepSeek、CodeBuddy 和局域网设备;最后再开启 FlClash,测试 Codex 等需要代理的服务。

6. 原理:为什么不同软件表现不一样

6.1 本地代理端口是什么

Clash/Mihomo 类客户端会在本机开一个端口,例如:

1
127.0.0.1:7897

应用把请求交给这个端口,本地代理再把流量转交给远端节点。端口只是本机的“入口”,不是互联网地址。

1
应用 → 127.0.0.1:7897 → Mihomo/Clash → 远端代理节点 → 目标网站

当本地代理退出时,入口消失。任何还尝试访问该端口的应用都会报 ConnectionRefused

6.2 系统代理:应用层的“请走这个入口”

Windows 系统代理的本质是告诉愿意遵守该设置的应用:

1
访问 HTTP/HTTPS 时,请先交给 127.0.0.1:端口。

优点是简单、开销小;缺点是:

  • 不是每个应用都会读取它。
  • 关闭本地代理前若不关闭系统代理,应用会被引向不存在的端口。
  • 对局域网、国内服务或不该走代理的服务,容易产生意外影响。

6.3 环境变量代理:开发工具最容易踩坑的一层

HTTP_PROXYHTTPS_PROXYALL_PROXY 是进程环境变量。Node.js、Python、Git、npm、CLI 工具或其依赖库可能读取它们。

它们的影响范围常常比系统代理更隐蔽:

1
Explorer → VS Code → 终端 → Claude Code

父进程启动子进程时会复制环境变量。因此注册表中已经删除变量,并不代表已经启动的 Explorer、VS Code 或终端立刻忘记它;重启或完全重启这些进程才会生效。

6.4 虚拟网卡 / TUN:网络层接管

虚拟网卡(常称 TUN)在网络层接管流量,不要求每个应用支持 HTTP 代理:

1
2
3
4
5
6
7
应用正常发起网络连接
        ↓
Windows 路由表
        ↓
TUN 虚拟网卡
        ↓
Mihomo 按规则决定:DIRECT 或 PROXY

它和系统代理并不是同一件事:

  • 系统代理:应用主动访问本地代理端口。
  • TUN:应用不感知代理,系统在网络层改道。

TUN 的优点是兼容性更好;代价是规则、路由和 DNS 配置更重要。特别是 Fake-IP 模式下,TUN 运行时域名可能解析为 198.18.x.x 一类虚拟地址。关闭 TUN 后若个别应用仍异常,可先运行:

1
ipconfig /flushdns

然后重启该应用。

6.5 为什么各软件的结果不同

软件 主要网络路径 本次最终表现的原因
Claude Code CCSwitch 配置为 DeepSeek Anthropic 兼容接口 DeepSeek 可直连;清除旧本地代理后,开关 FlClash 都可用
CodeBuddy 会读取代理/系统网络设置 旧变量和系统代理清除后可直连
Codex 访问 OpenAI 服务 本机残留已修复,但目标服务在当前网络下仍需要代理
小米智能存储 局域网发现 + 小米服务连接 系统代理关闭、规则正常时不再被错误送往本地失效代理或远端节点
浏览器 通常读取 Windows 系统代理 关闭并清空系统代理后恢复正常直连

7. 常见误区

误区一:把新代理客户端端口改回旧端口,就是修复

这只能暂时恢复,因为它让新客户端重新占用了旧入口。只要客户端再次关闭,问题仍会出现。真正应修复的是全局环境变量和系统代理残留。

误区二:所有不能联网的软件都应该强制走 TUN

不是。先判断目标服务是否本来可直连:DeepSeek 可以直连时,Claude Code 不应被迫依赖 TUN;OpenAI 服务可能需要代理时,再由规则/TUN处理。

误区三:系统代理关闭,就肯定不会再走代理

不一定。环境变量代理、WinHTTP 代理、应用自身配置和已运行进程缓存都可能继续生效。

误区四:看到 ConnectionRefused 就说明网络被墙

不一定。ConnectionRefused 尤其在地址为 127.0.0.1:端口 时,通常首先意味着:本机端口没有程序监听。

8. 回滚与注意事项

回滚

脚本会在桌面 proxy-repair-backup 目录保存 .reg 备份。若确实需要恢复旧设置,可双击相应 .reg 文件导入;但不建议恢复旧的固定 7897 环境变量。

注意事项

  • 如果电脑属于公司网络、学校网络或需要使用正式代理,请先咨询网络管理员;不要盲目清除必须的代理设置。
  • 一次只运行一个代理客户端,避免两个程序争抢系统代理和端口。
  • 不要在环境变量中长期写死本地代理端口。若某个 CLI 必须显式代理,优先只在需要的终端会话中临时设置。
  • API Key、令牌、订阅链接都不应粘贴到公开文档、截图或终端日志中;若疑似暴露,应立即到服务商后台轮换。

9. 最短排障清单

下次再遇到“关掉代理后所有软件不能联网”,按下面顺序走即可:

  1. 看报错是否包含 127.0.0.1:端口
  2. 检查端口是否在监听。
  3. 检查 HKCU\Environment 的代理变量。
  4. 检查 Windows 系统代理和 WinHTTP。
  5. 关闭所有相关软件,执行清理脚本。
  6. 执行完脚本后重启 Windows。
  7. 不开代理先测试本应直连的服务。
  8. 再开启 TUN/代理,测试确实需要代理的服务。

这套流程的核心不是“让所有流量都走代理”,而是让每个软件走它应该走的网络路径。

本文由作者按照 CC BY 4.0 进行授权