Skip to content

Snell — sing-box ​

Snell — лёгкий прокси-протокол Surge. sing-box реализует обе стороны: входящий snell (сервер) и исходящий snell (клиент). Реализация охватывает все возможности Snell, кроме режима QUIC-прокси v5, поэтому версии на сторонах различаются — входящий обслуживает версию 5 или 6, исходящий использует версию 4 или 6. Теги сборки не нужны.

Входящий ​

type: "snell" в inbounds[], плюс обычные поля слушателя (listen, listen_port и т. д.):

ПолеТипПо умолчаниюДопустимые значенияОписание
versionint(required)5 | 6Версия Snell, которую обслуживает этот входящий. 5 принимает клиентов Surge v4 и v5 (режим QUIC-прокси v5 не реализован, поэтому формат TCP на проводе такой же, как у v4); 6 принимает клиентов v6. Отсутствующее или иное значение вызывает ошибку при запуске.

Исходный код: option/snell.go:12-17 · зафиксировано на v1.14.2 (af6e64c)

ПолеТипПо умолчаниюДопустимые значенияОписание
pskstring(required)<string>Предварительно общий ключ сервера. Для версии 6 требуется длина от 12 до 255 байт.
users[]SnellUser[][SnellUser]Включает многопользовательский режим: каждый клиент аутентифицируется своим userkey, а psk остаётся ключом сервера.

Исходный код: option/snell.go:19-23 · зафиксировано на v1.14.2 (af6e64c)

users[] ​

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(unset)<string>Необязательная метка для журналов.
userkeystring(required)<string>Ключ пользователя. Клиенты передают его как userkey исходящего.

Исходный код: option/snell.go:135-138 · зафиксировано на v1.14.2 (af6e64c)

Исходящий ​

type: "snell" в outbounds[], плюс server / server_port и поля подключения:

ПолеТипПо умолчаниюДопустимые значенияОписание
versionint(required)4 | 6Используемая версия Snell. 4 работает с серверами v4 и v5 (v5 без режима QUIC-прокси совместим с v4 на проводе); 6 — с серверами v6. Отсутствующее или иное значение вызывает ошибку при запуске.

Исходный код: option/snell.go:70-75 · зафиксировано на v1.14.2 (af6e64c)

ПолеТипПо умолчаниюДопустимые значенияОписание
pskstring(required)<string>Предварительно общий ключ сервера; должен совпадать с серверным.
userkeystring(unset)<string>Ключ пользователя для многопользовательского сервера. Для однопользовательского оставьте пустым. Версия 6 отклоняет ключи длиннее 255 байт.
reuseboolfalsetrue | falseПовторно использовать соединения с сервером через команду CONNECT Snell v2 вместо нового TCP-соединения на каждый запрос.
networkNetworkList(tcp and udp)tcp | udpСети, которые обрабатывает этот исходящий. UDP передаётся внутри TCP-соединения с сервером.

Исходный код: option/snell.go:77-84 · зафиксировано на v1.14.2 (af6e64c)

Поля конкретных версий ​

Эти ключи находятся на верхнем уровне объекта входящего или исходящего, рядом с version. sing-box читает только ключи выбранной версии; ключ другой версии при запуске отклоняется как неизвестный.

Обфускация — входящий версии 5 ​

ПолеТипПо умолчаниюДопустимые значенияОписание
obfs_modestringnonenone | http | tlsТолько версия 5. Обфускация, которую ожидает сервер: нет, маскировка под HTTP-запрос или под TLS-записи. Должна совпадать с клиентами.

Исходный код: option/snell.go:131-133 · зафиксировано на v1.14.2 (af6e64c)

Обфускация — исходящий версии 4 ​

ПолеТипПо умолчаниюДопустимые значенияОписание
obfs_modestringnonenone | http | tlsТолько версия 4. Обфускация поверх соединения; должна совпадать с серверной.
obfs_hoststringbing.com (http) / cloudfront.net (tls)<hostname>Только версия 4. Хост, который показывает обфускация: заголовок HTTP Host в режиме http, имя сервера в поддельном ClientHello в режиме tls.

Исходный код: option/snell.go:140-143 · зафиксировано на v1.14.2 (af6e64c)

Формирование трафика — версия 6 (обе стороны) ​

ПолеТипПо умолчаниюДопустимые значенияОписание
modestringdefaultdefault | unshaped | unsafe-rawТолько версия 6. default формирует трафик по профилю записей и заполнения, выведенному из PSK; unshaped сохраняет шифрование AEAD, но без формирования; unsafe-raw отправляет записи без шифрования. На обеих сторонах используйте один режим.

Исходный код: option/snell.go:145-147 · зафиксировано на v1.14.2 (af6e64c)

Примеры ​

Сервер версии 6 с двумя пользователями:

json
{
  "inbounds": [
    {
      "type": "snell",
      "tag": "snell-in",
      "listen": "::",
      "listen_port": 8443,
      "version": 6,
      "psk": "<at-least-12-byte-psk>",
      "users": [
        { "name": "alice", "userkey": "<alice-key>" },
        { "name": "bob", "userkey": "<bob-key>" }
      ]
    }
  ]
}

Клиент версии 6 для этого сервера:

json
{
  "outbounds": [
    {
      "type": "snell",
      "tag": "snell-out",
      "server": "snell.example.com",
      "server_port": 8443,
      "version": 6,
      "psk": "<at-least-12-byte-psk>",
      "userkey": "<alice-key>"
    }
  ]
}

Клиент версии 4 с HTTP-обфускацией (работает с серверами v4 и v5):

json
{
  "outbounds": [
    {
      "type": "snell",
      "tag": "snell-v4",
      "server": "snell.example.com",
      "server_port": 8388,
      "version": 4,
      "psk": "<psk>",
      "obfs_mode": "http",
      "obfs_host": "www.bing.com"
    }
  ]
}

Примечания ​

  • Пары версий выбраны намеренно: без режима QUIC-прокси v5 протокол TCP на проводе у v5 идентичен v4, поэтому sing-box предоставляет сервер v5 (к нему подключаются клиенты v4 и v5) и клиент v4 (подключается к серверам v4 и v5), но не сервер v4 и не клиент v5.
  • obfs_mode: "tls" принимается парсером и реализован в библиотеке Snell, хотя справочник параметров апстрима перечисляет только none и http.
  • Входящий слушает только TCP. UDP от клиентов ретранслируется внутри TCP-потока, исходящий делает так же, поэтому открывать UDP-порт на сервере не нужно.
  • unsafe-raw полностью убирает слой шифрования. Используйте его только там, где путь уже защищён (например, внутри другого туннеля).
  • В многопользовательском режиме верхнеуровневый psk по-прежнему обязателен и общий для всех пользователей; каждый пользователь определяется своим userkey.

Сравнение с другими ядрами ​

  • mihomo тоже поддерживает Snell на обеих сторонах, с ключами в kebab-case: исходящий принимает version 1–5 (к серверам v5 подключается как v4) и вкладывает обфускацию в obfs-opts (http / tls, а также слои маскировки shadow-tls / restls / jls); входящий использует obfs-opts с http / tls. Snell v6 в mihomo нет. См. Snell — mihomo.
  • Xray-core не поддерживает Snell.

Исходный код: option/snell.go:12-147 · v1.14.2 (af6e64c)

Core Tutorial от Argsment