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 version或snirect status查看当前二进制文件开启的功能模块。
invalid2.invalid 等回退证书。此外,若在配置中手动将 check_hostname 设为 false,也会导致验证失效。在这些特定场景下,存在中间人攻击 (MITM) 的潜在风险。
建议:不建议使用本工具访问涉及个人隐私或账号登录的敏感服务。对于需要高安全性的场景,建议使用专业的加密代理方案。
下载对应平台的二进制文件后,即可直接运行,无需安装:
chmod +x snirect-linux-amd64
# 启动代理并自动开启系统代理
./snirect-linux-amd64 -s# 启动代理并自动开启系统代理
.\snirect-windows-amd64.exe -s注意: 首次运行会提示安装 CA 证书,请务必确认安装。安装后需要重启浏览器才能正常访问 HTTPS 网站。
如果你希望 Snirect 能够随系统启动或作为后台服务运行,可以使用以下方式:
# 安装到系统路径 (~/.local/bin 或 /usr/local/bin) 并注册后台服务
./snirect install# 以管理员身份运行:安装并注册为后台计划任务
.\snirect.exe install- 按下
Win + R键,输入shell:startup并回车,打开“启动”文件夹。 - 将
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
- Linux/macOS:
由于 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
- Linux/macOS:
- 分流规则:
rules.toml决定了哪些域名需要通过 Snirect 修改 SNI。默认规则同步自 Cealing-Host。
Snirect 使用三层规则系统,优先级从高到低为:用户规则 > Fetched Rules > 默认规则。
-
用户规则 (
~/.config/snirect/rules.toml)- 用户自定义的规则,优先级最高
- 可覆盖或禁用 fetched rules
-
Fetched Rules (
internal/config/rules.default.toml)- 从 Cealing-Host 同步的社区维护规则
- 可通过
go run github.com/magefile/mage updateRules更新
-
默认规则 (代码中定义)
- 内置的基础规则,兜底使用
[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__ 是一个特殊标记,用于覆盖 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 网站时提示"连接不安全"、"您的连接不是私密连接"或证书无效:
- 彻底重启浏览器:有些浏览器(如 Chrome)在关闭窗口后仍有后台进程运行。请确保完全杀死所有浏览器进程后再重启。
- 刷新证书缓存:在系统证书管理器中检查是否已存在 "Snirect Root CA",如果存在但仍报错,尝试卸载并重新运行
snirect install-cert。 - 手动导入证书:如果自动安装失败,你可以手动获取证书并导入浏览器:
- 在代理运行状态下,通过浏览器或
curl访问http://localhost:7654/CERT/root.crt下载证书。 - Chrome/Edge: 进入设置 -> 隐私和安全性 -> 安全 -> 管理证书 -> 授权中心 -> 导入。
- Firefox: 进入设置 -> 隐私与安全 -> 查看证书 -> 证书颁发机构 -> 导入(务必勾选"信任由此证书颁发机构来标识网站")。
- 在代理运行状态下,通过浏览器或
如果你需要在 Steam 的内置浏览器中使用代理(例如访问商店等),需要手动导入根证书:
- 开启 Steam 叠加界面:设置 -> 游戏中 -> 确保开启"Steam 叠加界面"
- 打开网页浏览器:随便运行一个游戏,在游戏内使用
Shift + Tab呼出游戏内界面 -> 点击网页浏览器 - 导入根证书:浏览器呼出后在地址栏输入
chrome://settings/certificates并回车,导入根证书。文件类型记得选择所有文件 (All files)。- 证书下载地址:
http://127.0.0.1:7654/CERT/root.crt
- 证书下载地址:
- 灵感来源: Accesser (Python) by URenko.
- 数据来源: Cealing-Host.
- License: MIT