Skip to content

Shadowsocks — Xray-core

Xray-core поддерживает и классический AEAD-Shadowsocks (AES-GCM, ChaCha20-Poly1305), и Shadowsocks-2022 (шифры 2022-blake3-...) с многопользовательским режимом на основе EIH. При загрузке печатается баннер об устаревании — разработчики Xray рекомендуют шифрование VLESS как современную альтернативу.

Входящий

settings для входящего с "protocol": "shadowsocks":

ПолеТипПо умолчаниюДопустимые значенияОписание
methodstring(required)none | plain | aes-128-gcm | aes-256-gcm | chacha20-poly1305 | xchacha20-poly1305 | 2022-blake3-aes-128-gcm | 2022-blake3-aes-256-gcm | 2022-blake3-chacha20-poly1305Схема шифра / выведения ключа. Неизвестные значения на этапе разбора отображаются в UNKNOWN. Принимаются AEAD-псевдонимы (`aead_aes_128_gcm` и т. п.) и IETF-псевдонимы (`chacha20-ietf-poly1305`).
passwordstring(required for single-user, ignored for SS-2022 multi-user)<string> | <base64 key>Пароль для однопользовательского режима (AEAD) или **серверный ключ EIH** (SS-2022). Для SS-2022 значение — сырые байты ключа в base64, длина которых соответствует шифру (16 / 32 байта).
levelbyte0<byte>Уровень политики по умолчанию, когда не задан для конкретного пользователя.
emailstring(unset)<string>Метка в статистике / журналах.
users[]*ShadowsocksUserConfig[ShadowsocksUserConfig] | …Список учётных записей входящего; та же форма объекта, что и у `clients`. `users` — более новое имя, появившееся в свежих версиях Xray и принимаемое наряду с `clients`.
clients[]*ShadowsocksUserConfig[][ShadowsocksUserConfig]Список пользователей. Шифры SS-2022 поддерживают нескольких пользователей; классические AEAD-шифры — нет.
network*NetworkListtcptcp | udp | tcp,udpРазделённый запятыми список (или одно значение) поддерживаемых транспортов.

Исходный код: infra/conf/shadowsocks.go:41-49 · зафиксировано на v26.7.28 (5ca6f4b)

clients[]

ПолеТипПо умолчаниюДопустимые значенияОписание
methodstring(inherits server)<see server methods>Шифр конкретного пользователя (только SS-2022). Должен принадлежать тому же семейству, что и шифр сервера.
passwordstring(required)<base64 key>Ключ EIH пользователя. Длина должна соответствовать шифру (16 или 32 байта).
levelbyte0<byte>Уровень политики для этого пользователя.
emailstring(unset)<string>Идентификатор пользователя.
address*Address(unset)<host>Необязательный адрес цели ретрансляции. Только для серверной ретрансляции SS-2022.
portuint16(unset)<port>Порт цели ретрансляции (в паре с address).

Исходный код: infra/conf/shadowsocks.go:32-39 · зафиксировано на v26.7.28 (5ca6f4b)

Несколько пользователей — только в SS-2022

Список clients[] действует только с одним из шифров 2022-blake3-.... С классическим AEAD-шифром учитывается только верхнеуровневый password — лишние пользователи в списке молча игнорируются.

Исходящий

settings для исходящего с "protocol": "shadowsocks":

ПолеТипПо умолчаниюДопустимые значенияОписание
address*Address(unset)<host>Упрощённая форма — имя хоста или IP сервера.
portuint16(required with address)<port>Порт сервера.
levelbyte0<byte>Уровень пользователя.
emailstring(unset)<string>Идентификатор пользователя.
methodstring(required)<see inbound methods>Шифр для связи с сервером.
passwordstring(required)<string> | <base64 key>Пароль сервера / ключ SS-2022.
servers[]*ShadowsocksServerTarget(use simplified shape)[ShadowsocksServerTarget]Полная форма, ровно один элемент.

Исходный код: infra/conf/shadowsocks.go:188-196 · зафиксировано на v26.7.28 (5ca6f4b)

servers[]

ПолеТипПо умолчаниюДопустимые значенияОписание
address*Address(required)<host>Имя хоста или IP сервера.
portuint16(required)<port>Порт сервера.
levelbyte0<byte>Уровень пользователя.
emailstring(unset)<string>Идентификатор пользователя.
methodstring(required)<cipher>Шифр.
passwordstring(required)<string> | <base64 key>Пароль / ключ SS-2022.

Исходный код: infra/conf/shadowsocks.go:179-186 · зафиксировано на v26.7.28 (5ca6f4b)

Исходящий принимает либо упрощённую форму (верхнеуровневые address, port, method, password), либо полную форму servers с ровно одним элементом.

Примеры

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

json
{
  "inbounds": [
    {
      "tag": "ss-in",
      "listen": "0.0.0.0",
      "port": 8388,
      "protocol": "shadowsocks",
      "settings": {
        "method": "aes-256-gcm",
        "password": "<password>",
        "network": "tcp,udp"
      }
    }
  ]
}

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

json
{
  "inbounds": [
    {
      "tag": "ss22-in",
      "listen": "0.0.0.0",
      "port": 8388,
      "protocol": "shadowsocks",
      "settings": {
        "method": "2022-blake3-aes-128-gcm",
        "password": "<base64 16-byte server key>",
        "clients": [
          { "password": "<base64 16-byte alice key>", "email": "alice" },
          { "password": "<base64 16-byte bob key>",   "email": "bob"   }
        ],
        "network": "tcp,udp"
      }
    }
  ]
}

Исходящий SS-2022:

json
{
  "outbounds": [
    {
      "tag": "ss-out",
      "protocol": "shadowsocks",
      "settings": {
        "address": "example.com",
        "port": 8388,
        "method": "2022-blake3-aes-256-gcm",
        "password": "<base64 32-byte key>"
      }
    }
  ]
}

Примечания

  • Набор шифров классического AEAD-семейства определяется функцией cipherFromString (infra/conf/shadowsocks.go:16-29), а семейства SS-2022 — константой shadowaead_2022.List (вендоренная константа апстрима). Неизвестные шифры возвращают UNKNOWN и не проходят сборку.
  • method: "none" (или "plain") полностью отключает шифрование — обрамление Shadowsocks сохраняется, но полезная нагрузка передаётся открытым текстом. Используйте только за другим слоем шифрования.
  • Пароли SS-2022 — это сырой ключевой материал в base64. Шифры AEAD-128 используют 16-байтовые ключи; AEAD-256 — 32-байтовые; ChaCha20 — 32-байтовые. Ключ неверной длины даёт сбой при декодировании рукопожатия на уровне протокола (а не при разборе конфигурации).
  • Среда выполнения печатает при загрузке баннер об устаревании («Shadowsocks (with no Forward Secrecy, etc.)») — infra/conf/shadowsocks.go:52, 199.

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

  • sing-box использует users[] для многопользовательского SS-2022 и добавляет массив destinations[] для серверной формы ретрансляции (один сервер SS-2022, раздающий на несколько вышестоящих адресов). Он также поддерживает внешние плагины (plugin, plugin_opts) и по-прежнему предлагает UDP-over-TCP (udp_over_tcp) на исходящем — Xray удалил свои поля uot / uotVersion. См. Shadowsocks — sing-box.
  • mihomo использует имя поля cipher (а не method), принимает опции плагина как общее отображение plugin-opts с ключом по имени плагина и поддерживает богатый набор плагинов обфускации (obfs, v2ray-plugin, shadow-tls, restls, jls, kcptun). См. Shadowsocks — mihomo.

Исходный код: infra/conf/shadowsocks.go:32-196 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment