# Shadowsocks

Протокол [Shadowsocks](https://ru.wikipedia.org/wiki/Shadowsocks), совместимый с большинством других реализаций.

Текущая совместимость:

- Поддерживает пересылку пакетов TCP и UDP, при этом UDP можно выборочно отключить;
- Рекомендуемые методы шифрования:
  - 2022-blake3-aes-128-gcm
  - 2022-blake3-aes-256-gcm
  - 2022-blake3-chacha20-poly1305
- Другие методы шифрования:
  - aes-256-gcm
  - aes-128-gcm
  - chacha20-poly1305 или chacha20-ietf-poly1305
  - xchacha20-poly1305 или xchacha20-ietf-poly1305
  - none или plain

Новый формат протокола Shadowsocks 2022 повышает производительность и обеспечивает полную защиту от повторов, решая следующие проблемы безопасности старого протокола:

- [Серьезные уязвимости в шифровании Shadowsocks AEAD, которые не могут гарантировать целостность содержимого](https://github.com/shadowsocks/shadowsocks-org/issues/183)
- Возрастающий коэффициент ложных срабатываний исходного фильтра повторов TCP с течением времени
- Отсутствие защиты от повторов UDP
- Поведение TCP, которое можно использовать для активного зондирования

::: danger
При использовании метода шифрования "none" трафик передается в открытом виде. В целях безопасности не используйте этот метод в общедоступных сетях.
:::

## InboundConfigurationObject

```json
{
  "settings": {
    "network": "tcp,udp",
    "method": "aes-256-gcm",
    "password": "114514",
    "level": 0,
    "email": "love@xray.com",
    "clients": [
      {
        "password": "1919810",
        "method": "aes-128-gcm"
      }
    ]
  }
}
```

> `network`: "tcp" | "udp" | "tcp,udp"

Поддерживаемые типы сетевых протоколов. Например, если указано `"tcp"`, будет приниматься только трафик TCP. Значение по умолчанию: `"tcp"`.

> `method`: string

Метод шифрования, доступные варианты см. выше.

> `password`: string

Обязательный параметр.

- Shadowsocks 2022

Используется предварительный общий ключ, аналогичный WireGuard, в качестве пароля.

Используйте команду `openssl rand -base64 <длина>` для генерации ключа, совместимого с shadowsocks-rust, длина зависит от используемого метода шифрования.

| Метод шифрования              | Длина ключа |
| ----------------------------- | ----------: |
| 2022-blake3-aes-128-gcm       |          16 |
| 2022-blake3-aes-256-gcm       |          32 |
| 2022-blake3-chacha20-poly1305 |          32 |

В реализации Go всегда работают 32-битные ключи.

- Другие методы шифрования

Любая строка. Длина пароля не ограничена, но короткие пароли более уязвимы для взлома, рекомендуется использовать пароли длиной 16 символов или более.

> `level`: number

Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Значение `level` соответствует значению `level` в разделе [policy](../policy.md#levelpolicyobject). Если не указано, используется значение по умолчанию - 0.

> `email`: string

Адрес электронной почты пользователя, используется для разделения трафика разных пользователей (журналы, статистика).

## ClientObject

```json
{
  "password": "1919810",
  "method": "aes-256-gcm",
  "level": 0,
  "email": "love@xray.com"
}
```

Наличие этой опции означает включение многопользовательского режима.

Если `method` в InboundConfigurationObject не является опцией SS2022, можно указать `"method"` для каждого пользователя. (`"method"` также поддерживает только опции, не относящиеся к SS2022) и `"password"` (при этом `"password"`, установленный в InboundConfigurationObject, будет игнорироваться).

Если `method` в InboundConfigurationObject является опцией SS2022, то из соображений безопасности больше не поддерживается установка `"method"` для отдельных пользователей, используется единый `"method"`, указанный в InboundConfigurationObject.

Обратите внимание, что SS2022, в отличие от старого SS, не игнорирует `"password"` верхнего уровня, правильный способ записи пароля клиента: `ServerPassword:UserPassword`. Например: `"password": "114514:1919810"`

Остальные опции имеют то же значение, что и в InboundConfigurationObject.
