todo/protocols/shadowsocks.md
loop-uh 08b4491545
Some checks failed
Published content check / validate (push) Failing after 3s
Завершить переезд базы знаний на Forgejo
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
2026-08-07 08:27:28 +03:00

16 KiB
Raw Permalink Blame History

date tags aliases link
2026-07-25
протоколы
shadowsocks
обход-блокировок
криптография
Shadowsocks
SS
Shadowsocks 2022
SIP022
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, обфускаторы или транспорт, а от подписки к подписке всё чаще встречается xray/vless с xray/reality.

Идея протокола

Shadowsocks появился в 2012 году как ответ на простую задачу: провести TCP-соединение через сервер за границей так, чтобы наблюдатель не понял, куда именно вы идёте. Автор под ником clowwindy сознательно отказался от сложности: никакого рукопожатия, никаких сертификатов, никакого согласования параметров.

Работает это так. Клиент и сервер знают общий секрет. Клиент открывает TCP-соединение к серверу и первым же делом отправляет зашифрованный заголовок с адресом назначения (домен или IP + порт), а следом — зашифрованные данные. Сервер расшифровывает, подключается куда сказано и гоняет байты в обе стороны.

Проще говоря: Shadowsocks — это SOCKS5-прокси, у которого всё, включая адрес назначения, зашифровано общим паролем. Всё остальное — транспорт, маскировка, мультиплексирование — в базовом протоколе отсутствует.

У такого минимализма есть прямое следствие для обнаружения. Соединение не начинается ни с TLS-рукопожатия, ни с HTTP-запроса — оно начинается со случайно выглядящих байтов и продолжается ими же. В сети, где почти весь трафик распознаваем, «поток без опознавательных знаков» становится отдельной категорией, которую можно отбирать и проверять активным зондированием. Работа исследователей «How China Detects and Blocks Shadowsocks» (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 — спецификация, переработавшая криптографическую часть. Ключевые изменения по официальному описанию и тексту спецификации:

  • 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 проводит честное TLS-рукопожатие с настоящим сторонним сайтом, а внутрь уже кладёт Shadowsocks. Для наблюдателя соединение выглядит как визит на популярный ресурс. Родственный подход — restls; в свежих версиях Clash/06-features-protocols для Shadowsocks появилась и обфускация jls.

Плагины обфускации. Исторический вариант (simple-obfs, v2ray-plugin): дописать протоколу видимость HTTP или WebSocket. Против современных DPI, которые смотрят не только на первые байты, но и на статистику потока, это слабая защита — приём стоит считать устаревшим, хотя в старых конфигах он встречается.

Смена протокола. Самый частый путь на практике: подписки переезжают на xray/vless с xray/reality или на QUIC-протоколы вроде Hysteria/00-overview и protocols/tuic, где маскировка встроена в дизайн, а не пристроена сбоку.

Практические выводы

  • Если в конфиге метод из колонки stream ciphers — меняйте немедленно, это не вопрос гигиены, а вопрос конфиденциальности уже переданного трафика.
  • Из живых вариантов предпочитайте методы 2022-blake3-*; они поддерживаются актуальными ядрами — Clash/02-mihomo, sing-box/sing-box-extended, xray/project-x.
  • Ключ для SIP022 генерируйте, а не придумывайте: спецификация рассчитана на случайный ключ нужной длины, и «удобный пароль» здесь ломает модель безопасности.
  • Голый Shadowsocks в сетях с активным DPI держится плохо. Планируйте обёртку сразу или выбирайте протокол с встроенной маскировкой.

📚 См. также


[!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.