Установка ss-сервера в standalone режиме и кастомизация обфускаторов

Пошаговый гайд

Michael Peterson
10 min readJun 2, 2019

ВНИМАНИЕ: Гребаный медиум с уродским форматированием не позволяет копипастить с сохранением строк многострочные тексты. Вставляйте построчно.

EDIT от 13.03.2022

Довольно долгое время назад из большинства клиентов шэдоусокс убрали метод шифрования xchacha — так что используйте chacha20-ietf-poly1305 или aes-128-gcm (чача быстрее на устройствах, не имеющих хардварной поддержки AES — мобилах\роутерах\тв-приставках)

EDIT от 18.02.2021
Анон привлек моё внимание к тому факту, что телеграм при работе через голый шэдоусокс без обфускаторов с андроидофонов не может отправить картинки. Проблема где-то в серверной части shadowsocks-libev или телеге, но так-как libev авторами уже поддерживается просто ради проформы, а телегу я не люблю и считаю соцсетью для нетакихкакфсе зумеров, а вся работа разрабов шэдоусокс переведена на shadowsocks-rust, искать причины смысла нет, к тому же есть более быстрый и более простой шэдоусокс-го2, который работает. Вместо шага #0 рекоммендуется ставить сервер сс-го2 по гайду: https://f-gzhechko.medium.com/shadowsocks-go-how-to-step-by-step-guide-beda4352b52f

ДИСКЛЕЙМЕР: В этом гайде, все что написано на сером фонеможно и нужно копипастить в терминал. Все команды исполняются от пользователя root — если ты подключаешься к серверу не пользователем root, переключиться на него можно командой su -. Eсли ты ровный пацан и не хочешь работать от рута — перед каждой командой надо добавлять sudo.
Этот гайд рассчитан на ОС ubuntu 16.10 и выше и kvm\xen\vmware виртуализацию или как минимум на openVZ последних версий, такое встречается крайне редко, потому если у тебя контейнер openVZ поздравляю, ты соснул и скорее всего переплатил.

TL;DR версия для тех, кто соснул

1 в качестве шифра (“method”) вместо xchacha20-ietf-poly1305 используй chacha20-ietf-poly1305

2 можешь собрать шэдоусокс-либев сам из исходников, по мануалу
тогда у тебя будет возможность использовать xchacha

#0 УСТАНОВКА ШЭДОУСОКС-ЛИБЕВ В СТЕНДЭЛОН РЕЖИМЕ

Итак, дружок-пирожок, пришло время помимо простого симпл-обфс установить в2рей в разных режимах работы и клоак.

1 Начнем с простого — обновим систему
apt update && apt upgrade -y

2 Ставим СС и симпл-обфс
apt install shadowsocks-libev simple-obfs -y

3 Меняем настройки шэдоусокса, чтобы он висел на локалхосте, для этого жмем nano /etc/shadowsocks-libev/config.json и вставляем

{
"server":"0.0.0.0",
"mode":"tcp_and_udp",
"server_port":1234,
"password":"
ПАРОЛЬ",
"nameserver":"8.8.8.8",
"reuse_port":true,
"timeout":120,
"method":"chacha20-ietf-poly1305"
}

“nameserver” можешь поменять на любой угодный тебе днс-резолвер, например 1.1.1.1 или другие.
Вуаля — у нас рабочий голый сс-либев сервер без обфускаций, который висит на всех сетевых тырфейсах на порту 1234, вот прямо сходу без задней мысли можно его использовать. Только учти, что некоторые провайдеры троттлят скорости голого СС, потому что не могут распознать тип трафика и анально его режут на всякий случай.
Зато в этом режиме у тебя будет работать UDP и ты сможешь звонить по ватсапу и прочему говну, со включенным СС.
Уточнение: звонки по васапу и прочее UDP работает и с обфускаторами, за редкими исключениями.

4 Перезапускаем сервис шэдоусокс с нашими параметрами, в автозапуск через системД он добавляется автоматически, при установке через апт
systemctl restart shadowsocks-libev

#1 УСТАНОВКА СИМПЛ-ОБФС

