这两天我又被 Windows 的代理体系教育了一次。表面症状是:
- Chrome 正常上网
- 命令行也能访问大部分站点
- 微软商店却一本正经地告诉我:你没联网
最后真相是:不是没网,是“走了不同的网络栈”。
先说结论(给忙人)
Windows 里常见至少有三套代理入口:
WinINet:很多桌面应用、浏览器、UWP 前台会读它(“系统代理”通常指这套)WinHTTP:很多系统服务/后台组件走它(netsh winhttp show proxy那套)- 环境变量代理:
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 并存,最容易出现“这个能上,那个离线”
一份我现在常用的排障顺序
- 看 WinINet:代理是否开到
127.0.0.1:xxxx - 看 WinHTTP:
netsh winhttp show proxy - 看代理端口是否真在监听(
Get-NetTCPConnection) - 看 UWP 回环例外(
checknetisolation loopbackexempt -s) - 看应用日志错误码(比如商店的
0x80072EFD) - 再判断是代理问题、DNS 问题还是目标站问题
吐槽一句收尾
Windows 代理不是“配置错了”,而是“你只配对了其中一层”。
当你发现:浏览器好好的,商店却喊断网,先别怀疑人生,先怀疑它们根本没走同一条路。![]()