Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
16 KiB
| date | tags | aliases | link | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-07-25 |
|
|
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 держится плохо. Планируйте обёртку сразу или выбирайте протокол с встроенной маскировкой.
📚 См. также
- protocols/00-overview — карта: что решает каждый протокол и какое ядро его поддерживает.
- protocols/shadowtls — обёртка, которая прячет Shadowsocks за рукопожатием настоящего сайта.
- protocols/vmess и protocols/trojan — два других протокола-ветерана и их слабые места.
- xray/vless — то, на что чаще всего мигрируют с Shadowsocks.
- Clash/06-features-protocols — как эти методы называются в YAML-конфиге.
- 🔗 SIP022 AEAD-2022 Ciphers — официальное описание актуальной редакции.
- 🔗 How China Detects and Blocks Shadowsocks (IMC 2020) — исследование схемы обнаружения.
[!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.