И вот тут шикарный подарок нам сделал братский народ Китая. C 2012 года они пилят бесплатный открытый проект Shadowsocks. Это пара из программ для сервера и клиента, работающих по следующему принципу: клиент изображает из себя сервер SOCKS5 прокси, получает входящие соединения, шифрует их, транслирует на сервер и там выпускает в интернет. То есть, принцип работы похож на SSH туннель, но имеет массу достоинств и пару недостатков по сравнению с ним.
Достоинства Shadowsocks
- Легкость настройки сервера: ниже я покажу, что стандартный конфиг — это всего 5 строчек, и не нужно возни с сертификатами. Ну правда, не банковскую сеть же делаем.
- Легкость настройки клиента. Клиенты есть под всё, не побоюсь громкого слова. Конфиг клиента — это те же 5 строчек.
- Клиенту для работы не нужны права админа. Мало того, его можно установить из pip. То есть любой программист сможет подключиться с работы.
- Легко настраивать доступ на уровне отдельных программ. В браузере, с помощью дополнений типа FoxyProxy/OmegaSwitchy так вообще — на уровне отдельных адресов по сложным правилам. При использовании VPN такого можно добиться только поднимая локальные прокси на каждом клиенте.
- В отличие от VPN, который на большинстве систем реализован через виртуальную сетевую карту, клиент Shadowsocks при обрыве связи никуда не девается. Так что ваш трафик не пойдёт сам по себе незащищённым путём. Кроме того, даже если упадёт само приложение Shadowsocks, программы не будут обращаться напрямую, если только не настроены это делать. При использовании VPN приходится реализовывать kill-switch, а они, особенно под Винду, ненадёжные и с побочными эффектами.
- По сравнению с SSH туннелем — большая пропускная способность, поддерживает тысячи клиентов с кучей соединений от каждого. SSH туннель под, например, торрентами, ощутимо грустит; кроме того, мелкие неровности сети заметно снижают его скорость. Shadowsocks-у пофиг.
- Гоняет меньше технической инфы по соединениям, что благоприятно для батарейки мобильных устройств.
- Есть экзотические версии серверов, написанные в виде библиотек для разных языков. То есть можно добавить сервер в свою программу для шифрования доступа своим клиентам.
- Графическая настройка клиентов. Можно сделать QR код, при сканировании которого клиенты мобильников и винды настраиваются сами. Один клиент под винду настроили, код сгенерировали, на 20 мобильников раскидали за минуту. Можно на сайт выложить, или на стенку повесить.
Недостатки Shadowsocks
- В отличие от OpenVPN, не проходил официального аудита. Так-то его просматривала куча народу, благо код открытый и маленький, но официально — нет.
- Не разделяет пользователей. Можно научить слушать на нескольких портах с разными паролями, но на одном порту — один пароль. Знание пароля не позволяет (в теории) слушать другого абонента того же порта.
- Не умеет пробрасывать порт в обратную сторону. То есть все как за NAT сидят. Придётся воспользоваться SSH туннелем, если можно.
- Клиент для Андроида держит аж два(!) неубираемых сообщения. Если их не скрыть, это очень мешает.
- Есть пара упёртых программ под Винду, которые не лезут в Shadowsocks, как их не настраивай. Увы, автор программы может написать открытие соединения так, чтобы игнорировать настройки прокси, и так иногда делают, когда проверяют лицензии на софт. Ниже напишу хитрый трюк, как эти программы распознать.
- Latency соединения выше, чем у OpenVPN. Не сильно, и гамать можно, но всё же.
- Не умеет сжимать трафик архиватором. В век HTTPS это не важно, а вот для, скажем, несжатых текстовых файлов и настоящих образов Убунты — разница есть.
- Документацию писали китайцы, на китайском английском, с кучей пропущенных пунктов и взаимных противоречий.
Настройка сервера Shadowsocks. Способ 1
Пишем конфиг. Вот пример полного рабочего конфига.
{
"server":"111.222.333.444",
"server_port":8390,
"local_port":1080,
"password":"buratino.ty.sam.sebe.vragg",
"timeout":60,
"method":"aes-256-cfb",
"fast_open": true
}
Это конфиг одновременно для сервера и клиента. Имеем поочереди адрес и порт сервера(можно хоть 80-й); порт, с которого клиент будет принимать подключения(лучше не трогать); пароль открытым текстом; и время в секундах, после которого сервер закрывает ненужный канал. А о последних двух поподробнее.
Shadowsocks имеет на выбор кучу методов шифрования, однако практически применимы всего два. chacha20-ietf-poly1305, алгоритм за авторством Daniel J. Bernstein, разрабатываемый Гуглом для внутренних нужд. Хорош для устройств, не умеющих аппаратный AES, а это совсем дешёвые мобильники и прочие умные утюги; и для параноиков, боящихся закладок в процессоре. Всем остальным использовать aes-256-cfb. Впрочем, оба шифра надёжные и проверенные временем.
Настройка fast_open уменьшает latency соединения, но требует ядро не ниже 3.7. И даже там работает не всегда, в частности, не работает, если виртуалка ваша сделана OpenVZ. На Scaleway-ских ARMах тоже не завелось. В общем, включайте, если работает.
Теперь, когда конфиг готов, устанавливаем пакет. Тут надо уточнить, что существуют две версии. Просто shadowsocks — референс, написанный на питоне, а shadowsock-libev это то же самое, но переписанное на чистом Си для скорости. Вот его и ставим. В самых новых линуксах он есть в основной репе, а для более старых — смотрите тут.
Ну и запускаем: ss-server -c config.conf. Всё должно работать. Не забудьте файрволл и автозапуск. Ликбез по администрированию линукса я тут писать не буду, поэтому если что-то не заработало, переходите к методу 2.
Способ 2
Устанавливаем docker и docker-compose.
apt install docker docker-compose
Дальше, в файле, который должен обязательно называться
docker-compose.yml
, пишем конфиг такой:version: '3'
services:
shadowsocks:
image: shadowsocks/shadowsocks-libev:latest
environment:
- TZ=Europe/Moscow
- PASSWORD=buratino.ty.sam.sebe.vragg
- METHOD=aes-256-cfb
- ARGS=--fast-open
ports:
- "8390:8390"
- "8390:8390/udp"
restart: unless-stopped
Обратите внимание на отступы, они важны. Если хочется, можно поднять сразу несколько серверов на разных портах, с разными паролями, для этого нужно просто продублировать весь блок shadowsocks: с разными именами. Когда конфиг готов, в той же папке запускаем
docker-compose up -d
и всё заведётся. Docker для вас даже сам, без спроса, дырочку в файрволле для каждого порта просверлит, зараза такая.
Конфигурация клиентов
Тут всё проще. Идём на сайт, качаем нужный клиент, настраиваем в интерфейсе. Для линуксоидов, естественно, есть консольный демон, кушающий конфиг из метода 1.
После настройки клиента у вас в системе на порту 1080 будет сидеть SOCKS5 прокси, по умолчанию недоступный извне. Но можно открыть, если вы в дружественной локалке. Важно понимать, что сами по себе программы туда не ломанутся. Нужно настроить системную проксю (если хотите, чтобы все программы шли через Socks) или каждую программу в отдельности, а лучше и то, и то — не повредит. На Windows 10 в панели управления есть пункт Network&Internet > Proxy. Там нужно вписать адрес прокси 127.0.0.1, порт как настроили (1080) и игнорировать для: локальной сети (обычно 192.168.0.1/24, хотя смотрите сами) и, для самого айпишника сервера. Если кто использует Linux Subsystem, то на неё эта конфигурация не распространяется, там надо объявлять переменную socks5_proxy. Полноценные линуксы обычно имеют в панели управления аналогичные настройки. Для браузеров рекомендую дополнения типа FoxyProxy (FF) и SwitchyOmega (Хром) для детальной настройки, к какому сайту ходить через прокси, а какому напрямую. В частности, прямой доступ надо настроить к ресурсам своего провайдера, и, возможно, к своему банку. Рекомендую так-же не удивлять Мосэнергосбыт счетами из-за границы — они там и так пугливые какие-то. Paypal, как ни странно, до лампочки. Не забудьте поставить галочку «DNS через proxy» или убедиться, что оно по умолчанию так.
Проверка работы
На этом этапе всё должно работать. Нужно сделать 2 теста. Сначала браузером, желательно примитивным «изкоробочным», а не основным, пройти на https://duckduckgo.com/ и вбить в поиск my ip. Адрес должен быть серверный. Затем, в настройках клиента, вписать неправильный пароль, и убедиться, что все программы перестали работать. Это проверка на то, что ни одна программа не лезет в обход прокси.
Дополнения
Расскажу о некоторых дополнениях к Shadowsocks, но не буду углубляться в их настройку. Спрашивайте, если что.
Polipo. Некоторые древние или уп[ёр/оро]тые программы не умеют SOCKS5, зато умеют HTTP_PROXY. В частности, официальный клиент Twitter для Андроид до сих пор не умеет использовать Shadowsocks если тот установлен не на мобильнике, а, скажем, на роутере. На этот случай можно установить http_proxy сервер Polipo, и в настройках его указать редирект на Shadowsocks. Все http proxy программы заброшены ввиду малой нужности, но Polipo пока работает без проблем.
Obfs-proxy. Позволяет завернуть трафик Shadowsocks в чистый, непримечательный SSL и так пустить на порт 443. Это если у кого уже белые списки протоколов.
KCPTUN. Протокол KCP — это надстройка над UDP для работы в совсем уж убогих сетях с большими потерями, типа сотового модема на грани приёма или тропосферной радиорелейной связи. Использование KCP позволит общаться чуть быстрее чистого UDP, а Shadowsocks — очень удобный способ завернуть свой трафик в KCP.
Fail2ban неплохо бы настроить ещё, чтобы отбивать попытки DDOSа на сервер. Но если вы не обижаете школьников, то кто вас будет DDOSить? Ставьте пароль подлиннее, благо его даже один раз в мобильники вбивать не придётся, и не парьтесь. Мой реальный пароль — 40 случайных символов.
Всё!
Комментарии (65)
Barafu_Albino_Cheetah Автор
08.05.2018 17:59Ремарка: чтобы в Win 10 Заработал Windows Store, надо и в настройках клиента Shadowsocks включить System Proxy, и в настройках Windows сделать, как я сказал. Почему так — не знаю.
Кстати, пока разбирался с этой проблемой, нашёл диалог на сайте техподдержки Микрософта: человек спрашивает, почему у него через прокси не работает Windows Store, а техподдержка на полном серьёзе ему отвечает, что прокси используют только плохие хакеры, поэтому все встреченные прокси надо удалять. Хорошо хоть не посоветовали вызвать полицию.
dw9694
08.05.2018 18:17Китайские хакеры стоят за многочисленными взломами международных компаний
habr.com/post/358110dartraiden
08.05.2018 23:28+1А при чём тут китайские хакеры? Shadowsocks пилят обычные программисты для себя, его главная цель — пробивать китайский государственный файерволл. Косвеноо об эффективности говорит тот факт, что несколько лет назад одного из разработчиков навестила полиция и заставила удалить код из репозитория (надо ли говорить, что Git позволяет быстро отмотать любое изменение назад, поэтому никакого эффекта это удаление не возымело).
Googolplex
08.05.2018 19:44chacha20-ietf-poly1305, разработка Гугла для внутренних нужд
Это вы что-то странное написали, chacha20 и poly1305 это известные открытые алгоритмы за авторством Daniel J. Bernstein (https://cr.yp.to/chacha.html, https://cr.yp.to/mac.html), референсные имплементации которых находятся в Public Domain.
Оба этих алгоритма, а также в каком-то смысле родственный им Curve25519/ed25519 (https://cr.yp.to/ecdh.html), проще, чем аналогичные им AES-GCM и RSA/ECDSA, у них меньше размер ключей при той же криптостойкости, и они сравнимы по скорости с аппаратными реализациями аналогов и быстрее софтверных. Собственно, поэтому они и появились в свежих версиях TLS и свежих имплементациях SSH. Кстати, на них же основана библиотека libsodium, которая дает ну очень простой и удобный API для шифрования, подписей и прочих операций.
Кстати, хорошей альтернативой для OpenVPN будет, имхо, Wireguard. Он гораздо проще в настройке чем OpenVPN и тем более другие виды VPN, он очень быстрый за счет того что по умолчанию идет как модуль ядра (хотя преполагается что будут и юзерспейсовые имплементации, особенно для не-Linux систем), основан на state-of-the-art криптографии (как раз вышеописанные chacha20, poly1305, ed25519), и очень активно развивается.
Barafu_Albino_Cheetah Автор
08.05.2018 20:10Алгоритмы Бернстейна находятся в Public Domain. А Гугл его активно и публично начал внедрять у себя, создавая софт, чем и продвинул в массы. Стал бы алгоритм применяться где-то ещё если бы не Гугл — неизвестно. Думаю, в недрах ГитХаба можно найти ещё много хороших, открытых и никому не нужных алгоритмов. Но в статье я уточню. AES быстрее, когда аппаратно ускоренный.
Wireguard — хорошая штука, но у него клиент только для линукса. К тому же, это снова VPN с виртуальной сетью. Настроить выборочное использование — большой бубен надо, однако.Andrusha
09.05.2018 04:25Уже не только.
Windows и macOS — это ещё не смотрел.
Android — этим пользуюсь, работает отлично. Но выборочного использования к сожалению нет. Работает без бубнов на стоковом нексусовом ядре.
Под iPhone вроде нет.
Milein
09.05.2018 03:03Wireguard офигенный.
Поставил себе на телефон кастомное ядро с его поддержкой и туннель не опускаю. Учитывая что соединение он не поддерживает и работает как модуль ядра, то влияние на батарею практически нулевое.
Но то что он доступен только для линукса конечно сильно ограничивает его применимость.
Googolplex
08.05.2018 19:45+1А, и еще — в Android Oreo ситуация с вечно висящими уведомлениями стала лучше — уведомления сервисного типа, как те которые генерирует Shadowsocks, теперь не так лезут на глаза.
konchok
09.05.2018 13:28Через Xposed и модуль NotifyClean можно убирать любые «нескрываемые» уведомления. Но нужен рут.
selivanov_pavel
08.05.2018 20:28+1Способ 3: https://selivan.github.io/socks/
curl https://selivan.github.io/shadowsocks.txt | sudo bash
если надо явно задать порт и/или пароль:
export PORT=8080; export PASSWORD=mypass
curl https://selivan.github.io/shadowsocks.txt | sudo --preserve-env bash
legolegs
10.05.2018 12:04curl https://<что угодно> | sudo bash
Сомнительная практика.selivanov_pavel
10.05.2018 12:12+2Кто разбирается — могут сначала прочитать скрипт, он простой. Кто не разбирается — всё равно, чтобы настроить самому, придётся копипастить из интернета какие-то непонятные команды — невелика разница.
Понятно, что не надо так настраивать продакшн на котором деньги лежат, но купленный чисто для vpn виртуалку или контейнер — вполне приемлимо.
set
10.05.2018 16:00Эх, только для Ubuntu. Для Centos нету… Нет ли в запасниках подобного под Centos 7?
selivanov_pavel
10.05.2018 18:32Лениво — под Ubuntu готовые пакетики уже есть, под CentOS руками собирать надо. Правда можно через докер его там запускать.
Хотя для обычного socks(danted) мне PullRequest с поддержкой CentOS прислали, может и для shadowsocks кто-нибудь осилит.
set
10.05.2018 18:37Почему же руками? Есть и пакеты в репозиториях. Я всё из них и ставил.
selivanov_pavel
10.05.2018 18:39Ну так это же прекрасно. Осталось дописать это в скрипт и прислать мне PullRequest :)
set
10.05.2018 19:57Да если бы я в этом нормально разбирался, то не сетовал бы на то, что нет готового скриптика :) К сожалению, я потратил довольно много времени на настройку у себя на сервере и получилось у меня скорее методом тыка. Т.е. я не то что скрипт не напишу, я даже для себя инструкцию не готов составить. Вся надежда на добрых людей среди админов/программистов…
shifttstas
08.05.2018 21:06Способ 4: скачать Outline от Google, который сам вам сервер арендует и сам все настроит, не надо совершенно в консоль лезть + клиенты под все платформы и управление черёд GUI.
selivanov_pavel
08.05.2018 22:16Да, хорошая штука, я смотрел. Но там автоматика только для DigitalOcean, а у него много подсетей РоскомПозор забанил(может уже разбанил, не слежу). Для остальных хостингов он говорит "заведите аккаунт сами, сделайте
wget -qO- ... | bash
и так далее :)
mtex
08.05.2018 22:53+1есть подводные камни, не зная которых можно получить такую ситуацию, что VPN стоит, а трафик идёт в обход.
А чтобы не было таких камней, рекомендуется посредством того же iptables дропать весь трафик, идущий не через tun интерфейс (за вычетом трафика самого vpn'a).
Что касается сабжа статьи, то штука однозначно полезная. Больше инструментов хороших и разных!mayorovp
09.05.2018 15:36Альтернативный способ — убрать основной шлюз, а до vpn-сервера прописать прямой маршрут.
Lordbl4
08.05.2018 23:17+1Поправьте конфиг, пропущена запятая после «method»:«aes-256-cfb»
иначе вылезает ошибка
Lordbl4
09.05.2018 00:07поднимал для телеги dante (5й носковый сервер) на копеечном vps — работает без проблем.
тестирую на том же копеечном vps нагрузку от shadowsocks — от одного юзера нагрузки нет.
как понимаю, для данной тулзы нужен ещё и отдельный софт на каждого клиента?Barafu_Albino_Cheetah Автор
09.05.2018 03:21Да, потому что штатный протокол SOCKS5 шифрования не предусматривает, только аутентификацию.
alexbers
09.05.2018 09:46У меня dante не завёлся, съел 3ГБ памяти на 1000 клиентов. Пришлось написать простой асинхронный сокс-сервер из одного файла на питоне: https://github.com/alexbers/tgsocksproxy. Он по умолчанию сконфигурирован для телеги, т.е. не пропускает трафик на другие сервера и поднимается в одну команду python3 tgsocksproxy.py. У меня работает без какого либо вмешательства уже три недели. Правда, сейчас телеграм и без проксей нормально работает
alexbers
09.05.2018 10:52+1Ещё нашёл очень крутой проект https://github.com/StreisandEffect/streisand, который автоматически устанавливает на сервер кучу vpn'ов, включая shadowsocks. Судя по количеству коммитов и форков, проект очень популярен
Barafu_Albino_Cheetah Автор
09.05.2018 14:21Только учтите, что он во-первых, резок на поворотах: недавно выкинули strongswan и у сообщества не спросили; во-вторых, глючит на OpenVZных виртуалках, и я даже не знаю, почему. У него нет интерфейса переконфигурации. То есть, если после установки решишь что-то поменять, то либо изучай, как всё устроено, либо форматируй сервак.
no1D
09.05.2018 03:05А сможет кто-нибудь дополнить как лучше настроить shadowsocks так, чтобы трафик шел частично — только для заблокированных подсетей хотя бы? В идеале конечно как настроить клиент прямо на роутере с openwrt
Barafu_Albino_Cheetah Автор
09.05.2018 03:08Ну вам частично распределять нужно трафик из браузера же? Ставьте туда расширение, которое я рекомендую в статье. С ним можно делать по-умолчанию выкл, а для нужных сайтов вкл. Там даже какой-то импорт списков имеется. Не знаю, не трогал.
Pongo
09.05.2018 03:51Насколько безопасно использовать в ss шифрование aes-128-cfb?
Barafu_Albino_Cheetah Автор
09.05.2018 04:46+1Вполне безопасно. AES 192 и 256 придумали для армейских бюрократов: они требовали шифр трёх разных уровней стойкости — получите. А что даже 128 достаточно для любых их целей — бюрократов не волнует.
Другое дело, что экспериментруя на своей VPS, я не заметил сколько-либо значимой разницы в потребляемых ресурсах для 128 и 256, потому что аппаратное ускорение.
koshi-dono
09.05.2018 06:28Пробовал поднимать у себя. Всё было хорошо на домашнем пк и через wifi, но через мобильную сеть было просто чудовищно медленно, страницы в браузере открывались с задержкой в десяток секунд. KCPTUN делал чуть получше, но не принципиально. Батарейка улетала на глазах. При этом стоящий рядом, на том же сервере, l2tp/ipsec работает нормально.
Yowkis
09.05.2018 14:211) не Obfs-proxy, а simple-obfs, оно может не только в невалидный ssl, но еще и в http
2) github.com/fconn/ss2ch/wiki
Tonatos
09.05.2018 15:13На волне, решил воспользоваться Outline от гугла, уже выше писали про него. Донельзя удобная штука, действительно вместе с оформление сервера, потратил 10 минут.
Но вот с производительностью какая-то беда. Ощутимо быстрее садится батарейка под osx в рабочем режиме, а если качать торрент, или в принципе активно нагрузить канал до 30-40мбит — пару ядер может быть полностью нагружено, на сервере нагрузка тоже рисуется приличная. Любопытно, то ли что-то не так с outline реализацией от гугла, его клиентом под osx, или все-таки в принципе с самим shadowsocks?Barafu_Albino_Cheetah Автор
09.05.2018 17:40Когда я смотрю с него 8k видео с Ютуба — потребление процессора на сервере достигает 8%. Это виртуалка с 1 ядром Intel® Xeon® CPU E5-2630 v3 @ 2.40GHz.
Попробуйте поменять алгоритм шифрования. Пощёлкайте настройку fast-open.
Ещё есть простой шифрrc4-md5
hostmaster
09.05.2018 20:43+1- Основное достоинство shadowsocks, это то что у него нет синатуры то есть его трудно вычленить и заблокировать. OpenVPN, Tor и SSH довольно не плохо блокируются Великим Китайским. Для OpenVPN есть патчи, но я отвлекаюсь.
- На самом дешевом дроплете DO за $5 в моих тестах Shadowsocks показывал 50Mbps против 20Mbps на OpenVPN
- Китайские товарищи написали удобный комбаин https://github.com/ginuerzh/gost он позволяет поднять http proxy, выстроить цепочку proxy и еще много много чего. Я заменил им полумертвый polipo
- Для IOS есть клиент Potatso Lite он работает и бесплатен
habrapinc
09.05.2018 20:48А существует ли в природе клиент shadowsocks которые может слушать одновременно несколько лоакльных портов и пробрасывать их соответственно на разные сервера? Win64, если садится в трей — вообще было бы идеально.
Barafu_Albino_Cheetah Автор
09.05.2018 20:51+1Нет. Но я только что попробовал сделать копию клиента под Винду и запустить одновременно два — всё работает. Так что можете добиться желаемого, запуская несколько клиентов одновременно.
Pongo
09.05.2018 23:43У меня на винде (shadowsocks-win) иногда бывают ситуации, когда он выдает ошибки, которые пропадают после обновления страницы («500 Internal Privoxy Error»). Таймаут в клиенте стоит 20 сек, на сервере 60. Можно ли что-то сделать с этим?
untilx
10.05.2018 09:27Сначала браузером, желательно примитивным «изкоробочным», а не основным, пройти на duckduckgo.com и вбить в поиск my ip.
Не благодарите
Marwin
1) велосипед же, не?
я, например, сто лет как пользуюсь аналогичной замечательной прогой 3proxy… те же 5 строк конфига, но еще и юзеров поддерживает, проброс портов и много чего еще.
2) в айфончиках дёргать нативную качельку VPN лично я считаю удобнее. Поэтому на своём европейском сервере развернул как socks5, так и strongswan (для разворачивания которого, кстати, так же есть готовые скрипты из области yes->yes->done).
mspain
Родной vpn андроида разве умеет nat-passthrough?
Marwin
к сожалению, не имею ни у себя, ни в ближайшем окружении ни одного андроида уже много лет, потому не интересовался вопросом...
Barafu_Albino_Cheetah Автор
Сравнив с 3proxy, вы упустили идею. Shadowsocks шифрует весь трафик между абонентом и сервером, а 3proxy, судя по документации, только пароль. А ещё он относительно новый, много админского софта не умеет ещё его распознавать.
chainyk445
но погодите,shadowsocks вроде не шифрует трафик как vpn, или я ошибаюсь?
Barafu_Albino_Cheetah Автор
Ошибаетесь. Трафик между клиентом и сервером полностью шифруется AESом. И отнюдь не по паролю для аутентификации, а как надо. Это трафик между приложением и клиентом не шифруется, но они либо на одной машине стоят, либо в доверенной локалке.
chainyk445
можете еще создать статью про отличия vpn и shadowsocks а то я нигде не нарыл, и еще вопрос от себя, смысл делать openvpn over shadowsocks если shadowsocks вроде бы как со своей задачей справляется?
Barafu_Albino_Cheetah Автор
Для статьи про отличия нажмите кнопку Home на клавиатуре. OpenVPN через Shadowsocks прокладывают для передачи того, что в Proxy не лезет, и для проброса портов.