симпл-обфс простой обфускатор, который хотя и находится в статусе “depreciated” (во многом потому что в2рей-плагин лучше) но все еще работает

1 ставим сам симпл-обфс если еще не поставил (хотя должен был, хватит сношаться в глазницы)
apt install simple-obfs -y

2 делаем системД юнит, в котором будет работать симпл-обфс
nano /etc/systemd/system/ss-obfs.service

[Unit]
Description=simple-obfuscation standalone server service
Documentation=man:shadowsocks-libev(8)
After=network.target
[Service]
Type=simple
User=nobody
Group=nogroup
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
LimitNOFILE=51200
ExecStart=/usr/bin/obfs-server -s
IP-сервера -p 80 --obfs http -r 127.0.0.1:1234 --failover www.google.com
[Install]
WantedBy=multi-user.target

в опцию “failover” вместо гугла можно написать что угодно — в эту сторону симпл-обфс будет перенаправлять трафик пришедший на 80ый порт от не-симпл-обфс клиентов, как-то активный пробинг провайдерами, фаерволами, майорами, etc. Желательно чтобы фейловер совпадал с опцией obfs-host клиента

3 сохраняем-выходим, рестартуем и включаем сервис
systemctl restart ss-obfs && systemctl enable ss-obfs

настраиваем клиента

1: качаем клиента —
винда: https://github.com/shadowsocks/shadowsocks-windows/releases
никсы: повторяешь установку как на сервере
качаешь скомпиленый под шинду обфс-локал отсюда качая архив obfs-local.zip
распаковываешь obfs-local.zip в рабочую папку шэдоусокса, чтобы файлы libwinpthread-1.dll и obfs-local.exe были в одной папке с shadowsocks.exe

2.1: винда: запускаешь свежепоставленный клиент shadowsocks-windows, жмакаешь по самолетику в трее правой кнопкой, ставишь галочку start on boot далее добавляешь настройки в servers — edit servers

server addr — ip сервера
server port — 80
password —ПАРОЛЬ
encryption — chacha20-ietf-poly1305
Plugin Program — obfs-local

Plugin Options — obfs=http;obfs-host=www.google.com
remarks — че хочешь, название сервера которое будет отображаться в клиенте
proxy port — адрес порта на который ты будешь перенаправлять свой браузер и прочее, по дефолту 1080, можешь оставить его

в строку ‘obfs-host=’ можно подставить любое значение, например google.com или kremlin.ru или vk.com — simple-obfs будет подставлять это значение в хедеры пакета, чтобы простые системы DPI думали, что твой трафик идет в сторону гугла, сайта кремля или вконтакта соответственно

2.2 никсы: nano /etc/shadowsocks-libev/config.json и добавляешь

{"server":"ip_сервера",
"server_port":80,
"local_port":1080,
"password":"вставляешь_пароль_скопированный_c_сервера",
"timeout":600,
"method":"chacha20-ietf-poly1305",
"plugin":"obfs-local",
"plugin_opts":"obfs=http;obfs-host=www.google.com",
"reuse_port": true,

"mode": "tcp_and_udp"}

жмакаешь в соснолечке
ss-local -c /etc/shadowsocks-libev/config.json &
добавление символа & в команду заставляет процесс выполняться даже после закрытия через ctrl-c — так что он будет висеть в фоне пока ты его не убьешь или не перезагрузишься

2.2.1 в никсы как вариант добавляешь сервис, чтоб соединение было всегда и после ребута:
nano /etc/systemd/system/ss-local.service
вставляем это:

[Unit]
Description=Daemon to start Shadowsocks Client
Wants=network-online.target
After=network.target
[Service]

Type=simple
ExecStart=/usr/bin/ss-local -c /etc/shadowsocks-libev/config.json
[Install]

WantedBy=multi-user.target

и сохраняем-выходим-жмем
systemctl daemon-reload && systemctl enable ss-local.service && systemctl restart ss-local.service

