Skip to content
/ snirect Public

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

License

Notifications You must be signed in to change notification settings

xihale/snirect

Repository files navigation

Snirect

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

支持平台: Linux · macOS · Windows

特性

  • 跨平台支持:原生支持 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 i 安装二进制文件并注册后台服务/任务
snirect uninstall rm 完整卸载(包含二进制、服务 and 配置)
snirect install-cert ic 仅安装根 CA 证书到系统信任库
snirect firefox-cert - 将 CA 证书安装到 Firefox 系浏览器

进阶指南

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

代理设置

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

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

证书管理 (HTTPS 必选)

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

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

配置与规则

  • 配置文件路径:
    • 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
"域名" 使用指定的证书 "*google.com" = "healthdatanexus.ai"
["域名1", "域名2"] 仅允许多个特定域名 "*.redd.it" = ["*.reddit.com", "reddit.com"]

[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 install-cert (及 firefox-cert),并参考下方证书说明
提示端口被占用 config.toml 中修改 server.port (默认为 7654)
某些网站仍无法访问 运行 snirect status 检查状态,或尝试 snirect reset-config 重置规则

证书相关问题

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

  1. 彻底重启浏览器:有些浏览器(如 Chrome)在关闭窗口后仍有后台进程运行。请确保完全杀死所有浏览器进程后再重启。
  2. 刷新证书缓存:在系统证书管理器中检查是否已存在 "Snirect Root CA",如果存在但仍报错,尝试卸载并重新运行 snirect install-cert
  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

Watchers

Forks

Packages

 
 
 

Contributors

Languages