菜单

系统代理配置

相关源文件

目的与范围

本页面介绍了Shadowsocks Windows如何在Windows中配置和管理系统代理设置。系统代理配置模块负责将系统流量全局地或通过代理自动配置 (PAC) 脚本选择性地重定向到Shadowsocks代理服务。

有关PAC系统本身以及规则如何生成和管理的信息,请参阅PAC系统

系统代理架构

Shadowsocks Windows中的系统代理配置通过几个相互连接的组件实现

来源:shadowsocks-csharp/Controller/System/SystemProxy.cs shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs

关键组件

  1. SystemProxy - 用于更新系统代理设置的公共接口
  2. Sysproxy - 用于与Windows注册表代理设置交互的实现
  3. sysproxy.exe - 执行实际注册表修改的辅助可执行文件
  4. SysproxyConfig - 表示代理配置的数据结构
  5. user-wininet.json - 存储原始用户代理设置以供恢复的文件

代理模式

Shadowsocks支持三种代理模式来决定流量如何路由

来源:shadowsocks-csharp/Controller/System/SystemProxy.cs18-54

禁用模式

当代理被禁用时,Shadowsocks会恢复其激活之前的原始用户代理设置。这些设置存储在user-wininet.json中。

全局模式

在全局模式下,所有系统流量都通过Shadowsocks代理路由(绕过地址除外)。系统代理设置为localhost:localPort,并附带一个包含局域网地址的绕过列表。

PAC模式

在PAC模式下,系统使用代理自动配置脚本来确定哪些流量应通过代理,哪些应直接连接。PAC URL可以是以下两种之一

  • 由Shadowsocks内置PAC服务器提供的本地URL
  • 配置中指定的自定义在线PAC URL

系统代理更新过程

以下序列图说明了Shadowsocks如何更新系统代理设置

来源:shadowsocks-csharp/Controller/System/SystemProxy.cs18-73 shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs80-119

实现细节

  1. SystemProxy.Update() 在调用时会带上配置参数、强制禁用标志和PAC服务器引用
  2. 根据配置,确定相应的代理参数(全局或PAC)
  3. Sysproxy.SetIEProxy() 会带上这些参数被调用
  4. 如果是第一次,则查询并存储当前用户设置
  5. sysproxy.exe 会带上相应的命令行参数执行
    • global <proxy> <bypass> 用于全局模式
    • pac <pacUrl> 用于PAC模式
    • set <flags> <proxy> <bypass> <pacUrl> 用于恢复用户设置
  6. Windows注册表会相应地更新

局域网IP地址的绕过列表

在全局模式下,Shadowsocks会自动将一组局域网IP模式添加到绕过列表

<local>
localhost
127.*
10.*
172.16.* - 172.31.*
192.168.*

这些地址始终被绕过,同时也会包含用户原始设置中的任何自定义绕过条目。

来源:shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs22-44

错误处理

系统代理配置包括针对代理设置问题的强大错误处理

来源:shadowsocks-csharp/Controller/System/SystemProxy.cs56-72 shadowsocks-csharp/Util/SystemProxy/ProxyException.cs10-17

异常类型

ProxyException 类定义了几种错误类型

异常类型描述
不特定没有特定分类的通用异常
运行失败无法运行sysproxy.exe可执行文件
查询返回空查询操作返回空数据
SysproxyExitErrorsysproxy.exe以错误代码退出
查询返回格式错误查询返回的数据格式不正确

当发生错误时,系统可能会尝试重置代理设置并重试操作,如果错误无法恢复,则显示错误消息。

配置存储

用户设置保留

Shadowsocks会将用户的原始代理设置存储在user-wininet.json中,以确保在以下情况下可以恢复它们:

  • 代理被禁用时
  • Shadowsocks关闭时
  • 系统代理模式发生更改时

SysproxyConfig 类包含以下属性:

属性描述
UserSettingsRecorded(用户设置已记录)原始设置是否已保存
标志IE proxy flags value(IE代理标志值)
ProxyServer(代理服务器)原始代理服务器地址
BypassList(绕过列表)原始代理绕过列表
PacUrl(PAC URL)原始PAC URL(如果有)

来源:shadowsocks-csharp/Model/SysproxyConfig.cs9-27 shadowsocks-csharp/Model/SysproxyConfig.cs226-258

Windows注册表影响

系统代理配置模块会影响以下Windows注册表位置

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
    • ProxyEnable - 启用/禁用代理
    • ProxyServer - 代理服务器地址和端口
    • ProxyOverride - 绕过列表
    • AutoConfigURL - 用于自动配置的PAC URL

当sysproxy.exe执行时,它会根据指定的命令修改这些注册表值。

来源:shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs140-224

与ShadowsocksController的集成

SystemProxy 功能通过以下过程集成到主控制器中

  1. ShadowsocksController 维护代理设置的配置状态
  2. 当代理设置需要更新时(启用/禁用切换、模式更改等),控制器会调用SystemProxy.Update()
  3. SystemProxy.Update() 通过 Sysproxy 应用新设置

这种模块化设计将系统代理配置逻辑与应用程序的其他方面分离,使其更易于维护和扩展。

来源:shadowsocks-csharp/Controller/System/SystemProxy.cs18-20

sysproxy.exe的命令行接口

sysproxy.exe辅助可执行文件接受以下命令

命令参数描述
query查询当前系统代理设置
global<proxy_server> <bypass_list>设置全局代理模式
pac<pac_url>设置PAC代理模式
set<flags> <proxy_server> <bypass_list> <pac_url>设置特定的代理配置

该可执行文件作为资源嵌入在Shadowsocks程序集中,并在运行时提取到临时目录。

来源:shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs67-77 shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs140-224