Snell — sing-box
Snell — лёгкий прокси-протокол Surge. sing-box реализует обе стороны: входящий snell (сервер) и исходящий snell (клиент). Реализация охватывает все возможности Snell, кроме режима QUIC-прокси v5, поэтому версии на сторонах различаются — входящий обслуживает версию 5 или 6, исходящий использует версию 4 или 6. Теги сборки не нужны.
Входящий
type: "snell" в inbounds[], плюс обычные поля слушателя (listen, listen_port и т. д.):
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | int | (required) | 5 | 6 | Версия Snell, которую обслуживает этот входящий. 5 принимает клиентов Surge v4 и v5 (режим QUIC-прокси v5 не реализован, поэтому формат TCP на проводе такой же, как у v4); 6 принимает клиентов v6. Отсутствующее или иное значение вызывает ошибку при запуске. |
Исходный код: option/snell.go:12-17 · зафиксировано на v1.14.2 (af6e64c)
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
psk | string | (required) | <string> | Предварительно общий ключ сервера. Для версии 6 требуется длина от 12 до 255 байт. |
users | []SnellUser | [] | [SnellUser] | Включает многопользовательский режим: каждый клиент аутентифицируется своим userkey, а psk остаётся ключом сервера. |
Исходный код: option/snell.go:19-23 · зафиксировано на v1.14.2 (af6e64c)
users[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (unset) | <string> | Необязательная метка для журналов. |
userkey | string | (required) | <string> | Ключ пользователя. Клиенты передают его как userkey исходящего. |
Исходный код: option/snell.go:135-138 · зафиксировано на v1.14.2 (af6e64c)
Исходящий
type: "snell" в outbounds[], плюс server / server_port и поля подключения:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | int | (required) | 4 | 6 | Используемая версия Snell. 4 работает с серверами v4 и v5 (v5 без режима QUIC-прокси совместим с v4 на проводе); 6 — с серверами v6. Отсутствующее или иное значение вызывает ошибку при запуске. |
Исходный код: option/snell.go:70-75 · зафиксировано на v1.14.2 (af6e64c)
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
psk | string | (required) | <string> | Предварительно общий ключ сервера; должен совпадать с серверным. |
userkey | string | (unset) | <string> | Ключ пользователя для многопользовательского сервера. Для однопользовательского оставьте пустым. Версия 6 отклоняет ключи длиннее 255 байт. |
reuse | bool | false | true | false | Повторно использовать соединения с сервером через команду CONNECT Snell v2 вместо нового TCP-соединения на каждый запрос. |
network | NetworkList | (tcp and udp) | tcp | udp | Сети, которые обрабатывает этот исходящий. UDP передаётся внутри TCP-соединения с сервером. |
Исходный код: option/snell.go:77-84 · зафиксировано на v1.14.2 (af6e64c)
Поля конкретных версий
Эти ключи находятся на верхнем уровне объекта входящего или исходящего, рядом с version. sing-box читает только ключи выбранной версии; ключ другой версии при запуске отклоняется как неизвестный.
Обфускация — входящий версии 5
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
obfs_mode | string | none | none | http | tls | Только версия 5. Обфускация, которую ожидает сервер: нет, маскировка под HTTP-запрос или под TLS-записи. Должна совпадать с клиентами. |
Исходный код: option/snell.go:131-133 · зафиксировано на v1.14.2 (af6e64c)
Обфускация — исходящий версии 4
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
obfs_mode | string | none | none | http | tls | Только версия 4. Обфускация поверх соединения; должна совпадать с серверной. |
obfs_host | string | bing.com (http) / cloudfront.net (tls) | <hostname> | Только версия 4. Хост, который показывает обфускация: заголовок HTTP Host в режиме http, имя сервера в поддельном ClientHello в режиме tls. |
Исходный код: option/snell.go:140-143 · зафиксировано на v1.14.2 (af6e64c)
Формирование трафика — версия 6 (обе стороны)
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mode | string | default | default | unshaped | unsafe-raw | Только версия 6. default формирует трафик по профилю записей и заполнения, выведенному из PSK; unshaped сохраняет шифрование AEAD, но без формирования; unsafe-raw отправляет записи без шифрования. На обеих сторонах используйте один режим. |
Исходный код: option/snell.go:145-147 · зафиксировано на v1.14.2 (af6e64c)
Примеры
Сервер версии 6 с двумя пользователями:
{
"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 для этого сервера:
{
"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):
{
"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: исходящий принимает
version1–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)
