Skip to content

xihale/snirect

Repository files navigation

Snirect

Snirect 是一个跨平台的透明 HTTP/HTTPS 代理工具,旨在通过修改 SNI(服务器名称指示)来绕过基于 SNI 的审查和封锁(如 SNI RST)。它是 Accesser (Python) 的 Go 语言实现。

支持平台: Linux · macOS · Windows

当前仓库主要承担桌面 CLI、构建与发布壳层职责;可复用的 Go 实现已经整理到同级模块 ../snirect-core

特性

  • 跨平台支持:原生支持 Windows、macOS 和 Linux。
  • 透明代理:通过 PAC 自动分流,无需手动配置每个应用。
  • SNI 修改:有效绕过 SNI 封锁,直连目标服务器。
  • 一键集成:提供简单的安装命令,支持注册为系统后台服务。
  • 浏览器友好:内置 Firefox 专用证书安装工具,自动处理系统证书信任。
  • 轻量级依赖:默认不包含 QUIC 模块,显著减小二进制体积。

架构概述

Snirect 采用模块化设计,核心组件包括:

  • Proxy:HTTP/HTTPS 代理核心,处理 CONNECT 隧道和 MITM 解密。通过状态机管理连接流程,使用 sync.Pool 复用缓冲区以减少 GC 压力。
  • DNS:多后端 DNS 解析器(UDP/TCP/TLS/DoH/DoQ),内置缓存与 IP 优选策略。
  • Certificate Manager:生成和管理本地 CA 证书,动态签发目标域名的证书用于 MITM。
  • Configuration:三层规则系统(用户 > fetched > 默认)和 TOML 配置加载。支持运行时默认值注入。
  • Upstream:用于更新检查和规则同步的内置 HTTP 客户端,包含可配置的速率限制(upstream_rate_limit)。
  • Update:处理规则同步和自更新,支持自动和手动模式。

主要数据流:客户端请求 → PAC 分流 → Proxy 隧道 → DNS 解析 → Upstream 请求(如需) → 返回响应。

架构图

     +-----------+     +----------+     +----------+
     |  Client   | --> |   PAC    | --> |  Proxy   |
     +-----------+     +----------+     +----------+
                                                |
                                         +--------+--------+
                                         |                 |
                                   Direct tunnel      MITM (SNI modify)
                                         |                 |
                                         v                 v
                                   +------------+   +------------+
                                   |   DNS      |   |   CA       |
                                   +------------+   +------------+
                                         |                 |
                                         +--------+--------+
                                                  |
                                                  v
                                            +------------+
                                            | Upstream   |
                                            +------------+

编译与开发

本项目全面使用 Mage 作为构建系统。由于采用了零依赖模式,你无需预装 mage,直接使用 Go 运行即可:

版本 编译命令 说明
标准版 (默认) go run github.com/magefile/mage build 极致轻量 (~8MB)。包含核心代理、系统服务管理、CA 证书自动安装。
完整版 go run github.com/magefile/mage full 包含所有功能,增加 QUIC (DoQ/H3) 支持。体积约 11MB。

常用构建命令

  • 清理产物: go run github.com/magefile/mage clean
  • 交叉编译: go run github.com/magefile/mage crossAll
  • 同步规则: go run github.com/magefile/mage updateRules
  • 查看所有目标: go run github.com/magefile/mage -l

提示:所有编译出的二进制文件将存放在 dist/ 目录下。

提示:可以使用 snirect versionsnirect status 查看当前二进制文件开启的功能模块。


注意事项

⚠️ 安全性警告: 由于技术限制,在使用本工具连接 Gemini (gemini.google.com) 时,服务器会因 SNI 剥离而返回 invalid2.invalid 等回退证书。此外,若在配置中手动将 check_hostname 设为 false,也会导致验证失效。在这些特定场景下,存在中间人攻击 (MITM) 的潜在风险

建议:不建议使用本工具访问涉及个人隐私或账号登录的敏感服务。对于需要高安全性的场景,建议使用专业的加密代理方案。


下载对应平台的二进制文件后,即可直接运行,无需安装:

Linux / macOS

chmod +x snirect-linux-amd64
# 启动代理并自动开启系统代理
./snirect-linux-amd64 -s

Windows

# 启动代理并自动开启系统代理
.\snirect-windows-amd64.exe -s

注意: 首次运行会提示安装 CA 证书,请务必确认安装。安装后需要重启浏览器才能正常访问 HTTPS 网站。


系统安装 (可选)

如果你希望 Snirect 能够随系统启动或作为后台服务运行,可以使用以下方式:

Linux / macOS

# 安装到系统路径 (~/.local/bin 或 /usr/local/bin) 并注册后台服务
./snirect install

Windows (方式一:注册为计划任务)

# 以管理员身份运行:安装并注册为后台计划任务
.\snirect.exe install

Windows (方式二:移动到启动目录)

  1. 按下 Win + R 键,输入 shell:startup 并回车,打开“启动”文件夹。
  2. snirect.exe 文件的快捷方式(或程序本身)移动到该文件夹中。

说明

  • 静默运行:手动双击打开时会显示窗口;若在系统启动 3 分钟内运行(即开机自启场景)或通过计划任务启动,程序将自动隐藏窗口进入后台运行。
  • 系统代理:程序启动后会自动配置系统代理(由 config.toml 中的 set_proxy 控制,默认为 true)。

常用命令

命令 简写 说明
snirect -s - 启动代理并自动启用系统代理
snirect status - 查看当前代理、证书和服务的运行状态
snirect install - 安装二进制文件并注册后台服务/任务
snirect uninstall - 完整卸载(包含二进制、服务和配置)
snirect cert install - 安装根 CA 证书到系统信任库
snirect cert firefox install - 将 CA 证书安装到 Firefox 系浏览器

进阶指南

点击展开查看更多配置与使用细节

代理设置

Snirect 主要通过 PAC (Proxy Auto-Config) 进行系统级代理设置:

  • 全局启用: snirect proxy set
  • 全局禁用: snirect proxy unset
  • 仅当前终端生效:
    • Linux/macOS: eval $(snirect proxy env)
    • Windows PowerShell: & snirect.exe proxy env | Invoke-Expression

证书管理 (HTTPS 必选)

由于 HTTPS 代理需要解密 SNI,浏览器必须信任 Snirect 的根证书:

  • Chrome/Edge/Brave/Safari: 使用系统信任库,运行 snirect cert install 即可.
  • Firefox 系列: Firefox 使用独立的证书库,请运行 snirect cert firefox install 进行自动安装。

配置与规则

  • 配置文件路径:
    • Linux/macOS: ~/.config/snirect/config.toml
    • Windows: %APPDATA%\snirect\config.toml
  • 分流规则: rules.toml 决定了哪些域名需要通过 Snirect 修改 SNI。默认规则同步自 Cealing-Host

规则系统详解

Snirect 使用三层规则系统,优先级从高到低为:用户规则 > Fetched Rules > 默认规则

规则优先级

  1. 用户规则 (~/.config/snirect/rules.toml)

    • 用户自定义的规则,优先级最高
    • 可覆盖或禁用 fetched rules
  2. Fetched Rules (internal/config/rules.default.toml)

    • 从 Cealing-Host 同步的社区维护规则
    • 可通过 go run github.com/magefile/mage updateRules 更新
  3. 默认规则 (代码中定义)

    • 内置的基础规则,兜底使用

规则配置段

[alter_hostname] - SNI 伪装规则

将目标域名映射到另一个域名以进行 SNI 伪装。

值类型 含义 示例
域名 替换 SNI 为指定域名 "*pixiv.net" = "pixivision.net"
"" (空) 剥离 SNI (可能导致 TLS 握手失败) "cdn.jsdelivr.net" = ""
"__AUTO__" 使用默认行为 (保留原始 SNI) "example.com" = "__AUTO__"

[cert_verify] - 证书验证例外

为特定域名覆盖全局的 check_hostname 设置。

值类型 含义 示例
false 跳过所有证书验证(白名单模式) "internal.corp" = false
true 启用宽松验证 (匹配子域名) "*.example.com" = true
"域名" 仅允许证书 DNS 名匹配指定模式的证书(跳过链验证和主机名验证) "*pixiv.net" = "pixivision.net"
["域名1", "域名2"] 仅允许证书 DNS 名匹配列表中任一模式的证书(跳过链验证和主机名验证) "*.redd.it" = ["*.reddit.com", "reddit.com"]

