Skip to content

Shadowsocks — sing-box

sing-box реализует всё семейство Shadowsocks: классический AEAD, Shadowsocks-2022 с многопользовательским EIH, протоколы плагинов v2ray-plugin и obfs, а также уникальную для SS-2022 форму серверной ретрансляции.

Входящий

Входящий type: "shadowsocks":

ПолеТипПо умолчаниюДопустимые значенияОписание
networkNetworkList(tcp+udp)tcp | udp | Ограничение только TCP или только UDP. Пустое значение включает оба.
methodstring(required)none | aes-128-gcm | aes-256-gcm | chacha20-ietf-poly1305 | xchacha20-ietf-poly1305 | 2022-blake3-aes-128-gcm | 2022-blake3-aes-256-gcm | 2022-blake3-chacha20-poly1305Шифр, используемый входящим. Шифры SS-2022 включают `users[]` и `destinations[]`.
passwordstring(required for single-user)<string> | <base64 key>Пароль для одного пользователя или серверный EIH-ключ SS-2022.
users[]ShadowsocksUser[][ShadowsocksUser]Список пользователей — только для SS-2022. У каждого пользователя собственный EIH-ключ.
destinations[]ShadowsocksDestination[][ShadowsocksDestination]Серверные цели ретрансляции. Серверы SS-2022 могут разводить один входящий на несколько вышестоящих адресов, выбираемых по EIH.
multiplex*InboundMultiplexOptions(disabled)InboundMultiplexOptionsМультиплексирование на стороне сервера.
managedboolfalsetrue | falseВключает протокол управляемого режима, позволяющий ssmgmt-совместимым клиентам перенастраивать пользователей во время работы.

Исходный код: option/shadowsocks.go:3-12 · зафиксировано на v1.13.15 (3708fa1)

Структура встраивает ListenOptions (адрес прослушивания, порт, сниффинг, …).

users[]

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(unset)<string>Отображаемое имя, используемое в статистике и журналах.
passwordstring(required)<base64 key>EIH-ключ пользователя. Длина должна соответствовать шифру (16 или 32 байта).

Исходный код: option/shadowsocks.go:14-17 · зафиксировано на v1.13.15 (3708fa1)

destinations[]

Каждая цель встраивает ServerOptions (server, server_port) и имеет собственные имя и пароль.

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(unset)<string>Отображаемое имя этой цели.
passwordstring(required)<base64 key>EIH-ключ цели.

Исходный код: option/shadowsocks.go:19-23 · зафиксировано на v1.13.15 (3708fa1)

Исходящий

Исходящий type: "shadowsocks":

ПолеТипПо умолчаниюДопустимые значенияОписание
methodstring(required)<cipher>Шифр сервера.
passwordstring(required)<string> | <base64 key>Пароль сервера / ключ SS-2022.
pluginstring(unset)obfs-local | v2ray-plugin | shadow-tls | kcptunВнешний плагин Shadowsocks, оборачивающий поток. `obfs-local` и `v2ray-plugin` встроены в sing-box; остальные требуют внешнего исполняемого файла в PATH.
plugin_optsstring(unset)<plugin-specific string>Разделённые точкой с запятой параметры, передаваемые плагину (`mode=tls;host=example.com;...`).
networkNetworkList(tcp+udp)tcp | udp | Ограничение только TCP или только UDP.
udp_over_tcp*UDPOverTCPOptions(disabled)UDPOverTCPOptionsОборачивает UDP-пакеты внутри TCP-потока. Форма объекта: `{enabled, version}`.
multiplex*OutboundMultiplexOptions(disabled)OutboundMultiplexOptionsМультиплексирование на стороне клиента (должно совпадать с настройками сервера).

Исходный код: option/shadowsocks.go:25-35 · зафиксировано на v1.13.15 (3708fa1)

Встраивает DialerOptions и ServerOptions.

Примеры

Классический AEAD-входящий:

json
{
  "inbounds": [
    {
      "type": "shadowsocks",
      "tag": "ss-in",
      "listen": "::",
      "listen_port": 8388,
      "method": "aes-256-gcm",
      "password": "<password>"
    }
  ]
}

Входящий SS-2022 с двумя пользователями:

json
{
  "inbounds": [
    {
      "type": "shadowsocks",
      "tag": "ss22-in",
      "listen": "::",
      "listen_port": 8388,
      "method": "2022-blake3-aes-128-gcm",
      "password": "<base64 16-byte server key>",
      "users": [
        { "name": "alice", "password": "<base64 16-byte alice key>" },
        { "name": "bob",   "password": "<base64 16-byte bob key>" }
      ]
    }
  ]
}

Исходящий с v2ray-plugin:

json
{
  "outbounds": [
    {
      "type": "shadowsocks",
      "tag": "ss-out",
      "server": "example.com",
      "server_port": 8388,
      "method": "chacha20-ietf-poly1305",
      "password": "<password>",
      "plugin": "v2ray-plugin",
      "plugin_opts": "mode=websocket;tls;host=example.com;path=/ss"
    }
  ]
}

Исходящий с UDP-over-TCP v2:

json
{
  "outbounds": [
    {
      "type": "shadowsocks",
      "server": "example.com",
      "server_port": 8388,
      "method": "2022-blake3-aes-256-gcm",
      "password": "<base64 32-byte key>",
      "udp_over_tcp": { "enabled": true, "version": 2 }
    }
  ]
}

Примечания

  • sing-box принимает как IETF-имена шифров (chacha20-ietf-poly1305), так и исторические не-IETF-имена, но внутри протокольного слоя приводит каждый шифр к единственному написанию.
  • destinations[] — специфика sing-box. Сервер SS-2022 с целями работает как ретранслятор, различающий клиентов по EIH: каждая цель несёт собственный EIH-ключ, и входящее соединение, прошедшее аутентификацию по одному из них, перенаправляется на server / server_port этой цели, а не обрабатывается локально.
  • plugin: "v2ray-plugin" и plugin: "obfs-local" встроены в sing-box (внешний исполняемый файл не нужен). Остальные имена плагинов вызывают внешний исполняемый файл с тем же именем; протокол плагинов соответствует спецификации плагинов shadowsocks-libev.
  • udp_over_tcp — объект ({enabled, version}), тогда как mihomo использует два плоских поля с другими именами. Xray-core удалил свои поля UoT в v26.7.x, так что теперь эта возможность есть только у sing-box и mihomo.

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

  • Xray использует clients[] (а не users[]) и не поддерживает UDP-over-TCP (прежние исходящие поля uot / uotVersion удалены в v26.7.x). Формы ретрансляции destinations[] у него нет. См. Shadowsocks — Xray-core.
  • mihomo использует cipher (а не method) и принимает plugin-opts как типизированное YAML-отображение с ключами по имени плагина. См. Shadowsocks — mihomo.

Исходный код: option/shadowsocks.go:3-35 · v1.13.15 (3708fa1)

Core Tutorial от Argsment