Windows 系统上的移动代理配置
Windows 并非只有一个代理设置——它有多个代理设置,且这些设置之间无法相互通信。本指南将介绍每个应用程序读取的是哪个层级、如何配置所有这些设置,以及如何查明哪个设置被忽略了。
- 两个代理堆栈,而不是一个 — WinINET 为“设置”应用和浏览器提供服务;WinHTTP 为 Windows 服务和大部分命令行提供服务。
- “设置”页面并非全局设置——它仅用于配置 WinINET,这就是为什么某个服务可以忽略 Windows 显示已启用的代理。
- netsh 终于揭开了另一半的面纱 —— 一条命令即可设置 WinHTTP,再执行一条命令即可查看实际配置情况。
- 有些应用程序既不读取 — curl、git 和 npm 仅遵循环境变量,而不考虑其他任何设置。
Windows 本身已经原生支持 HTTP(S) 和 SOCKS5。
“设置”、netsh、环境变量和应用程序级对话框。
Windows 有两个代理堆栈,而不是一个
Windows 的代理配置之所以让人觉得不可靠,是因为没有一个单一的设置能确保一切正常。Windows 内置了两个完全独立的 HTTP 协议栈,每个都有自己的代理配置,且彼此之间无法读取对方的配置。软件会自动选用其开发者所使用的那个协议栈,而系统中没有任何提示会告诉你具体是哪一个。
WinINET 是较早的、面向用户的协议栈。它支持“设置”应用、Internet Explorer 的传统对话框、Edge 以及 Chrome。 WinHTTP 是一个面向服务的协议栈,专为在未登录用户状态下运行的软件而设计,它支持 Windows 服务以及大量后台和企业级软件。在“设置”中配置代理时,仅会配置 WinINET,而 WinHTTP 则完全不受影响。
| 图层 | 谁在阅读它 | 你设置的位置 |
|---|---|---|
| WinINET | Edge、Chrome、大多数桌面应用程序,以及“设置”页面本身 | “设置”,然后是“网络和互联网”,再然后是“代理” |
| WinHTTP | Windows 服务、后台更新程序、大量企业级软件 | netsh winhttp set proxy 在高架车站内 |
| 环境变量 | curl、git、npm、pip、Python 以及大多数已移植的命令行工具 | 按会话计费,或对您的用户账户永久生效 |
| 应用程序设置 | Firefox、许多下载管理器、防检测浏览器 | 该应用程序自带的代理对话框 |
在进行任何更改之前,先弄清楚出错的应用程序属于哪一行。在错误的层面上三次输入相同的凭据,通常就是白白浪费一个下午的典型情形,而每次尝试时都觉得本该成功的。
在“设置”和 netsh 中配置代理
首先从“设置”页面开始,因为该页面涵盖了浏览器以及您实际会用到的绝大多数功能。打开“设置”,进入“网络和互联网”,然后选择“代理”。在“手动代理设置”下,打开开关,在“地址”字段中输入代理主机名,在“端口”字段中输入端口号,然后保存。 地址字段中只需填写主机名本身——不要输入以冒号分隔的字符串,也不要输入包含凭据的 URL。
当应用程序首次使用代理时,Windows 会提示输入用户名和密码。如果未出现提示,而是请求失败,则说明您的代理需要凭据,而 WinINET 对话框并未提供收集凭据的选项——此时请直接配置该应用程序。
netsh winhttp show proxy netsh winhttp set proxy proxy-server="http=proxy.example.net:8000;https=proxy.example.net:8000" netsh winhttp set proxy proxy-server="proxy.example.net:8000" bypass-list="<local>" netsh winhttp import proxy source=ie netsh winhttp reset proxy
值得了解的是“导入”行:它会将“设置”页面中的配置内容复制到 WinHTTP 中,因此只需配置一次,两个堆栈的设置就会保持一致。由于这是复制操作而非链接,因此在修改“设置”页面后必须重新运行该命令。 重置语句会将 WinHTTP 恢复为“直接”模式,当原本正常运行的服务突然停止工作时,这应是首先尝试的解决方法。
WinHTTP 的配置属于系统范围,因此终端必须以管理员身份运行。而“设置”页面仅适用于您的用户帐户,完全无需提升权限。
浏览器、终端和单个应用程序
Edge 和 Chrome 都遵循 WinINET,这意味着只需在“设置”页面进行配置即可,无需其他操作。Firefox 是一个值得记住的例外:它在网络设置中自带了一个代理对话框,虽然默认情况下会遵循系统设置,但任何之前曾手动设置过代理的用户都会发现,在将该对话框改回默认之前,它会顽固地无视 Windows 的设置。
命令行是一个截然不同的世界。从 Unix 移植过来的工具——curl、git、npm、pip 以及大多数 Python 代码——只读取环境变量,除此之外什么都不读。Windows 并没有与之对应的“设置”页面。
:: Current session only (Command Prompt) set HTTP_PROXY=http://user123:[email protected]:8000 set HTTPS_PROXY=http://user123:[email protected]:8000 set NO_PROXY=localhost,127.0.0.1 :: Persist for your user account setx HTTP_PROXY "http://user123:[email protected]:8000" # PowerShell, current session only $env:HTTP_PROXY = "http://user123:[email protected]:8000" $env:HTTPS_PROXY = "http://user123:[email protected]:8000"
请注意,HTTPS_PROXY 仍接受 http:// 这种方案。该方案描述的是如何连接到代理,而非目标的协议——客户端通过该代理建立隧道,而 TLS 则在该隧道内端到端运行。在此处写入 https:// 是常见且容易引起混淆的错误。
使用 setx 命令将这些设置永久化会将密码写入您的用户环境,您运行的任何进程都能读取该密码。在共享或受管理的计算机上,建议按会话进行设置,或者请服务提供商将该计算机的地址加入白名单,这样就完全不需要输入凭据了。该 设置概述 对此权衡进行了更详细的阐述。
当 Windows 显示代理已启用,但没有任何程序使用它时
几乎所有的 Windows 代理问题都是层级问题,而非凭据问题。在更改任何设置之前,请先弄清楚出现问题的应用程序实际看到的是什么。
| 症状 | 最可能的原因 |
|---|---|
| 浏览器通过代理连接,而 Windows 服务则不是 | WinHTTP 从未被设置过。请运行导入命令,或显式设置该变量。 |
| curl 或 git 会返回真实的 IP 地址 | 没有环境变量。两个 Windows 堆栈都无法访问这些工具。 |
| 反复出现的身份验证提示 | 凭据被发送到了错误的端口。HTTP 和 SOCKS5 使用不同的端口,且登录方式各不相同。 |
| 配置成功后,一切都失效了 | 一个过期的 WinHTTP 条目,其指向的位置已不存在。请将其重置并重新设置。 |
| 只有 Firefox 会忽略代理设置 | 其自身的连接设置已设为“手动”或“不使用代理”。 |
如果您更愿意在浏览器中而不是终端中确认端点,那么 免费的 PXM2 代理检测工具 对其进行测试,并报告检测到的代理类型和出口国家。
获取适用于 Windows 的移动代理
PXM2 实时节点位置——选择您需要出口 IP 的国家/地区,并按照本页的步骤进行配置:
法国
印度
新加坡
常见问题解答
如何在 Windows 11 上设置代理?
打开“设置”,进入“网络和互联网”,然后选择“代理”,在“手动代理设置”下输入主机名和端口,最后保存。这适用于 Edge、Chrome 以及大多数桌面应用程序。但不适用于 Windows 服务或命令行工具,这些工具会读取您通过 netsh 设置的单独配置。
Windows 的代理设置与 netsh winhttp 之间有什么区别?
它们配置了两个独立的配置堆栈。 “设置”页面用于写入浏览器和普通桌面软件所使用的 WinINET 配置。netsh winhttp 命令则用于写入 Windows 服务和大量后台软件所使用的 WinHTTP 配置。其中一项设置不会影响另一项,这也是 Windows 代理看似仅部分生效的最常见原因。
为什么我的 Windows 代理在某些应用程序中无法正常工作?
因为这些应用程序读取的是你未曾设置过的配置。curl、git 和 npm 等命令行工具会参考环境变量;Windows 服务会参考 WinHTTP;Firefox 则拥有自己的代理设置对话框。这些配置各自独立于“设置”页面,因此解决方法是配置出现问题的应用程序实际读取的那个层,而不是在其他地方再次设置相同的值。
如何查看 Windows 正在使用哪个代理?
在终端中运行命令 `netsh winhttp show proxy` 以查看 WinHTTP 配置,然后依次打开“设置”→“网络和互联网”→“代理”以查看 WinINET 配置。接着,通过出现故障的工具发起一次请求,并将该请求的出口 IP 地址与您的实际 IP 地址进行对比,因为配置是否存在,并不意味着应用程序会实际使用该配置。
在 Windows 上设置代理时,是否需要管理员权限?
“设置”页面除外,该页面仅适用于您自己的用户账户。执行 `netsh winhttp set proxy` 命令时确实需要以管理员身份运行终端,因为 WinHTTP 配置属于系统范围。而环境变量则无需提升权限即可按用户进行设置。
相关移动代理指南
每个操作系统都存在同样多层次的问题,而每个系统的解决方法各不相同。
设置指南
核心移动代理指南
在真实运营商IP地址后运行Windows
专用的 4G/5G 调制解调器,提供无限带宽和无限轮询——支持 Windows 原生识别的 HTTP(S) 和 SOCKS5 端点,无需安装客户端。
获取移动代理