Skip to content

Snell — mihomo

Snell 是 Surge 的轻量级代理协议。mihomo 同时实现了 Snell 出站(用于连接 Snell 服务器)以及更近期加入的 Snell 入站监听器(用于充当 Snell 服务器)。两端都支持带 httptls 模式的 simple-obfs 混淆层;出站的 obfs-opts.mode 还额外接受 shadow-tlsrestlsjls 这三种 TLS 伪装层,入站对应的则是专用的 shadow-tls / res-tls / jls-config 监听器块。

出站

位于 proxies: 下、type: snell 的条目。内嵌 BasicOption(通用出站字段)。

字段类型默认值允许值描述
namestring(required)<string>唯一的代理名称。
serverstring(required)<host>上游服务器主机名或 IP。
portint(required)<port>上游服务器端口。
pskstring(required)<string>预共享密钥(密码)。
udpboolfalsetrue | false启用 UDP 中继(Snell v2+)。
versionint11 | 2 | 3 | 4 | 5Snell 协议版本。v5 服务器向后兼容 v4 客户端,因此 mihomo 以 v4 方式拨号。
reuseboolfalsetrue | false复用底层连接。
obfs-optsmap[string]any(disabled){ mode, ... }混淆选项。`mode` 可选 `http` / `tls`(simple-obfs,配 `host`),或 `shadow-tls` / `restls` / `jls`;其余键遵循对应的 Shadowsocks 插件 schema。
client-fingerprintstring(global)chrome | firefox | safari | ios | edge | random | randomized`shadow-tls` / `restls` / `jls` 混淆模式使用的 uTLS ClientHello 指纹。

源码: adapter/outbound/snell.go:32-43 · 锚定版本 v1.19.29 (e26714a)

入站

位于 listeners: 下、type: snell 的条目。内嵌 BaseOptionlistenport)。

字段类型默认值允许值描述
pskstring(required)<string>预共享密钥(密码)。
versionint41 | 2 | 3 | 4 | 5Snell 协议版本。
udpboolfalsetrue | false启用 UDP 中继(Snell v2+)。
obfs-optsSnellObfsOption(disabled)SnellObfsOptionsimple-obfs 选项(`{ mode, host }`)。
shadow-tlsShadowTLS(disabled)ShadowTLS服务端 Shadow-TLS 伪装块(`{ enable, version, password, users, handshake, ... }`)。
res-tlsResTLS(disabled)ResTLS服务端 Restls 伪装块(`{ enable, dest, password, ... }`);未通过认证的客户端会被中继到 `dest`。
jls-configJLSConfig(disabled)JLSConfig服务端 JLS 伪装块(`{ enable, users, sni, dest, ... }`);未通过认证的客户端会被中继到 `dest`。

源码: listener/inbound/snell.go:13-22 · 锚定版本 v1.19.29 (e26714a)

obfs-opts

字段类型默认值允许值描述
modestring(unset)http | tls混淆模式。
hoststring(unset)<host>混淆 host 头。

源码: listener/inbound/snell.go:28-31 · 锚定版本 v1.19.29 (e26714a)

示例

出站——纯 Snell:

yaml
proxies:
  - name: snell-srv
    type: snell
    server: example.com
    port: 44046
    psk: <pre-shared-key>
    version: 3
    udp: true

出站——带 HTTP 混淆的 Snell:

yaml
proxies:
  - name: snell-obfs
    type: snell
    server: example.com
    port: 44046
    psk: <pre-shared-key>
    version: 3
    obfs-opts:
      mode: http
      host: bing.com

位于 listeners 下的入站:

yaml
listeners:
  - name: snell-in
    type: snell
    listen: 0.0.0.0
    port: 44046
    psk: <pre-shared-key>
    version: 3
    udp: true
    obfs-opts:
      mode: tls
      host: bing.com

说明

  • psk 是共享密钥;出站和入站必须使用相同的值。
  • UDP 中继需要 Snell v2 或更新版本——在 v1 对等点上启用 udp 会被拒绝。
  • reuse(仅出站)复用底层连接。对于 Snell v2 它是隐含启用的;对于 v4 则通过此字段主动启用。
  • obfs-opts.mode 选择混淆层:http 将流封装在伪造的 HTTP 请求中,tls 封装在伪造的 TLS 记录中(host 设置混淆 host 头),而 shadow-tls / restls / jls 则执行对应的 TLS 伪装握手 —— 此时其余 obfs-opts 键遵循与对应 Shadowsocks plugin-opts 块相同的 schema(参见 Shadowsocks)。不设置 obfs-opts 即不混淆。两端必须就模式及其设置达成一致。
  • 出站的 client-fingerprint 只对 shadow-tls / restls / jls 混淆模式生效,用于挑选伪装握手期间模拟的 uTLS ClientHello。
  • 入站的 obfs-opts 只接受 http / tls;其 TLS 伪装层改由专用的 shadow-tls / res-tls / jls-config 块配置,三者互斥。

跨内核说明

  • Snell 是 Surge 特有的。Xray-core 与 sing-box 均不支持它——两个内核中都没有等价的出站或入站。

源码: adapter/outbound/snell.go:32-43 · v1.19.29 (e26714a)

由 Argsment 出品的 Core Tutorial