2.3 Android: качаешь с Google Play или .apk а так же simple-obfs
Все почти так же, как и на винде. В меню Apps VPN mode выбираешь нужные приложения, трафик которых будет заворачиваться через SS, или отключаешь этот режим чтобы весь трафик шел через SS.
На андроеде нужно отключить перенаправление всего ДНС-трафика (оно и отключено по дефолту) а так же самому установить днс-резолвер, опция “nameserver” прописанная на сервере для андроеда работать не будет. По дефолту там ДНС от гугла — можешь сделать финт ушами, и поставить какой-нибудь ДНС с блокировкой рекламы от adguard например, чтобы эффективно резать рекламу во всех приложениях.

2.4 iOS: покупаешь shadowrocket\kitsunebi или ищешь какой-то бешплатный аналог

#2 УСТАНОВКА В2РЕЙ-ПЛАГИН

V2RAY-PLUGIN это адаптация кода v2ray-core с 3 режимами обфускации (хттп-вебсокет, тлс-вебсокет, quic) перепиленная для простой работы в качестве плагина совместно с СС, от автора сс-либев и симпл-обфс. TLS-обфускация по сути оборачивает трафик в легитимный реальный тлс-трафик так, что разворачивать\заворачивать его со стороны сервера может например nginx если указать ему пути к сертификатам. Подробно об этом читай в гайде по настройке nginx-сервера перед СС-v2ray для работы с cloudflare.

Ставим сервер v2ray-plugin

#0 качаем плагин

0 apt update && apt upgrade -y
обновляем систему
1 пиздуем сюда — копируем адрес последнего релиза под нашу архитектуру
2 wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.1.0/v2ray-plugin-linux-amd64-v1.1.0.tar.gz
тут вместо “v1.1.0/v2ray-plugin-linux-amd64-v1.1.0.tar.gz” может быть что-то другое — нужно вставить то, что скопировали в шаге №1
3 tar -xf v2ray-plugin-linux-amd64-v1.1.0.tar.gz
разархивируем сам плагин, тут опять же может быть другой файл, в зависимости от скачиваемой версии
4 mv v2ray-plugin_linux_amd64 /etc/shadowsocks-libev/v2ray-plugin
переносим и переименовываем плагин
5 setcap "cap_net_bind_service=+eip" /etc/shadowsocks-libev/v2ray-plugin && chmod +x /etc/shadowsocks-libev/v2ray-plugin
даем возможность v2ray-плагину биндиться к привилегированным портам и позволяем ему исполняться

#1 включаем в2рей в хттп режиме на 80 порту
Если собрался ставить на 80ом порту в2рей, то сначала отключи симпл-обфс systemctl stop ss-obfs && systemctl disable ss-obfs
Можешь поставить в2рей на 8080 порт

1 nano /etc/systemd/system/ss-v2ray-80.service
вставляем следующее:

[Unit]
Description=v2ray standalone server service
Documentation=man:shadowsocks-libev(8)
After=network.target
[Service]
Type=simple
User=nobody
Group=nogroup
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
LimitNOFILE=51200
ExecStart=/etc/shadowsocks-libev/v2ray-plugin -server -host
www.google.com -localAddr IP-сервера -localPort 80 -remoteAddr 127.0.0.1 -remotePort 1234 -loglevel none
[Install]
WantedBy=multi-user.target

сохраняем-выходим (ctrl+x, y)
-localPort 80 можешь поменять на 8080 или любой другой незанятый, если на 80ом будет симпл-обфс, хост тоже можно поменять на что-то другое (host должен совпадать на клиенте и сервере)

2 systemctl enable ss-v2ray-80 && systemctl restart ss-v2ray-80 включаем и стартуем сервис

#2 включаем в2рей в tls режиме на 443 порту
Для работы в tls режиме в2рей нужен сертификат — с одной стороны можно сгенерить его самому, но зачем, когда есть let’s encrypt?
Для начала зарегай домен на фриноме и запили себе аккаунт клаудфлер по гайду.

0 Вместо унылого сертбота будем юзать няшный acme.sh
curl https://get.acme.sh | sh

1 .acme.sh/acme.sh --issue -d твойдомен.tk --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
после этого переносим значения полей Domain и Txt value в днс-записи:

берем значения Domain и TXT value
выбираем тип записи TXT, вставляем префикс
в открывшееся окно вставляем запись TXT value выданную acme

