Skip to content

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 (общие поля исходящих).

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(required)<port>Порт вышестоящего сервера.
pskstring(required)<string>Предварительно согласованный ключ (пароль).
udpboolfalsetrue | falseВключить ретрансляцию UDP (Snell v2+).
versionint11 | 2 | 3 | 4 | 5Версия протокола Snell. Серверы v5 обратно совместимы с клиентами v4, поэтому mihomo подключается к ним как v4.
reuseboolfalsetrue | falseПереиспользовать нижележащие соединения.
obfs-optsmap[string]any(disabled){ mode, ... }Параметры обфускации. `mode` выбирает `http` / `tls` (simple-obfs, с `host`) либо `shadow-tls` / `restls` / `jls`; остальные ключи следуют схеме соответствующего плагина Shadowsocks.
client-fingerprintstring(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).

ПолеТипПо умолчаниюДопустимые значенияОписание
pskstring(required)<string>Предварительно согласованный ключ (пароль).
versionint41 | 2 | 3 | 4 | 5Версия протокола Snell.
udpboolfalsetrue | falseВключить ретрансляцию UDP (Snell v2+).
obfs-optsSnellObfsOption(disabled)SnellObfsOptionПараметры simple-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

Исходящее — Snell с HTTP-обфускацией:

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 или новее — включение udp для пира v1 отклоняется.
  • reuse (только исходящее) переиспользует нижележащее соединение. Для Snell v2 это подразумевается; для v4 включается явно этим полем.
  • obfs-opts.mode выбирает слой обфускации: http заворачивает поток в поддельный HTTP-запрос, tls — в поддельную TLS-запись (host задаёт заголовок host обфускации), а shadow-tls / restls / jls выполняют соответствующее камуфляжное TLS-рукопожатие — остальные ключи obfs-opts тогда следуют той же схеме, что и соответствующий блок plugin-opts Shadowsocks (см. 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)

Core Tutorial от Argsment