本页面介绍了Shadowsocks Windows如何在Windows中配置和管理系统代理设置。系统代理配置模块负责将系统流量全局地或通过代理自动配置 (PAC) 脚本选择性地重定向到Shadowsocks代理服务。
有关PAC系统本身以及规则如何生成和管理的信息,请参阅PAC系统。
Shadowsocks Windows中的系统代理配置通过几个相互连接的组件实现
来源:shadowsocks-csharp/Controller/System/SystemProxy.cs shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs
Shadowsocks支持三种代理模式来决定流量如何路由
来源:shadowsocks-csharp/Controller/System/SystemProxy.cs18-54
当代理被禁用时,Shadowsocks会恢复其激活之前的原始用户代理设置。这些设置存储在user-wininet.json中。
在全局模式下,所有系统流量都通过Shadowsocks代理路由(绕过地址除外)。系统代理设置为localhost:localPort,并附带一个包含局域网地址的绕过列表。
在PAC模式下,系统使用代理自动配置脚本来确定哪些流量应通过代理,哪些应直接连接。PAC URL可以是以下两种之一
以下序列图说明了Shadowsocks如何更新系统代理设置
来源:shadowsocks-csharp/Controller/System/SystemProxy.cs18-73 shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs80-119
SystemProxy.Update() 在调用时会带上配置参数、强制禁用标志和PAC服务器引用Sysproxy.SetIEProxy() 会带上这些参数被调用sysproxy.exe 会带上相应的命令行参数执行global <proxy> <bypass> 用于全局模式pac <pacUrl> 用于PAC模式set <flags> <proxy> <bypass> <pacUrl> 用于恢复用户设置在全局模式下,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可执行文件 |
查询返回空 | 查询操作返回空数据 |
SysproxyExitError | sysproxy.exe以错误代码退出 |
查询返回格式错误 | 查询返回的数据格式不正确 |
当发生错误时,系统可能会尝试重置代理设置并重试操作,如果错误无法恢复,则显示错误消息。
Shadowsocks会将用户的原始代理设置存储在user-wininet.json中,以确保在以下情况下可以恢复它们:
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注册表位置
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
ProxyEnable - 启用/禁用代理ProxyServer - 代理服务器地址和端口ProxyOverride - 绕过列表AutoConfigURL - 用于自动配置的PAC URL当sysproxy.exe执行时,它会根据指定的命令修改这些注册表值。
来源:shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs140-224
SystemProxy 功能通过以下过程集成到主控制器中
ShadowsocksController 维护代理设置的配置状态SystemProxy.Update()SystemProxy.Update() 通过 Sysproxy 应用新设置这种模块化设计将系统代理配置逻辑与应用程序的其他方面分离,使其更易于维护和扩展。
来源:shadowsocks-csharp/Controller/System/SystemProxy.cs18-20
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