Skip to content

Snell — mihomo ​

Snell 是 Surge 的轻量级代理协议。mihomo 同时实现了 Snell 出站(用于连接 Snell 服务器)以及 Snell 入站监听器(用于充当 Snell 服务器)。两端都支持带 http 或 tls 模式的 simple-obfs 混淆层;出站的 obfs-opts.mode 还额外接受 shadow-tls、restls 与 jls 这三种 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 | randomizedshadow-tls / restls / jls 混淆模式使用的 uTLS ClientHello 指纹。

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

入站 ​

位于 listeners: 下、type: snell 的条目。内嵌 BaseOption(listen、port)。

字段类型默认值允许值描述
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.31 (ab405ba)

obfs-opts ​

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

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

示例 ​

出站——纯 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 实现了 Snell 入站与出站(type: "snell";出站 version 为 4 或 6,入站为 5 或 6 —— 有意未实现 Snell v5 的 QUIC 代理模式),字段采用 snake_case,如 psk、obfs_mode、obfs_host。参见 Snell — sing-box。

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

由 Argsment 出品的 Core Tutorial