代理自动配置 (PAC) 系统是 Shadowsocks Windows 的一个核心网络组件,它能够根据预定义的规则智能地路由流量。启用 PAC 系统后,它会自动判断到特定网站的连接是通过代理还是直接连接,从而在保持对被屏蔽资源访问的同时,提供更好的性能。
有关系统代理如何配置使用 PAC 文件,请参阅 系统代理配置。
Shadowsocks Windows 中的 PAC 系统包含多个协同工作的集成组件,用于生成、提供和更新浏览器和操作系统用于路由决策的基于 JavaScript 的 PAC 文件。
来源: Controller/Service/PACServer.cs Controller/Service/PACDaemon.cs Controller/Service/GeositeUpdater.cs
PAC 文件(pac.txt)是 PAC 系统的核心产物。它包含 JavaScript 代码,浏览器和操作系统会使用这些代码来决定是否为特定 URL 使用代理。
GeositeUpdater.MergeAndWritePACFile() 方法结合了三个关键元素来创建最终的 PAC 文件:
user-rule.txt 的用户自定义规则生成的 PAC 文件遵循以下结构:
来源: Controller/Service/GeositeUpdater.cs166-179 Controller/Service/GeositeUpdater.cs218-243
PACDaemon 类使用 FileSystemWatcher 类来监控 PAC 文件和用户规则文件中的更改。
检测到更改时,系统会引发事件,通知其他组件更新其状态,确保 PAC 系统始终使用最新的规则。
来源: Controller/Service/PACDaemon.cs72-96 Controller/Service/PACDaemon.cs102-130
GeoSite 数据库是一个关键组件,它提供用于生成代理规则的分类域名列表。它基于 v2fly 的 domain-list-community 项目,并为不同的网站和服务提供了一个广泛的分类域名集合。
GeoSite 数据库以 Protocol Buffer 编码文件(dlc.dat)的形式存储,结构如下:
域名匹配类型提供了不同的域名匹配方式。
| 类型 | 描述 | 示例模式 | 匹配示例 |
|---|---|---|---|
| 普通匹配 | 直接匹配 | example.com | example.com (但不包括 sub.example.com) |
| 正则表达式 | 正则表达式 | .*\.example\.com | anything.example.com |
| 领域 | 域名后缀匹配 | example.com | example.com, sub.example.com |
| 完整版 | 精确匹配 | example.com | 仅精确匹配 example.com |
来源: Model/Geosite/geosite.proto Controller/Service/GeositeUpdater.cs28-43
更新过程包括 SHA256 校验和验证,以确保下载的数据库的完整性。如果本地数据库已是最新(通过比较校验和确定),则不执行下载。
来源: Controller/Service/GeositeUpdater.cs76-156
GeositeUpdater 类使用以下转换将 GeoSite 域名条目转换为 PAC 兼容规则:
| GeoSite 类型 | PAC 规则格式 | 代码参考 |
|---|---|---|
| 普通匹配 | domain.com | GeositeUpdater.cs332-334 |
| 正则表达式 | /pattern/ | GeositeUpdater.cs335-337 |
| 领域 | ||domain.com | GeositeUpdater.cs338-340 |
| 完整版 | |http://exact.domain.com and |https://exact.domain.com | GeositeUpdater.cs341-344 |
来源: Controller/Service/GeositeUpdater.cs291-349 Controller/Service/GeositeUpdater.cs356-359
Shadowsocks Windows 支持两种主要代理模式,这会影响 PAC 文件的生成方式:
在黑名单模式(geositePreferDirect = true)下,只有指定的域名使用代理,其他所有域名直接连接。此模式通过以下方式实现:
在白名单模式(geositePreferDirect = false)下,除指定域名外,所有流量都通过代理。此模式通过以下方式实现:
/.*/)来代理所有内容。模式由 geositePreferDirect 配置参数决定,并影响 GenerateRules 方法中生成的规则。
来源: Controller/Service/GeositeUpdater.cs267-284
PACServer 类实现了 Listener.Service 接口,并处理 PAC 文件的 HTTP 请求。
服务器通过检查以下内容来验证每个请求:
/pac)对于有效的请求,它会提供带有适当 HTTP 标头的 PAC 文件,并添加代理配置变量。
来源: Controller/Service/PACServer.cs57-156 Controller/Service/PACServer.cs160-196
PAC URL 由 PACServer 中的 UpdatePACURL 方法生成。
http://:port/pac?hash=contentHash&secret=randomToken
URL 的组成部分
来源: Controller/Service/PACServer.cs43-50 Controller/Service/PACServer.cs19-32
用户可以通过编辑 user-rule.txt 文件来自定义 PAC 规则,该文件包含与 GeoSite 生成的规则合并的其他规则。
用户规则文件中的每一行代表一个单独的规则。格式遵循标准的 PAC 规则语法:
example.com(精确匹配域名)/pattern/(使用 JavaScript 正则表达式)||example.com(匹配域名及其所有子域名)|http://example.com(精确匹配 URL)以 ! 或 <FileRef file-url="https://github.com/shadowsocks/shadowsocks-windows/blob/891d9716/ 开头的行将被视为注释并被忽略。\n\nGeositeUpdater 中的 ProcessUserRules 方法会解析用户规则文件,并过滤掉无效或注释行。\n\nSources#LNaN-LNaN" NaN file-path="将被视为注释并被忽略。\n\nProcessUserRules方法在GeositeUpdater` 中解析用户规则文件,并过滤掉无效或注释行。\n\nSources">Hii
PAC 系统使用 I18N 类来支持其 UI 元素的国际化。这使得与 PAC 系统相关的错误消息和菜单项能够以用户偏好的语言显示。
与 PAC 系统相关的关键翻译字符串包括:
| 键 | 英文原文 | 翻译示例 |
|---|---|---|
| PAC | PAC | PAC 模式 (中文) |
| Local PAC | Local PAC | 使用本地 PAC (中文) |
| Online PAC | Online PAC | 使用在线 PAC (中文) |
| Edit Local PAC File... | Edit Local PAC File... | 编辑本地 PAC 文件... (中文) |
| Update Local PAC from Geosite | Update Local PAC from Geosite | 从 Geosite 更新本地 PAC (中文) |
| Edit User Rule for Geosite... | Edit User Rule for Geosite... | 编辑 Geosite 的用户规则... (中文) |
| Secure Local PAC | Secure Local PAC | 保护本地 PAC (中文) |
| Copy Local PAC URL | Copy Local PAC URL | 复制本地 PAC 网址 (中文) |
| Failed to update PAC file | Failed to update PAC file | 更新 PAC 文件失败 (中文) |
| PAC updated | PAC updated | 更新 PAC 成功 (中文) |
来源:Data/i18n.csv15-31 Controller/I18N.cs97-100
Shadowsocks Windows 中的 PAC 系统提供了一个复杂、可配置的流量路由机制,帮助用户在绕过审查的同时保持最佳性能。它使用 GeoSite 数据库提供全面的域名分类,并允许用户通过用户规则文件进行自定义。
该系统的主要优势包括:
有关系统代理配置如何与 PAC 系统协同工作的详细信息,请参阅 系统代理配置。