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(通用出站字段)。
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
name | string | (required) | <string> | 唯一的代理名称。 |
server | string | (required) | <host> | 上游服务器主机名或 IP。 |
port | int | (required) | <port> | 上游服务器端口。 |
psk | string | (required) | <string> | 预共享密钥(密码)。 |
udp | bool | false | true | false | 启用 UDP 中继(Snell v2+)。 |
version | int | 1 | 1 | 2 | 3 | 4 | 5 | Snell 协议版本。v5 服务器向后兼容 v4 客户端,因此 mihomo 以 v4 方式拨号。 |
reuse | bool | false | true | false | 复用底层连接。 |
obfs-opts | map[string]any | (disabled) | { mode, ... } | 混淆选项。`mode` 可选 `http` / `tls`(simple-obfs,配 `host`),或 `shadow-tls` / `restls` / `jls`;其余键遵循对应的 Shadowsocks 插件 schema。 |
client-fingerprint | string | (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 的条目。内嵌 BaseOption(listen、port)。
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
psk | string | (required) | <string> | 预共享密钥(密码)。 |
version | int | 4 | 1 | 2 | 3 | 4 | 5 | Snell 协议版本。 |
udp | bool | false | true | false | 启用 UDP 中继(Snell v2+)。 |
obfs-opts | SnellObfsOption | (disabled) | SnellObfsOption | simple-obfs 选项(`{ mode, host }`)。 |
shadow-tls | ShadowTLS | (disabled) | ShadowTLS | 服务端 Shadow-TLS 伪装块(`{ enable, version, password, users, handshake, ... }`)。 |
res-tls | ResTLS | (disabled) | ResTLS | 服务端 Restls 伪装块(`{ enable, dest, password, ... }`);未通过认证的客户端会被中继到 `dest`。 |
jls-config | JLSConfig | (disabled) | JLSConfig | 服务端 JLS 伪装块(`{ enable, users, sni, dest, ... }`);未通过认证的客户端会被中继到 `dest`。 |
源码: listener/inbound/snell.go:13-22 · 锚定版本 v1.19.29 (e26714a)
obfs-opts
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
mode | string | (unset) | http | tls | 混淆模式。 |
host | string | (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键遵循与对应 Shadowsocksplugin-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)