2 acme.sh --renew -d твойдомен.tk --yes-I-know-dns-manual-mode-enough-go-ahead-please
acme.sh делает запрос через сертбота и складывает полученные сертификаты в /root/.acme.sh/твойдомен.тк/* — по дефолту в2рей будет искать серты тут

3 переносим серт и ключ в папку сс, чтобы плагин имел к ним доступ
cp /root/.acme.sh/твойдомен.tk/fullchain.cer /etc/shadowsocks-libev/ && cp /root/.acme.sh/твойдомен.tk/твойдомен.tk.key /etc/shadowsocks-libev/
тут вместо /root/ может быть другая локация, в зависимости от того, от какого юзера ты качал acme.sh

3 создаем юнит системД
nano /etc/systemd/system/ss-v2ray-443.service

[Unit]
Description=v2ray standalone server service
Documentation=man:shadowsocks-libev(8)
After=network.target
[Service]
Type=simple
User=nobody
Group=nogroup
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
LimitNOFILE=51200
ExecStart=/etc/shadowsocks-libev/v2ray-plugin -server -tls -host
твойдомен.tk -localAddr твой IP -localPort 443 -remoteAddr 127.0.0.1 -remotePort 1234 -loglevel none -cert "/etc/shadowsocks-libev/fullchain.cer" -key "/etc/shadowsocks-libev/твойдомен.tk.key"
[Install]
WantedBy=multi-user.target

сохраняем-выходим (ctrl+x, y)

4 systemctl enable ss-v2ray-443 && systemctl restart ss-v2ray-443 включаем и стартуем сервис

Ставим клиент

1 качаем отсюда версию под архитектуру клиента — шинда\шинукс\макОСЬ; для андроеда используем shadowsocks из плеймаркета и v2ray-plugin оттуда же или используем kitsunebi; для iOS используем shadowrocket
2 для винды — разархивируем в папку с клиентом шэдоусокс и переименовываем в v2ray.exe
3 в конфиге клиента ставим

server addr — ipv4 сервера
server port — порт
password — пассворд
plugin program — v2ray
plugin options — для http режима -host=www.google.com (сюда можешь поставить что угодно, в2рей будет делать вид что трафик идет в сторону указаного хоста)
plugin options — для работы в tls режиме tls;host=твойдомен.tk

proxy port — локальный порт куда будем направлять браузер и прочее (например 12345, можно оставить дефолтный 1080)

сохраняем

2.4 в браузере\софте ставим тип прокси socks5 — адрес 127.0.0.1 порт 12345 или 127.0.0.1:12345 (ставь то, что в proxy port из предыдущего пункта)
2.5 проверяем айпи через DuckDuckGo — https://duckduckgo.com/?q=my+ip

#3 УСТАНОВКА CLOAK

Ставим сервер

ВНИМАНИЕ: все, что сказано ниже про обфускацию в клоак, относится к первой версии (версии бинарников 1хх) — в клоак2 была полностью перепилена система работы, теперь он просто маскирует трафик под полулегитимный TLS без наличия реальных сертификатов.

Cloak это еще один обфускатор, маскирующий трафик под легитимный TLS от разработчика go-quiet, но с подвохом. Подвох в том, что вместо полноценного TLS трафика с ключами, клок использует функцию tls 1.2 восстановления предыдущей сессии — это позволяет нам сделать вид, будто tls-трафик идет в рамках ранее установленной tls сессии с сервером по нашему выбору (т.е. если условно прописать kremlin.ru на клиенте и сервере — DPI система будет думать что мы общаемся именно с сайтом кремля, а не читаем запрещенную литературу, хотя конечно могут быть исключения)

1 Качаем сервер клоак, дла этого идем на страницу релизов на github и выбираем ck-server-linux и версию своей архитектуры сервера (скорее всего это amd64), копируем ссылку жмем
wget https://github.com/cbeuw/Cloak/releases/download/v1.1.1/ck-server-linux-amd64-1.1.1 && mv ck-server-linux-amd64-1.1.1 /etc/shadowsocks-libev/ck-server
если на момент установки у тебя другая версия сервера, нужно соответственно изменить ссылку

2 правим разрешения для бинарника сервера, чтобы он запускался и работал на привилегированном порту
chmod +x /etc/shadowsocks-libev/ck-server && setcap "cap_net_bind_service=+eip" /etc/shadowsocks-libev/ck-server

3 генерируем UID и ключи
/etc/shadowsocks-libev/ck-server -u > /etc/shadowsocks-libev/ck-server.info && /etc/shadowsocks-libev/ck-server -k >> /etc/shadowsocks-libev/ck-server.info
в результате в директории /etc/shadowsocks-libev у нас появляется новый файл ck-server.info в котором 2 строки, первая (короткая) это UID вторая, состоящая из 2 частей разделенных запятой, это пара ключей

запятая в паре ключей нинужон!

4 создаем и редактируем конфиг для плагина
nano /etc/shadowsocks-libev/ckserver.json
вставляем туда следующее

{
"WebServerAdd":"172.217.16.164:443",
"AdminUID":"сюда_вставляешь_UID",
"PrivateKey":"сюда_вставляешь_PrivateKey",
"DatabasePath":"/etc/shadowsocks-libev/userinfo.db",
"BackupDirPath":"/etc/shadowsocks-libev/"
}

в WebServerAddr нужно указать ip-адрес (цифрами и портом) ресурса, под который мы маскируемся, в примере выше www.google.com, ты можешь использовать любой, для этого выбираешь желаемый адрес, например www.vk.com и проверяешь куда идет этот домен любым резолвером (например на 2ip.ru или набрав на сервере nslookup www.vk.com)

5 создаем юнит системД который будет управлять сервисом cloak
nano /etc/systemd/system/ss-cloak.service

[Unit]
Description=Cloak obfuscation standalone server service
Documentation=man:shadowsocks-libev(8)
After=network.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
LimitNOFILE=51200
ExecStart=/etc/shadowsocks-libev/ck-server -c "/etc/shadowsocks-libev/ckserver.json" -s
ip_сервера -p 443 -r 127.0.0.1:1234
[Install]
WantedBy=multi-user.target

6 включаем & запускаем сервис
systemctl enable ss-cloak.service && systemctl restart ss-cloak.service

NB: если ты уже поставил на 443 порт v2ray-server, или ставь клоак на другой порт (погугли какие порты\приложения используют TLS например тут) или переноси в2рей на другой порт, из тех что поддерживает cloudflare (если тебе надо ходить через CF) или на любой свободный

Ставим клиент

1 качаем бинарник под свою систему отсюда — выбираем файл начинающийся с ck-client

2 (для винды) кладем его в папку с экзешником shadowsocks, и переименовываем из сложной фигни типа “ck-client-windows-amd64–1.1.1.exe” в ck.exe

3 в папке с shadowsocks создаем текстовый файл, называет его ckclient.json, открываем блокнотом, вордпадом или любимым текстовым редактором, и вставляем туда

{
"UID":"сюда_вставляешь_UID",
"PublicKey":"сюда_вставляешь_PublicKey",
"ServerName":"www.google.com",
"TicketTimeHint":3600,
"NumConn":4,
"MaskBrowser":"chrome"
}

4 в клиенте шэдоусокс-шиндовс ставишь

Plugin Program : ck
Plugin Options : c:\путь\до\
ckclient.json

5 проверяешь айпи — https://duckduckgo.com/?q=my+ip

6 если что-то не работает, проверь статус сервера
systemctl status ss-cloak
если там сообщение типа “ck-server.go:74: +1 non SS TLS traffic from твой_IP:port” — ты напутал с ключами, проверь еще раз — на сервере PrivateKey (вывод ck-server -k после запятой), на клиенте PublicKey (вывод ck-server -k до запятой) — по идее их можно поменять местами, но они должны быть разные на клиенте и сервере.

Для андроеда

качай .apk клиента с гитхаба автора и ставь руками

Для никсов

инструкцию смотри на гитхабе автора — там все почти так же как в шинде и установке сервера, только бинарник другой, если что-то не выходит, сверься с конфигом клиента тут

Для iOS

В shadowrocket добавили работу с обфускатором клоак, но только для версии клоак-2

--

--