菜单

PAC 系统

相关源文件

代理自动配置 (PAC) 系统是 Shadowsocks Windows 的一个核心网络组件,它能够根据预定义的规则智能地路由流量。启用 PAC 系统后,它会自动判断到特定网站的连接是通过代理还是直接连接,从而在保持对被屏蔽资源访问的同时,提供更好的性能。

有关系统代理如何配置使用 PAC 文件,请参阅 系统代理配置

PAC 系统架构

Shadowsocks Windows 中的 PAC 系统包含多个协同工作的集成组件,用于生成、提供和更新浏览器和操作系统用于路由决策的基于 JavaScript 的 PAC 文件。

关键组件

  1. PACServer:一个 HTTP 服务器实现,负责向浏览器和操作系统提供 PAC 文件。
  2. PACDaemon:管理 PAC 文件内容并监控文件更改。
  3. GeositeUpdater:下载、处理和更新 GeoSite 数据库以生成 PAC 规则。
  4. GeoSite 数据库:一个包含用于生成规则的分类域名列表的二进制数据库。
  5. 用户规则文件:一个文本文件,包含用户定义的规则,用于补充 GeoSite 规则。

来源: Controller/Service/PACServer.cs Controller/Service/PACDaemon.cs Controller/Service/GeositeUpdater.cs

PAC 文件管理

PAC 文件(pac.txt)是 PAC 系统的核心产物。它包含 JavaScript 代码,浏览器和操作系统会使用这些代码来决定是否为特定 URL 使用代理。

PAC 文件生成过程

GeositeUpdater.MergeAndWritePACFile() 方法结合了三个关键元素来创建最终的 PAC 文件:

  1. 基础 PAC JavaScript 模板
  2. 来自 user-rule.txt 的用户自定义规则
  3. 基于用户配置从 GeoSite 数据库生成的规则

生成的 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 集成

GeoSite 数据库是一个关键组件,它提供用于生成代理规则的分类域名列表。它基于 v2fly 的 domain-list-community 项目,并为不同的网站和服务提供了一个广泛的分类域名集合。

GeoSite 数据库结构

GeoSite 数据库以 Protocol Buffer 编码文件(dlc.dat)的形式存储,结构如下:

域名匹配类型提供了不同的域名匹配方式。

类型描述示例模式匹配示例
普通匹配直接匹配example.comexample.com (但不包括 sub.example.com)
正则表达式正则表达式.*\.example\.comanything.example.com
领域域名后缀匹配example.comexample.com, sub.example.com
完整版精确匹配example.com仅精确匹配 example.com

来源: Model/Geosite/geosite.proto Controller/Service/GeositeUpdater.cs28-43

GeoSite 更新过程

更新过程包括 SHA256 校验和验证,以确保下载的数据库的完整性。如果本地数据库已是最新(通过比较校验和确定),则不执行下载。

来源: Controller/Service/GeositeUpdater.cs76-156

将 GeoSite 规则转换为 PAC 规则

GeositeUpdater 类使用以下转换将 GeoSite 域名条目转换为 PAC 兼容规则:

GeoSite 类型PAC 规则格式代码参考
普通匹配domain.comGeositeUpdater.cs332-334
正则表达式/pattern/GeositeUpdater.cs335-337
领域||domain.comGeositeUpdater.cs338-340
完整版|http://exact.domain.com and |https://exact.domain.comGeositeUpdater.cs341-344

来源: Controller/Service/GeositeUpdater.cs291-349 Controller/Service/GeositeUpdater.cs356-359

代理模式

Shadowsocks Windows 支持两种主要代理模式,这会影响 PAC 文件的生成方式:

1. 黑名单模式(默认)

在黑名单模式(geositePreferDirect = true)下,只有指定的域名使用代理,其他所有域名直接连接。此模式通过以下方式实现:

  1. 为“proxied”组中的域名生成代理规则
  2. 为“direct”组中的域名生成异常规则(前缀为“@@”)

2. 白名单模式

在白名单模式(geositePreferDirect = false)下,除指定域名外,所有流量都通过代理。此模式通过以下方式实现:

  1. 添加一个通配规则(/.*/)来代理所有内容。
  2. 为“direct”组中的域名生成异常规则(前缀为“@@”)

模式由 geositePreferDirect 配置参数决定,并影响 GenerateRules 方法中生成的规则。

来源: Controller/Service/GeositeUpdater.cs267-284

PAC 服务器实现

PACServer 类实现了 Listener.Service 接口,并处理 PAC 文件的 HTTP 请求。

请求处理流程

服务器通过检查以下内容来验证每个请求:

  1. 请求的资源路径(/pac
  2. 主机头与本地端点匹配
  3. Secret token(如果启用了安全 PAC)

对于有效的请求,它会提供带有适当 HTTP 标头的 PAC 文件,并添加代理配置变量。

来源: Controller/Service/PACServer.cs57-156 Controller/Service/PACServer.cs160-196

PAC URL 生成

PAC URL 由 PACServer 中的 UpdatePACURL 方法生成。

http://:port/pac?hash=contentHash&secret=randomToken

URL 的组成部分

  • port:代理服务器配置的本地端口
  • contentHash:PAC 内容的 MD5 哈希值,用于缓存失效
  • randomToken:随机生成的 secret token(仅在启用了安全 PAC 时添加)

来源: Controller/Service/PACServer.cs43-50 Controller/Service/PACServer.cs19-32

自定义 PAC 规则

用户可以通过编辑 user-rule.txt 文件来自定义 PAC 规则,该文件包含与 GeoSite 生成的规则合并的其他规则。

用户规则格式

用户规则文件中的每一行代表一个单独的规则。格式遵循标准的 PAC 规则语法:

  • 直接规则:example.com(精确匹配域名)
  • 正则表达式规则:/pattern/(使用 JavaScript 正则表达式)
  • 域名规则:||example.com(匹配域名及其所有子域名)
  • 精确 URL:|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 系统相关的关键翻译字符串包括:

英文原文翻译示例
PACPACPAC 模式 (中文)
Local PACLocal PAC使用本地 PAC (中文)
Online PACOnline PAC使用在线 PAC (中文)
Edit Local PAC File...Edit Local PAC File...编辑本地 PAC 文件... (中文)
Update Local PAC from GeositeUpdate Local PAC from Geosite从 Geosite 更新本地 PAC (中文)
Edit User Rule for Geosite...Edit User Rule for Geosite...编辑 Geosite 的用户规则... (中文)
Secure Local PACSecure Local PAC保护本地 PAC (中文)
Copy Local PAC URLCopy Local PAC URL复制本地 PAC 网址 (中文)
Failed to update PAC fileFailed to update PAC file更新 PAC 文件失败 (中文)
PAC updatedPAC updated更新 PAC 成功 (中文)

来源:Data/i18n.csv15-31 Controller/I18N.cs97-100

总结

Shadowsocks Windows 中的 PAC 系统提供了一个复杂、可配置的流量路由机制,帮助用户在绕过审查的同时保持最佳性能。它使用 GeoSite 数据库提供全面的域名分类,并允许用户通过用户规则文件进行自定义。

该系统的主要优势包括:

  1. GeoSite 数据库自动更新以维护当前规则
  2. 支持黑名单和白名单模式
  3. 用户可自定义规则
  4. 通过令牌认证安全地提供 PAC
  5. 文件更改监控以实现即时规则更新
  6. 国际化支持

有关系统代理配置如何与 PAC 系统协同工作的详细信息,请参阅 系统代理配置