注意: false 跳过所有验证,仅建议用于信任的环境(如 Google 系域名通过中转代理连接时)。使用 "域名"["域名"] 时,程序检查服务器证书的 DNS 名称是否匹配允许的模式,跳过链验证和主机名验证,但仍会检查有效期和 EKU。

[hosts] - 静态 Host 映射

将域名映射到指定的 IP 地址,绕过 DNS 解析。

值类型 含义 示例
IP 地址 使用指定 IP "github.com" = "20.27.177.113"
"__AUTO__" 使用程序配置的 DoH/DoT DNS "example.com" = "__AUTO__"

规则匹配模式

模式 匹配规则 示例
*example.com 匹配所有以 example.com 结尾的域名 *google.com 匹配 www.google.com, mail.google.com
example* 匹配所有以 example 开头的域名 example* 匹配 example.com, example.org
$example.com 精确匹配,仅匹配该域名本身 $github.com 不匹配 www.github.com
#... 被注释掉的规则 (不生效) # "example.com" = "alt.com"

__AUTO__ 标记说明

__AUTO__ 是一个特殊标记,用于覆盖 fetched rules,让域名使用程序默认的自动行为:

  • alter_hostname 中: 保留原始 SNI,不进行任何修改
  • hosts 中: 使用程序配置的 DoH/DoT DNS 解析,而非 fetched rules 中的静态 IP

使用场景示例:

[hosts]
# Steam 的 fetched rules 使用静态 IP 23.46.197.62
# 但该 IP 可能失效或被封锁,使用 __AUTO__ 改为 DoH/DoT 动态解析
"store.steampowered.com" = "__AUTO__"

[alter_hostname]
# Steam 的 fetched rules 剥离 SNI (值为 "")
# 如果服务器拒绝空 SNI,可使用 __AUTO__ 保留原始 SNI
"store.steampowered.com" = "__AUTO__"

教程与最佳实践


故障排除

问题 解决方法
浏览器提示“证书无效” 运行 snirect cert install (及 snirect cert firefox install),并参考下方证书说明
提示端口被占用 config.toml 中修改 server.port (默认为 7654)
某些网站仍无法访问 运行 snirect status 检查状态,或尝试 snirect config reset 重置规则

证书相关问题

如果浏览器访问 HTTPS 网站时提示"连接不安全"、"您的连接不是私密连接"或证书无效:

  1. 彻底重启浏览器:有些浏览器(如 Chrome)在关闭窗口后仍有后台进程运行。请确保完全杀死所有浏览器进程后再重启。
  2. 刷新证书缓存:在系统证书管理器中检查是否已存在 "Snirect Root CA",如果存在但仍报错,尝试卸载并重新运行 snirect cert install
  3. 手动导入证书:如果自动安装失败,你可以手动获取证书并导入浏览器:
    • 在代理运行状态下,通过浏览器或 curl 访问 http://localhost:7654/CERT/root.crt 下载证书。
    • Chrome/Edge: 进入设置 -> 隐私和安全性 -> 安全 -> 管理证书 -> 授权中心 -> 导入。
    • Firefox: 进入设置 -> 隐私与安全 -> 查看证书 -> 证书颁发机构 -> 导入(务必勾选"信任由此证书颁发机构来标识网站")。

Steam 浏览器证书

如果你需要在 Steam 的内置浏览器中使用代理(例如访问商店等),需要手动导入根证书:

  1. 开启 Steam 叠加界面:设置 -> 游戏中 -> 确保开启"Steam 叠加界面"
  2. 打开网页浏览器:随便运行一个游戏,在游戏内使用 Shift + Tab 呼出游戏内界面 -> 点击网页浏览器
  3. 导入根证书:浏览器呼出后在地址栏输入 chrome://settings/certificates 并回车,导入根证书。文件类型记得选择所有文件 (All files)。
    • 证书下载地址:http://127.0.0.1:7654/CERT/root.crt

开发与致谢

About

A transparent proxy designed to bypass SNI-based censorship (SNI RST).

Resources

License

Stars

7 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors

Languages