Snell — mihomo
Snell — лёгкий прокси-протокол Surge. mihomo реализует и исходящий Snell (для подключения к серверу Snell), и — с недавних пор — входящий слушатель Snell (чтобы выступать таким сервером). Обе стороны поддерживают слой обфускации simple-obfs с режимами http и tls; obfs-opts.mode исходящего дополнительно принимает слои TLS-камуфляжа shadow-tls, restls и jls, входящие аналоги которых — отдельные блоки слушателя 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. |
client-fingerprint | string | (global) | chrome | firefox | safari | ios | edge | random | randomized | Отпечаток client hello uTLS, используемый режимами обфускации `shadow-tls` / `restls` / `jls`. |
Исходный код: 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:
proxies:
- name: snell-srv
type: snell
server: example.com
port: 44046
psk: <pre-shared-key>
version: 3
udp: trueИсходящее — Snell с HTTP-обфускацией:
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:
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 или новее — включение
udpдля пира v1 отклоняется. reuse(только исходящее) переиспользует нижележащее соединение. Для Snell v2 это подразумевается; для v4 включается явно этим полем.obfs-opts.modeвыбирает слой обфускации:httpзаворачивает поток в поддельный HTTP-запрос,tls— в поддельную TLS-запись (hostзадаёт заголовок host обфускации), аshadow-tls/restls/jlsвыполняют соответствующее камуфляжное TLS-рукопожатие — остальные ключиobfs-optsтогда следуют той же схеме, что и соответствующий блокplugin-optsShadowsocks (см. Shadowsocks). Оставьтеobfs-optsнезаданным, чтобы отключить обфускацию. Обе стороны должны согласовать режим и его настройки.client-fingerprintисходящего имеет значение только для режимов обфускацииshadow-tls/restls/jls, где он выбирает client hello uTLS, имитируемый при камуфляжном рукопожатии.- Входящее принимает в
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)
