Windows 代理迷宫:WinINet、WinHTTP、Clash 系统代理和微软商店离线事件

这两天我又被 Windows 的代理体系教育了一次。表面症状是:

  • Chrome 正常上网
  • 命令行也能访问大部分站点
  • 微软商店却一本正经地告诉我:你没联网

最后真相是:不是没网,是“走了不同的网络栈”

先说结论(给忙人)

Windows 里常见至少有三套代理入口:

  1. WinINet:很多桌面应用、浏览器、UWP 前台会读它(“系统代理”通常指这套)
  2. WinHTTP:很多系统服务/后台组件走它(netsh winhttp show proxy 那套)
  3. 环境变量代理:HTTP_PROXY/HTTPS_PROXY/NO_PROXY,主要给 CLI 工具

你在 Clash 里点“系统代理”,通常改的是 WinINet,不一定改 WinHTTP

我的现场:为什么“商店离线,浏览器在线”

我的当时配置:

  • WinINet = 127.0.0.1:7890(mihomo 本地代理)
  • WinHTTP = DIRECT
  • Clash TUN 开着

表现:

  • Chrome 走 WinINet,能用代理,所以看起来“网络正常”
  • 微软商店(UWP/AppContainer)报网络错误 0x80072EFD(CannotConnect)

关键点在这:

UWP 默认不能访问本机回环地址(127.0.0.1/localhost)。

于是商店想去连你本机代理端口时,可能直接被沙箱规则拦住。不是它不能访问互联网,而是它先到不了“代理入口”。

为什么“大陆商店可直连”也会翻车?

很多人会说:storeedge.microsoft.com 在中国大陆本来就能直连。这个判断没错,但不完整。

因为链路是:

UWP 应用 -> 本机代理(127.0.0.1:7890) -> 规则分流(DIRECT/PROXY) -> 目标站

如果第一跳(UWP 到本机回环)就被拦,后面“本该直连”根本没机会发生。

这次真正修好的动作

我没关全局代理、没改 WinHTTP、没动现有依赖服务,只做了最小改动:

checknetisolation loopbackexempt -a -n=microsoft.windowsstore_8wekyb3d8bbwe
checknetisolation loopbackexempt -a -n=microsoft.storepurchaseapp_8wekyb3d8bbwe
checknetisolation loopbackexempt -a -n=microsoft.xboxidentityprovider_8wekyb3d8bbwe

然后重开 Store,恢复。

这叫 UWP 回环例外(loopback exempt):给指定 UWP 包名开白名单,允许它访问本机 localhost/127.0.0.1

Windows 代理为什么看起来“乱”

因为它不是一条路,而是“多车道并行”:

  • 浏览器/部分桌面应用:读 WinINet
  • 系统服务:读 WinHTTP
  • 终端工具:可能只认环境变量
  • UWP:还受 AppContainer 的回环安全策略影响
  • TUN:又可能在 IP 层接管一部分流量

你看的是“一个开关”,系统里实际是“五个闸门”。

和 Linux / macOS 对比

Linux

  • 没有统一“系统代理总开关”能覆盖全部应用
  • 常见是 env 变量 + 应用各自配置
  • 透明代理通常靠 tun + iptables/nftables + policy routing
  • 好处:可控、可脚本化;坏处:碎片化明显

macOS

  • 有相对统一的网络服务代理配置(System Settings)
  • 但 CLI 工具仍常看 env 变量
  • 不存在 UWP 这种 AppContainer loopback 语义(沙箱模型不同)

Windows

  • GUI 体验像“统一入口”,但底层历史包袱最多
  • WinINet / WinHTTP / UWP / TUN 并存,最容易出现“这个能上,那个离线”

一份我现在常用的排障顺序

  1. 看 WinINet:代理是否开到 127.0.0.1:xxxx
  2. 看 WinHTTP:netsh winhttp show proxy
  3. 看代理端口是否真在监听(Get-NetTCPConnection
  4. 看 UWP 回环例外(checknetisolation loopbackexempt -s
  5. 看应用日志错误码(比如商店的 0x80072EFD
  6. 再判断是代理问题、DNS 问题还是目标站问题

吐槽一句收尾

Windows 代理不是“配置错了”,而是“你只配对了其中一层”。

当你发现:浏览器好好的,商店却喊断网,先别怀疑人生,先怀疑它们根本没走同一条路。:slightly_smiling_face:

1 个赞