Dabrogelatel/app-ru-split

GitHub: Dabrogelatel/app-ru-split

基于 Little Snitch 规则和 PAC 文件的 macOS 应用级 VPN 分流方案,按国家地理定位分离不同浏览器的网络流量,防止 VPN IP 泄露给俄罗斯资源同时阻止俄罗斯 IP 暴露给境外服务。

Stars: 0 | Forks: 0

# App RU split — macOS 上按国家划分的 VPN 分流 一组 [Little Snitch](https://www.obdev.at/products/littlesnitch/) 规则 (`.lsrules`) 和 Firefox PAC 文件,可根据目标地理位置分离 macOS 应用的网络流量。其目标是 **防止 VPN IP 在俄罗斯资源上暴露**,同时 **阻止带有俄罗斯 IP 的浏览器向境外发送请求**。 ## 谁需要这个 典型场景:用户居住在俄罗斯,并使用 VPN (Xray, V2Ray, Hiddify, Happ Plus, WireGuard, OpenVPN) 访问被屏蔽的资源。这会带来两个截然相反的风险: 1. **VPN IP 泄露给俄罗斯网站。** 您使用境外 IP 访问了 Gosuslugi / 银行 / 电商平台 → 触发“可疑登录”,导致账号被锁定、要求接收短信验证码或被安全团队盘问。 2. **俄罗斯 IP 暴露给国外资源。** 当网站通过国外 CDN 投放广告、分析数据、加载字体和反欺诈脚本时,只要 VPN 处于未启用状态或配置了 bypass,这些附带请求就会使用您的俄罗斯 IP。 这些规则与 VPN 客户端并行工作,在 **应用程序层级** 解决了这两个问题: | 应用程序 | 允许的目标 | |---|---| | Firefox | 仅限俄罗斯 IP + 更新基础设施 (Mozilla, uBlock 来源)。 | | Диск-О (Mail.ru Cloud) | 仅限俄罗斯 IP。 | | Safari | 除俄罗斯 IP 外的所有流量(始终通过 VPN)。 | | Chrome | 除俄罗斯 IP 外的所有流量(始终通过 VPN)。 | 这种保护是双层的。Little Snitch 在 IP 数据包层级进行过滤(使用俄罗斯 CIDR 范围数据库)。Firefox 还额外配备了 PAC 文件,在 DNS 解析之前就根据 TLD 和域名进行拦截。如果某一层漏过了,另一层会提供保障。 ## 如何与 VPN 客户端配合工作 这些规则本身 **不会绕过** VPN 隧道——它们只负责判定“允许/拒绝”。要使 Firefox 的俄罗斯流量真正直连(而不是通过通常为了反检测会屏蔽俄罗斯出站流量的 VPN 服务器),您需要同时在 **VPN 客户端本身配置 split-tunneling**: - **Happ Plus / Hiddify / V2Box / Streisand / FoXray** — 路由规则:`geoip:ru` → outbound `direct`。 - **Xray/V2Ray (运行时配置):** `routing.rules = [{ "outboundTag":"direct", "ip":["geoip:ru"] }]` + `domainStrategy:"IPIfNonMatch"`。 - **WireGuard:** 从 `AllowedIPs` 中排除 RU-CIDR(或使用带有 `route`/`pf` 的 `PostUp` 脚本)。 否则,PAC 中的 `DIRECT` 仅意味着“无 HTTP 代理”,但数据包仍会进入 `utun0` → 到达 VPN 服务器 → 被拦截 → 在 Firefox 中引发 `PR_END_OF_FILE_ERROR`。 详细的分步指南(Firefox 配置文件、`about:config`、安装 PAC、安装 `.lsrules`、检查泄露):[firefox-ru-only.md](firefox-ru-only.md)。 ## 仓库中包含哪些内容 | 文件 | 用途 | |---|---| | [firefox-ru-only.md](firefox-ru-only.md) | 分步指南:Firefox 配置文件、`about:config`(防止 WebRTC/DoH/QUIC 泄露的 13 项参数)、PAC、Little Snitch、检查。 | | [generate-ls-ru-rules.sh](generate-ls-ru-rules.sh) | Bash 脚本:从 `merged-ru-cidrs-*.txt` 生成 `ru-only.lsrules` + `no-ru.lsrules`。 | | [ru-only.lsrules](ru-only.lsrules) | Little Snitch 规则组:Firefox + Диск-О ⇒ 仅限俄罗斯 + Firefox/uBlock 基础设施(不包含局域网/loopback——如有需要请手动添加私有规则)。 | | [no-ru.lsrules](no-ru.lsrules) | Little Snitch 规则组:Safari + Chrome ⇒ 屏蔽俄罗斯 IP。 | | [ru-whitelist.pac.example](ru-whitelist.pac.example) | Firefox PAC 模板。俄罗斯 TLD + 非俄罗斯 TLD 上的显式 RU 域名列表 (vk.com, timeweb.cloud, mozilla.org 等) → `DIRECT`;其余所有 → 通过 `PROXY 127.0.0.1:1` 进行屏蔽。 | 包含个人域名的 `ru-whitelist.pac` 私有副本以及中间文件 `merged-ru-cidrs-*.txt` 不会被提交——参见 `.gitignore`。 ## 在 Little Snitch 中安装(订阅规则) Little Snitch → **Rules → + → Subscribe to Rule Group…** — 粘贴原始 URL: ``` https://raw.githubusercontent.com/Dabrogelatel/app-ru-split/main/ru-only.lsrules https://raw.githubusercontent.com/Dabrogelatel/app-ru-split/main/no-ru.lsrules ``` **重要提示:** 取消勾选 **Disable new allow rules**,否则新获取的允许规则将被禁用。 Little Snitch 会定期自动拉取更新——一旦仓库中包含最新 CIDR 列表的新提交被推送,订阅者的规则将自动更新。 ## 在 Firefox 中安装 PAC 文件 `ru-whitelist.pac`(从 `.example` 复制并添加您自己的域名): **Firefox → Settings → Network Settings → Settings…** → **Automatic proxy configuration URL** → 输入 `file:///完整/路径/到/ru-whitelist.pac`。 PAC 逻辑: 1. 本地地址 (`127.0.0.0/8`, `10/8`, `172.16/12`, `192.168/16`) → `DIRECT`。 2. URL 中直接的 IPv4(无域名)→ 屏蔽(无法确定国家)。 3. 俄罗斯 TLD (`.ru`, `.su`, `.рф`, `.москва`, `.moscow`, `.рус`, `.дети`, `.tatar`) → `DIRECT`。 4. 非俄罗斯 TLD 上的 RU 服务列表 (`vk.com`, `timeweb.cloud`, `mozilla.org` 等) → `DIRECT`。 5. 其余所有 → `PROXY 127.0.0.1:1`(不存在的端口 = 在建立连接前屏蔽)。 将您自己的域名添加到本地 `ru-whitelist.pac`(而不是 `.example` 中)——本地副本已在 `.gitignore` 中,您的个人域名不会被推送到公共仓库。 ## 本地网络 (loopback / LAN) — 为什么不包含以及如何添加 订阅 `ru-only.lsrules` **不允许** RU-only 应用访问本地范围 `127.0.0.0/8`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `169.254.0.0/16`。这是出于安全默认设置的考量: - **通过 Native Messaging 的扩展。** 许多浏览器扩展通过 `127.0.0.1` 上的 WebSocket 与本地宿主应用程序 (KeePassXC, 1Password, Plex 等) 进行通信。如果扩展遭到入侵,它可能会将数据发送到带有 C2 的本地代理/木马的 loopback 地址。 - **本地代理。** 如果计算机上运行着代理 (`mitmproxy`、企业代理等),允许 Firefox 访问 loopback 可能会导致流量被无意中发送到那里。有了“无 local-net”的规则,即使 PAC 配置不当,也无法访问。 - **LAN 中的 CSRF。** 开放式允许 `192.168.0.0/16` 会允许任何网页通过 JS 代码访问路由器 / NAS / IoT 的管理后台(即使用户没有明确请求)。有了“无 LAN”的规则,就无法访问。 **如果确实需要 localhost / LAN**(例如在 `localhost:3000` 运行开发服务器,通过 `192.168.1.1` 访问路由器等)——请在 Little Snitch 中添加私有规则: 1. Little Snitch → **Rules → + → New Rule…** 2. Action: **Allow**, Direction: **Outgoing** 3. Process: Firefox / Disk-O / 其他应用程序的路径 4. Remote: **Address Range** → 输入所需范围 (`127.0.0.0/8` 或 `192.168.1.0/24` 等) 5. Save 私有规则独立于订阅存储,在自动更新期间不会被覆盖。您可以使它们更具针对性(例如,仅允许 Firefox 访问用于开发服务器的 `127.0.0.1:3000`,而不是整个 `127/8`)。 ## 常见问题解答 (FAQ) **在俄罗斯网站上出现 Firefox 错误 `PR_END_OF_FILE_ERROR`。** 很可能是因为 VPN 客户端没有配置针对 `geoip:ru` 的 split-tunneling。所有流量都进入隧道,而 VPN 服务器屏蔽了发往俄罗斯的出站流量(反检测)——Firefox 看到了 TLS 中断。请在 VPN 客户端中配置针对 `geoip:ru` → `direct` 的 bypass。请参阅“如何与 VPN 客户端配合工作”部分。 **尽管 VPN 正常运行,Safari/Chrome 无法打开俄罗斯网站。** 这是正常的,并且在设计之中:在针对它们的 `no-ru.lsrules` 中配置了针对 RU-CIDR 的拒绝规则。请使用 Firefox 打开俄罗斯网站(它的规则正好相反:仅限俄罗斯)。 **我位于非 .ru TLD 且使用俄罗斯 IP 的域名被屏蔽了。** 如果该域名的 IP 位于 RU-CIDR 中——Little Snitch 将会放行。如果不是(例如,托管在国外 VPS 上,但它是俄罗斯服务)——请将其添加到本地 `ru-whitelist.pac` 中(PAC 根据域名进行检查),并添加到本地 Little Snitch 规则组中(允许 `remote-domain`)。 **为什么要屏蔽 URL 中的直接 IP?** 如果有人通过 `http://1.2.3.4/` 进行访问,PAC 无法确定其所在国家——因此将其屏蔽。这种情况比较少见,通常都是跟踪器或广告像素。 ## 许可证与支持 规则与脚本遵循 [MIT](https://opensource.org/licenses/MIT) 协议。欢迎提交 Issues 和 PR。
标签:CDN优化, Chrome, Firefox, IP路由, Little Snitch, PAC文件, Safari, Split Tunneling, URL过滤, VPN, Диск-О, 代理自动配置, 代理规则, 俄罗斯, 分流规则, 反追踪, 基于国家的路由, 应用安全, 开源规则, 流量管理, 浏览器配置, 系统代理, 网络分流, 网络安全, 网络安全, 网络工具, 网络规则, 网络配置, 网络隐私, 虚拟专用网络, 规避审查, 隐私保护, 隐私保护