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.31 (ab405ba)

Входящий ​

Запись в 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.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

Исходящее — 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 реализует входящие и исходящие Snell (type: "snell"; version исходящего — 4 или 6, входящего — 5 или 6; режим QUIC-прокси Snell v5 намеренно не реализован) с полями в snake_case, например psk, obfs_mode и obfs_host. См. Snell — sing-box.

Исходный код: adapter/outbound/snell.go:32-43 · v1.19.31 (ab405ba)

Core Tutorial от Argsment