Shadowsocks — это зашифрованный протокол прокси. Устройство отправляет каждое соединение на сервер Shadowsocks, зашифровав его ключом, который знаете только вы и сервер, а сервер уже сам подключается к нужному сайту. Протокол легкий, передает и TCP, и UDP и не имеет узнаваемого рукопожатия, поэтому в сети он выглядит как поток случайных байтов.
В этой статье разберем, что такое Shadowsocks, как он работает, какие шифры использовать, что делают плагины, как читать ссылку ss:// и чем Shadowsocks отличается от VPN. Сервер у вас уже есть? Переходите к инструкции как настроить Shadowsocks на iPhone.
Что такое Shadowsocks?
Shadowsocks состоит из двух частей: клиента на вашем устройстве и сервера, который запускаете вы или ваш провайдер. У обоих общий шифр и пароль (а в новейших шифрах — ключ). Каждый раз, когда приложение открывает соединение, клиент шифрует его и отправляет на сервер. Сервер расшифровывает данные, подключается к настоящему адресу назначения и передает данные в обе стороны.
Протокол открыт и описан в серии спецификаций SIP на shadowsocks.org. Поэтому он и встречается повсюду: есть серверы на Rust, C и Go, а еще он встроен в большинство мультипротокольных инструментов, таких как sing-box, Xray и Mihomo. Сервер Shadowsocks может выдать почти любой провайдер прокси.
Немного истории
- 2012: разработчик под ником clowwindy выпустил Shadowsocks как небольшой проект на Python. Он задумывался для людей в сетях с цензурой, которым нужно было что-то проще и легче полноценного VPN.
- 2015: автор прекратил работу над проектом и удалил код с GitHub. Сообщество продолжило его развивать в форках, таких как shadowsocks-libev, а позже shadowsocks-rust.
- 2017: шифры AEAD (SIP004) пришли на смену исходным потоковым шифрам как рекомендуемый вариант и устранили проблемы с целостностью данных в старой схеме.
- 2022: редакция Shadowsocks 2022 (SIP022) добавила ключи фиксированной длины и защиту от повторного воспроизведения.
Как работает Shadowsocks
Вот что происходит, когда приложение на iPhone загружает страницу через сервер Shadowsocks:
- Приложение-клиент перехватывает соединение. На iOS для этого используется конфигурация VPN.
- Клиент шифрует адрес назначения (например,
example.org:443) и первые данные общим ключом и отправляет их на адрес и порт сервера. - Сервер расшифровывает их. Если не получается — из-за неверного пароля или шифра, — он просто обрывает соединение.
- Сервер подключается к
example.org:443и передает данные в обе стороны, шифруя все, что идет обратно к вам. - UDP-пакеты, например голосового звонка, шифруются по одному и отправляются на тот же порт сервера.
iPhone ──(encrypted Shadowsocks)──▶ ss.example.com:8388 ──(normal connection)──▶ example.org
Здесь нет ни приветствия, ни обмена сертификатами. Первые байты — это случайная соль, за которой идет шифротекст. Благодаря этому Shadowsocks быстро устанавливает соединение, но и сообщения об ошибке при неверном пароле вы не получите: соединение просто завершится по тайм-ауту.
Шифры Shadowsocks: 2022, AEAD и потоковые
Шифр определяет, как шифруется ваш трафик. В Shadowsocks есть три семейства:
| Семейство | Примеры | Рекомендация |
|---|---|---|
| 2022 (SIP022) | 2022-blake3-aes-128-gcm, 2022-blake3-aes-256-gcm, 2022-blake3-chacha20-poly1305 |
Лучший выбор, если сервер его поддерживает |
| AEAD (SIP004) | aes-256-gcm, aes-128-gcm, chacha20-ietf-poly1305 |
Хороший и очень широко поддерживаемый вариант |
| Потоковые | aes-256-cfb, chacha20-ietf, rc4-md5 |
Устаревшие. Только если сервер не предлагает ничего другого |
Шифры AEAD проверяют подлинность каждого фрагмента данных, поэтому сервер отбрасывает все, что было изменено по пути. Старые потоковые шифры только шифруют: данные можно изменить так, что ни одна сторона этого не заметит, а серверы с такими шифрами проще прощупать активными пробами.
Шифры 2022 идут еще дальше. Вместо пароля они используют случайный ключ, так что слабых паролей просто не бывает. Они добавляют метки времени и защиту от повторного воспроизведения, поэтому записанное соединение нельзя просто отправить снова. Кроме того, несколько пользователей могут работать через один порт, каждый со своим ключом (SIP023). Ключ 2022 — это строка Base64 фиксированной длины, ее можно сгенерировать так:
openssl rand -base64 16
Это 16 байт для 2022-blake3-aes-128-gcm. Остальным шифрам 2022 нужно 32. Полный список шифров, которые поддерживает Potatso, — в справке по Shadowsocks.
Плагины Shadowsocks
Плагин (SIP003) оборачивает соединение Shadowsocks в еще один слой, чтобы оно выглядело как что-то другое:
- simple-obfs маскирует соединение под обычный HTTP или начало сеанса TLS.
- v2ray-plugin и gost-plugin передают его через WebSocket, при желании с TLS. Так оно может проходить через CDN или веб-сервер.
- ShadowTLS, Restls и JLS выполняют настоящее рукопожатие TLS с сайтом-прикрытием, а затем передают соединение Shadowsocks.
У плагинов есть цена. Каждый добавляет накладные расходы, а большинство передают только TCP, так что UDP либо идет в обход плагина, либо не работает. Некоторые плагины, например Cloak и kcptun, — это отдельные программы, которые приложения на iOS не могут запускать рядом с клиентом.
Как выглядит ссылка ss://
Обычно провайдеры делятся сервером в виде ссылки ss:// (SIP002), часто в виде QR-кода:
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:8388#Tokyo
YWVzLTI1Ni1nY206c2VjcmV0— этоaes-256-gcm:secretв Base64: шифр и пароль.ss.example.com:8388— адрес и порт сервера.#Tokyo— название, которое покажет приложение.
Сервер 2022 указывает шифр и ключ открытым текстом в процентной кодировке, а плагин задается параметром plugin:
ss://2022-blake3-aes-128-gcm:MTIzNDU2Nzg5MDEyMzQ1Ng%3D%3D@ss.example.com:8388#2022
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:443/?plugin=simple-obfs%3Bobfs%3Dtls%3Bobfs-host%3Dcdn.example.com#Obfs
Провайдеры с большим количеством серверов обычно вместо этого дают URL подписки со списком всех серверов. См. Что такое подписка прокси.
Shadowsocks или VPN
Shadowsocks часто называют VPN, но работает он иначе, чем WireGuard, OpenVPN или IPsec:
| Shadowsocks | Классический VPN | |
|---|---|---|
| Что передает | Отдельные TCP-соединения и UDP-пакеты | Все IP-пакеты через виртуальную сеть |
| Рукопожатие | Не видно; выглядит как случайные байты | Узнаваемое рукопожатие |
| Маршрутизация | Клиент может выбирать для каждого сайта по правилам | Обычно весь трафик или по диапазонам IP |
| На iPhone | Нужно приложение-клиент | IKEv2 встроен в iOS; для остальных нужно приложение |
| Что видит сервер | Сайты, к которым вы подключаетесь | Сайты, к которым вы подключаетесь |
На iPhone граница размывается: клиент Shadowsocks перехватывает трафик через конфигурацию VPN в iOS, поэтому вы видите значок VPN. Но с телефона уходит Shadowsocks, а не протокол VPN.
Ни то ни другое не дает анонимности. Владелец сервера видит, куда вы подключаетесь, поэтому выбирайте провайдера, которому доверяете, или запустите собственный сервер.
Сильные и слабые стороны
Сильные стороны
- Простой и легкий протокол с минимальными накладными расходами.
- Передает UDP, поэтому работают звонки, игры и QUIC.
- Поддерживается почти всеми клиентами, серверами и провайдерами.
- Современные шифры 2022 и AEAD хорошо спроектированы.
Слабые стороны
- Трафик, который выглядит полностью случайным, сам по себе может быть признаком. Исследователи показали, что такой шаблон можно обнаружить, поэтому и стали популярны протоколы на основе TLS.
- Без плагина нет маскировки под TLS, а плагины в основном не передают UDP.
- Старые серверы до сих пор могут использовать слабые потоковые шифры.
- Неверная настройка не выдает ошибку, а просто не работает, и проблему сложнее найти.
Shadowsocks в сравнении с другими протоколами
| Протокол | Выглядит как | UDP | Нужен сертификат |
|---|---|---|---|
| Shadowsocks | Случайные байты | Да | Нет |
| Trojan | HTTPS | Да, внутри TLS | Да, или REALITY |
| VLESS + REALITY | HTTPS к чужому сайту | Да | Нет |
| Hysteria 2 | HTTP/3 (QUIC) | Да | Обычно |
Более полную картину дает статья Сравнение протоколов прокси.
Shadowsocks на iPhone
Сама iOS не умеет работать с Shadowsocks, поэтому нужно приложение-клиент. Potatso — бесплатный прокси-клиент для iPhone и iPad: он импортирует ссылки ss://, QR-коды и подписки, поддерживает шифры 2022 и AEAD, а популярные плагины в нем встроены. Пошаговая инструкция: Как настроить Shadowsocks на iPhone.
Частые вопросы
- Shadowsocks — это VPN?
- Нет. Shadowsocks — это зашифрованный протокол прокси: он передает соединения ваших приложений через сервер по одному, а VPN туннелирует все сетевые пакеты. На iPhone приложение-клиент использует конфигурацию VPN, чтобы перехватить трафик, но на сервер оно отправляет именно Shadowsocks.
- Безопасен ли Shadowsocks?
- С шифром 2022 или AEAD трафик между устройством и сервером зашифрован и защищен от подмены. Но сервер все равно видит, к каким сайтам вы подключаетесь, поэтому пользуйтесь только сервером, которому доверяете, и избегайте старых потоковых шифров вроде rc4-md5.
- Какой шифр Shadowsocks лучше?
- Если сервер их поддерживает, используйте шифр 2022, например 2022-blake3-aes-128-gcm. Если нет — aes-256-gcm или chacha20-ietf-poly1305. В клиенте должен быть указан ровно тот шифр, который настроен на сервере.
- Поддерживает ли Shadowsocks UDP?
- Да. Shadowsocks передает и UDP, и TCP, поэтому через него работают голосовые звонки, игры и QUIC. Большинство плагинов передают только TCP, так что сервер с плагином обычно ретранслирует UDP в обход плагина или не ретранслирует вовсе.
- Можно ли обнаружить Shadowsocks?
- Его сложнее распознать, чем многие протоколы VPN, потому что у него нет заметного рукопожатия, но незаметным он не является. Трафик, который выглядит совершенно случайным, сам по себе может выделяться — поэтому и появились плагины и протоколы на основе TLS, такие как Trojan.