Что такое Shadowsocks
Shadowsocks — открытый зашифрованный прокси-протокол на базе SOCKS5. Создан для обхода интернет-цензуры: маскирует трафик под обычный HTTPS, что делает его практически невидимым для систем глубокой инспекции пакетов (DPI).
Ключевые особенности
История протокола
Shadowsocks родился из необходимости. Один разработчик создал инструмент, который изменил то, как миллионы людей получают доступ к свободному интернету.
Хронология
Китайский разработчик под псевдонимом «clowwindy» публикует первую версию Shadowsocks на GitHub. Цель — обход Великого китайского файрвола (GFW).
В августе «clowwindy» сообщает, что был contacted полицией и вынужден прекратить разработку. Репозиторий удалён. Три дня спустя та же судьба постигает GoAgent — другой популярный инструмент обхода цензуры.
Сообщество стандартизирует шифрование AEAD (Authenticated Encryption with Associated Data) для Shadowsocks. Устаревшие потоковые шифры объявлены небезопасными.
Полная архитектурная переработка протокола. Устранены уязвимости старого AEAD: добавлена защита от replay-атак, улучшена производительность, введены сессионные подключи.
Архитектура клиент-сервер
Shadowsocks — это «разделённый прокси» (split proxy). Система состоит из двух компонентов: локального клиента на вашем устройстве и удалённого сервера в стране без цензуры.
Схема работы
┌─────────────────────────────┐ ┌──────────────────────────────┐
│ ВАШЕ УСТРОЙСТВО │ │ SHADOWSOCKS СЕРВЕР │
│ │ │ (без цензуры, ~443) │
│ Browser ──┐ │ │ │
│ App ──►│ ss-local │──────►│ ss-server │
│ Game ──┘ :1080 (SOCKS5)│ зашифр│ расшифровка │
│ ↓ │ │ ↓ │
│ ШИФРОВАНИЕ │ │ Запрос к ресурсу │
│ AES-256-GCM │ │ ↓ │
└─────────────────────────────┘ │ google.com / youtube / etc │
└──────────────────────────────┘
◄─────── Зашифрованный ответ обратно ───────►
КАК ПРОХОДИТ ЗАПРОС
Браузер или любое приложение отправляет трафик на локальный адрес 127.0.0.1:1080 через стандартный интерфейс SOCKS5. Приложение не знает о шифровании.
Локальный клиент ss-local шифрует данные с помощью AEAD-алгоритма и общего ключа (пароля). К зашифрованному пакету добавляется случайная соль (salt) для генерации сессионного подключа.
Зашифрованный трафик передаётся на сервер (обычно по порту 443). DPI-системы видят лишь случайные байты, неотличимые от HTTPS-трафика.
Сервер ss-server расшифровывает пакет, извлекает целевой адрес в формате SOCKS5 (ATYP + address + port) и отправляет запрос к реальному ресурсу от своего имени.
SOCKS5 и туннель
В основе Shadowsocks лежит SOCKS5 — универсальный прокси-протокол, поддерживающий TCP и UDP. Shadowsocks добавляет поверх него слой AEAD-шифрования.
TCP-соединение
При TCP-запросе локальный клиент инициирует зашифрованное соединение с сервером. Каждый поток данных получает собственный сессионный подключ, который деривируется из общего ключа и случайной соли. Это значит, что два соединения с одним паролем будут выглядеть совершенно по-разному в трафике.
TCP STREAM (зашифрованный):
[ random salt (32 байта) ]
[ length chunk (зашифровано) ][ tag ]
[ payload chunk (зашифровано) ][ tag ]
[ length chunk ][ tag ]
[ payload chunk ][ tag ]
...
UDP-туннель
В отличие от SSH-туннеля, Shadowsocks нативно поддерживает UDP. Каждый UDP-пакет самодостаточен: он содержит зашифрованный заголовок с целевым адресом и зашифрованные данные. Это критично для DNS, VoIP и онлайн-игр.
UDP PACKET (зашифрованный):
[ random salt (32 байта) ]
[ ATYP + address + port (зашифровано) ][ tag ]
[ payload (зашифровано) ][ tag ]
Шифрование AEAD
AEAD (Authenticated Encryption with Associated Data) — это современный стандарт шифрования, который гарантирует одновременно конфиденциальность, целостность и подлинность данных в одной операции.
Принцип работы AEAD
Каждая сессия начинается с генерации случайной соли (salt) длиной 32 байта. Из соли и общего ключа (пароля) с помощью функции HKDF-SHA1 деривируется уникальный сессионный подключ. Все данные в рамках этой сессии шифруются именно им.
password ──────────┐
├──► HKDF-SHA1 ──► session_subkey
random_salt (32B) ─┘
plaintext ──► AEAD_encrypt(session_subkey, nonce, data) ──► ciphertext + tag
nonce: увеличивается на 1 с каждым chunk'ом (защита от replay)
tag: 16 байт аутентификационного тега
Nonce (одноразовое число) начинается с нуля и увеличивается на 1 для каждого зашифрованного блока данных. Это гарантирует, что один и тот же открытый текст всегда даёт разный шифртекст и защищает от атак повторного воспроизведения (replay attacks).
Shadowsocks 2022: улучшения
Версия 2022 (SIP022) — это полная переработка. В ней каждое TCP-соединение маппируется 1:1 к прокси-соединению. Отдельный заголовок шифруется напрямую общим ключом, а тело — сессионным подключом.
Обход DPI и цензуры
DPI (Deep Packet Inspection) — технология анализа трафика, которую применяют интернет-провайдеры и государственные системы фильтрации для определения и блокировки VPN, Tor и прокси-протоколов.
Почему DPI не видит Shadowsocks
OpenVPN и WireGuard имеют характерные заголовки и паттерны рукопожатий, по которым DPI безошибочно их определяет. Shadowsocks же выглядит иначе:
Плагины обфускации
Против более продвинутых DPI-систем (активное зондирование, анализ энтропии) применяются плагины транспортного уровня:
| ПЛАГИН | ОПИСАНИЕ | УРОВЕНЬ ЗАЩИТЫ |
|---|---|---|
| v2ray-plugin | Маскирует трафик под WebSocket over TLS. Наиболее стойкий вариант. | Высокий |
| simple-obfs | Имитирует HTTP или TLS заголовки. Прост в настройке. | Средний |
| cloak | Маскирует под HTTPS с реальным доменом-прикрытием (cover domain). | Высокий |
Формат конфигурации
Конфигурация Shadowsocks хранится в формате JSON. ShadowGate использует тот же стандартный формат, совместимый со всеми реализациями протокола.
Конфиг клиента (ss-local)
config.json{
"server": "server.shadowsocks.ink", // адрес SS-сервера
"server_port": 443, // порт (рекомендуется 443)
"local_address": "127.0.0.1", // локальный адрес SOCKS5
"local_port": 1080, // локальный порт SOCKS5
"password": "your-strong-password", // общий ключ (≥16 символов)
"method": "aes-256-gcm", // алгоритм шифрования
"timeout": 300 // таймаут соединения (сек)
}
Конфиг сервера (ss-server)
server-config.json{
"server": "0.0.0.0", // слушать все интерфейсы
"server_port": 443,
"password": "your-strong-password", // должен совпадать с клиентом
"method": "aes-256-gcm",
"timeout": 300,
"mode": "tcp_and_udp" // включить UDP
}
РЕКОМЕНДАЦИИ ПО ПАРОЛЮ
Используйте пароль длиной не менее 16 символов, сгенерированный случайно. Короткие пароли значительно повышают риск взлома сессионного ключа. Для генерации можно использовать:
Bash / OpenSSLopenssl rand -base64 32
Алгоритмы шифрования
ShadowGate поддерживает только современные AEAD-шифры. Устаревшие потоковые алгоритмы намеренно исключены как небезопасные.
| АЛГОРИТМ | ДЛИНА КЛЮЧА | ТЕГ | ПРИМЕНЕНИЕ | СТАТУС |
|---|---|---|---|---|
| aes-256-gcm | 256 бит | 128 бит | Универсально, рекомендуется | РЕКОМЕНДУЕТСЯ |
| chacha20-ietf-poly1305 | 256 бит | 128 бит | Мобильные, слабые процессоры | РЕКОМЕНДУЕТСЯ |
| 2022-blake3-aes-256-gcm | 256 бит | 128 бит | SS 2022, максимальная защита | SS 2022 |
| aes-128-gcm | 128 бит | 128 бит | Совместимость со старыми устройствами | ДОПУСТИМО |
| aes-128-cfb | 128 бит | — | Потоковый шифр, уязвим | УСТАРЕЛ |
| rc4-md5 | 128 бит | — | Сломан, не использовать | ОПАСЕН |
Shadowsocks vs VPN
Shadowsocks и VPN решают похожие задачи, но с разными компромиссами. Выбор зависит от ваших приоритетов: максимальная стелс-возможность или полное шифрование всего трафика.
| КРИТЕРИЙ | Shadowsocks | OpenVPN / WireGuard |
|---|---|---|
| Основная цель | Обход цензуры, стелс | Безопасность, анонимность |
| Охват трафика | Только настроенные приложения | Весь трафик устройства |
| Видимость для DPI | Очень сложно обнаружить | Легко идентифицируется |
| Скорость | Высокая (лёгкий протокол) | Средняя (overhead выше) |
| Шифрование | AEAD (высокое) | Полное (очень высокое) |
| UDP-поддержка | Нативная | Есть (WireGuard лучше) |
| Настройка | Требует технических знаний | Проще (особенно с GUI) |
| Работа в Китае, России, Иране | Да, устойчиво | Часто блокируется |