Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
102 lines
16 KiB
Markdown
102 lines
16 KiB
Markdown
---
|
||
date: 2026-07-25
|
||
tags:
|
||
- протоколы
|
||
- shadowsocks
|
||
- обход-блокировок
|
||
- криптография
|
||
aliases:
|
||
- Shadowsocks
|
||
- SS
|
||
- Shadowsocks 2022
|
||
- SIP022
|
||
link: https://shadowsocks.org/doc/sip022.html
|
||
---
|
||
|
||
# 🧦 Shadowsocks: как устроен самый старый живой прокси обхода
|
||
|
||
> [!info] О чём заметка
|
||
> Разбор протокола **Shadowsocks** — родоначальника современных прокси для обхода цензуры: как он устроен, почему старые шифры небезопасны, что изменила редакция **Shadowsocks 2022 (SIP022)** и в каком виде протокол имеет смысл использовать сегодня. Общая карта протоколов и того, какое ядро что поддерживает, — в [[protocols/00-overview|обзоре протоколов]].
|
||
|
||
## TL;DR
|
||
|
||
- Shadowsocks — **простой шифрованный прокси**: клиент шифрует адрес назначения и данные общим паролем и отправляет серверу. Ни рукопожатия, ни сертификатов, ни маскировки под сайт в базовом виде нет.
|
||
- Именно простота дала протоколу и популярность, и главную слабость: **у трафика нет никакого «легального» вида** — он выглядит как поток случайных байтов, а это само по себе аномалия для DPI.
|
||
- Исторические шифры (**stream ciphers**) сломаны: в феврале 2020 года была опубликована атака, превращающая сервер в оракул расшифровки — записанный трафик можно расшифровать целиком, не зная пароля. Использовать их нельзя.
|
||
- **AEAD-редакция 2017 года** закрыла ту атаку, но оставила проблемы с защитой от повторов и слабый вывод ключа из пароля.
|
||
- **Shadowsocks 2022 (SIP022)** — актуальная редакция: BLAKE3 вместо HKDF-SHA1, обязательный полноценный ключ вместо пароля, полная защита от повторов (включая UDP), сессионный UDP-релей и заголовки идентичности для многопользовательских серверов.
|
||
- Сегодня Shadowsocks редко применяют «голым»: его заворачивают в [[protocols/shadowtls|ShadowTLS]], обфускаторы или транспорт, а от подписки к подписке всё чаще встречается [[xray/vless|VLESS]] с [[xray/reality|REALITY]].
|
||
|
||
## Идея протокола
|
||
|
||
Shadowsocks появился в 2012 году как ответ на простую задачу: провести TCP-соединение через сервер за границей так, чтобы наблюдатель не понял, куда именно вы идёте. Автор под ником clowwindy сознательно отказался от сложности: **никакого рукопожатия, никаких сертификатов, никакого согласования параметров**.
|
||
|
||
Работает это так. Клиент и сервер знают общий секрет. Клиент открывает TCP-соединение к серверу и первым же делом отправляет зашифрованный заголовок с адресом назначения (домен или IP + порт), а следом — зашифрованные данные. Сервер расшифровывает, подключается куда сказано и гоняет байты в обе стороны.
|
||
|
||
Проще говоря: Shadowsocks — это SOCKS5-прокси, у которого всё, включая адрес назначения, зашифровано общим паролем. Всё остальное — транспорт, маскировка, мультиплексирование — в базовом протоколе отсутствует.
|
||
|
||
У такого минимализма есть прямое следствие для обнаружения. Соединение не начинается ни с TLS-рукопожатия, ни с HTTP-запроса — оно начинается со случайно выглядящих байтов и продолжается ими же. В сети, где почти весь трафик распознаваем, «поток без опознавательных знаков» становится отдельной категорией, которую можно отбирать и проверять активным зондированием. Работа исследователей [«How China Detects and Blocks Shadowsocks»](https://gfw.report/publications/imc20/data/paper/shadowsocks.pdf) (IMC 2020) описывает именно такую схему: пассивный отбор кандидатов по статистике и последующая активная проверка сервера.
|
||
|
||
## Три поколения шифрования
|
||
|
||
Понимать разницу поколений важно практически: в конфигах и подписках до сих пор встречаются все три, а безопасны из них не все.
|
||
|
||
| Поколение | Примеры методов | Состояние |
|
||
|---|---|---|
|
||
| **Stream ciphers** (до 2017) | `aes-256-cfb`, `rc4-md5`, `chacha20` | **Сломаны.** Не использовать |
|
||
| **AEAD** (2017) | `aes-256-gcm`, `chacha20-ietf-poly1305` | Работоспособны, но с известными недостатками |
|
||
| **Shadowsocks 2022** (SIP022) | `2022-blake3-aes-128-gcm`, `2022-blake3-aes-256-gcm`, `2022-blake3-chacha20-poly1305` | Актуальная редакция |
|
||
|
||
**Почему потоковые шифры нельзя использовать.** В феврале 2020 года исследователь Zhejiang Peng опубликовал атаку, в которой сервер Shadowsocks выступает **оракулом расшифровки**: злоумышленник, не знающий пароля, модифицирует записанные шифротексты, отправляет их серверу и по реакции восстанавливает открытый текст записанных ранее соединений. Атака работает потому, что потоковые шифры не проверяют целостность сообщения — сервер честно расшифровывает то, что ему подсунули. На AEAD-шифры она не переносится: там подделанное сообщение отбраковывается по тегу аутентификации.
|
||
|
||
Проще говоря: если в вашем конфиге стоит метод вида `aes-256-cfb` или `rc4-md5`, ваш трафик может расшифровать посторонний, никакого пароля для этого не требуется. Это не гипотетический риск и не «устаревшая практика» — это работающая атака.
|
||
|
||
**Что не так с AEAD-редакцией 2017 года.** Она чинит целостность, но оставляет: вывод ключа из пользовательского пароля через HKDF-SHA1 (то есть силу ключа определяет качество пароля), неполную защиту от повторов на TCP (фильтр с растущей со временем долей ложных срабатываний) и её полное отсутствие на UDP.
|
||
|
||
## Что изменила редакция 2022 (SIP022)
|
||
|
||
**Shadowsocks 2022** — спецификация, переработавшая криптографическую часть. Ключевые изменения по [официальному описанию](https://shadowsocks.org/doc/sip022.html) и [тексту спецификации](https://github.com/Shadowsocks-NET/shadowsocks-specs/blob/main/2022-1-shadowsocks-2022-edition.md):
|
||
|
||
- **BLAKE3 вместо HKDF-SHA1** для вывода ключей — современная и быстрая функция.
|
||
- **Криптографический ключ вместо пароля.** В конфиге теперь не «придуманная строка», а сгенерированный случайный ключ в base64. Это убирает целый класс проблем «пароль `12345678` защищает канал».
|
||
- **Полная защита от повторов**, в том числе для UDP: у каждого запроса и ответа есть отдельный заголовочный блок с меткой, повторно отправленный пакет отбраковывается.
|
||
- **Сессионный UDP-релей** — заметно лучше работает с UDP-приложениями (игры, голос), чем прежняя схема «каждый пакет сам по себе».
|
||
- **Extensible Identity Headers** — заголовки идентичности, позволяющие одному серверу обслуживать много пользователей с разными ключами (то, ради чего раньше поднимали отдельный порт на каждого).
|
||
- **Больший размер полезной нагрузки** — до 65 535 байт вместо 16 383.
|
||
|
||
Обязательными к реализации объявлены `2022-blake3-aes-128-gcm` и `2022-blake3-aes-256-gcm`; варианты на ChaCha предусмотрены для процессоров без аппаратного AES.
|
||
|
||
> [!warning] Редакция 2022 не делает трафик незаметным
|
||
> SIP022 решает задачи криптографии и защиты от повторов — но **не задачу маскировки**. Трафик по-прежнему выглядит как поток случайных байтов без опознавательных признаков, и пассивная классификация «это не похоже ни на что легальное» работает против него ровно так же. Если в вашей сети Shadowsocks блокируют по этому признаку, менять шифр бесполезно — нужна обёртка (см. следующий раздел).
|
||
|
||
## Как Shadowsocks выживает сегодня
|
||
|
||
Раз сам протокол вида не имеет, ему этот вид добавляют снаружи. Практикуются три подхода.
|
||
|
||
**Обёртка настоящим TLS.** [[protocols/shadowtls|ShadowTLS]] проводит честное TLS-рукопожатие с настоящим сторонним сайтом, а внутрь уже кладёт Shadowsocks. Для наблюдателя соединение выглядит как визит на популярный ресурс. Родственный подход — `restls`; в свежих версиях [[Clash/06-features-protocols|mihomo]] для Shadowsocks появилась и обфускация `jls`.
|
||
|
||
**Плагины обфускации.** Исторический вариант (`simple-obfs`, `v2ray-plugin`): дописать протоколу видимость HTTP или WebSocket. Против современных DPI, которые смотрят не только на первые байты, но и на статистику потока, это слабая защита — приём стоит считать устаревшим, хотя в старых конфигах он встречается.
|
||
|
||
**Смена протокола.** Самый частый путь на практике: подписки переезжают на [[xray/vless|VLESS]] с [[xray/reality|REALITY]] или на QUIC-протоколы вроде [[Hysteria/00-overview|Hysteria 2]] и [[protocols/tuic|TUIC]], где маскировка встроена в дизайн, а не пристроена сбоку.
|
||
|
||
## Практические выводы
|
||
|
||
- Если в конфиге метод из колонки stream ciphers — **меняйте немедленно**, это не вопрос гигиены, а вопрос конфиденциальности уже переданного трафика.
|
||
- Из живых вариантов предпочитайте методы `2022-blake3-*`; они поддерживаются актуальными ядрами — [[Clash/02-mihomo|mihomo]], [[sing-box/sing-box-extended|sing-box]], [[xray/project-x|Xray-core]].
|
||
- Ключ для SIP022 **генерируйте, а не придумывайте**: спецификация рассчитана на случайный ключ нужной длины, и «удобный пароль» здесь ломает модель безопасности.
|
||
- Голый Shadowsocks в сетях с активным DPI держится плохо. Планируйте обёртку сразу или выбирайте протокол с встроенной маскировкой.
|
||
|
||
## 📚 См. также
|
||
|
||
- [[protocols/00-overview|Обзор протоколов]] — карта: что решает каждый протокол и какое ядро его поддерживает.
|
||
- [[protocols/shadowtls|ShadowTLS]] — обёртка, которая прячет Shadowsocks за рукопожатием настоящего сайта.
|
||
- [[protocols/vmess|VMess]] и [[protocols/trojan|Trojan]] — два других протокола-ветерана и их слабые места.
|
||
- [[xray/vless|Протокол VLESS]] — то, на что чаще всего мигрируют с Shadowsocks.
|
||
- [[Clash/06-features-protocols|Возможности и протоколы mihomo]] — как эти методы называются в YAML-конфиге.
|
||
- 🔗 [SIP022 AEAD-2022 Ciphers](https://shadowsocks.org/doc/sip022.html) — официальное описание актуальной редакции.
|
||
- 🔗 [How China Detects and Blocks Shadowsocks (IMC 2020)](https://gfw.report/publications/imc20/data/paper/shadowsocks.pdf) — исследование схемы обнаружения.
|
||
|
||
---
|
||
|
||
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
|
||
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/protocols/shadowsocks.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).
|