Быстрый, безопастный и бесплатный(*) shadowsocks+v2ray-сервер с обфускацией трафика через TLS

English version is here.

Преамбула.

В свете нынешних событий в России, тема блокировок интернета стала актуальной, как никогда. На сегодняшний день самым популярным способом обхода блокировок являются VPN-сервисы. Однако они имеют довольно значительные недостатки, которые полностью или частично решаются поднятием своего собственного shadowsocks-сервера. В этом гайде я опишу, как это сделать.

Сразу возникает резонный воппрос – а зачем так заморачиваться, когда есть VPN? Итак, для начала перечислю плюсы и минусы VPN перед shadowsocks-сервером:

+ От пользователя не требуется никаких технических знаний и траты времени на настройку – поставил ВПН и забыл. Настройка же SS-сервера, тем более с обфускацией трафика, требует некоторых умений и знаний, которых нет у большинства пользователей.

– ВПН серверы работают медленно, даже платные. Про бесплатные вообще говорить не приходится – это просто дно, которым невозможно пользоваться на постоянной основе. Причины медленной скорости кроются в том, что российские провайдеры анализируют трафик и умышленно режут скорость подозрительного зашифрованного трафика. Всё это решается обфускацией трафика с помощью обычного TLS-шифрования, который для провайдера выглядит как легитимный.

– VPN небезопасен для пользователя. При желании товарища майора, вас очень быстро найдут: либо вас сольёт сам ВПН-провайдер, либо вас вычислят с помощью т.н. атаки сравнений – это когда товарищ майор, имея пакет яровой и данные о трафике, а так же данные с серверов (что актуально для всего рунета) для того, чтобы найти злобного оппозиционера, который пишет плохие вещи про власть через впн, сравнивает, с какого айпи пользователь это писал и кто в этот момент времени подключался к айпи-адресу, с которого это писали, и вычисляет мамкиного копротивленца.  SS+v2ray+tls в этом плане гораздо безопаснее для пользователя, живущего в таких тоталитарных странах, как Россия и Китай, к примеру. Поэтому вполне естественно, что протокол shadowsocks и v2ray были созданы в КНР.

– (*) Помимо скорости и безопасности, обход блокировок с помощью SS+v2ray может быть абсолютно бесплатным! Для этого нужно найти какой-нибудь условно-бесплатный виртуальный сервер (например Oracle Cloud) и бесплатный домен (например, .tk, который предоставляет freenom). О том, как получить бесплатную VPS-ку, можно почитать эту статью на Хабре, но есть одно но – свете последних событий Oracle не предоставляет услуги россиянам, поэтому просто так там зарегистрироваться не получится – только если у вас нет иностранной симки и иностранной банковской карты, с которой единоразово снимается 1 доллар в качестве проверки.

– VPN провайдеры ограничивают трафик/количество устройств и как правило используют стоковый OpenVPN или немного модифицированный.

Краткий план действий.

  1. Приобретаем VPS-ку.
  2. Приобретаем домен.
  3. Регистрируемся в Cloudflare и привязываем туда домен.
  4. Разворачиваем на нашей VPS-ке shadowsocks
  5. Получаем бесплатный SSL-сертификат и настраиваем обфускацию трафика
  6. Настраиваем клиент под windows/android/ios/linux
  7. ?????
  8. PROFIT!

1. Приобретаем VPS-ку.  Подойдёт любая самая дешевая, главное, чтобы там был выделенный статический айпи-адрес. В качестве условно бесплатных подойдут Oracle Cloud и Microsoft Azure (там вроде как ограничение трафика на 15 Гб в месяц). Ничего сложного в создании виртуального сервера нет, главное – открыть в панели управления входящие порты: 80, 443 и 22 для ssh (по идее он у всех открыт). Если на оракле и azure зарегистрироваться не получится из-за санкций, то можете выбрать что-нибудь из этого списка. В этой статье я буду пользоваться дистрибутивом debian 10, поэтому выбирайте debian или ubuntu для вашей виртуалки.

2. Приобретаем домен. Чтобы получить его бесплатно, регаем .tk здесь – https://www.freenom.com/ru/index.html

3. Регистрируемся в Cloudflare и привязываем туда созданный домен. В качестве примера возьмем домен bernd32.xyz  Для этого в клаудефлэре указываем айпи-адрес нашего сервера СС, одна просто bernd32.xyz  вторая www.bernd32.xyz  жмем дальше.

После этого клаудфлэр определит там name-серверы, которые нужно будет вбить в панели управления регистратора, у которого вы приобрели домен. У reg.ru это выглядит так:

Если регаете домен .tk, то на freenom выглядит так:

Ждём несколько часов, пока DNS-записи обновятся. А пока зайдём в Firewall клаудфлэра и изменим security level на essentially off:

4. Разворачиваем на нашей VPS-ке shadowsocks

Для начала нам нужно открыть входящие порты на фаерволе нашей ВПСки. Если вы неопытный пользователь и первый раз работаете с портами, то рекомендую перед этим сделать снапшот вашего виртуального сервера – если что-то пойдет не так (к примеру, вы не сможете подключиться к ВПСке через ssh), можно будет всё легко восстановить.  Обратите внимание, что на некоторых (например, на Oracle Cloud и Microsoft Azure) VPS-провайдерах порты нужно открыть не только на самом сервере, но и в панели управления вашего сервера. К примеру, у Ораклов это делается в security list: https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/securitylists.htm

Впрочем, на большинстве провайдеров достаточно открыть порты лишь на самом сервере.

Все команды выполняются под рутом.

И да, не стоит бездумно копипастить команды – тщательно думаете что вводите в терминал, читайте что написано перед командами.

Подключаемся к нашему серверу по ssh:

ssh root@<ip впски>

Добавим порты для http и https. Проще всего сделать это через ufw. Если ufw не установлен, то устанавливаем:

apt install ufw

Открываем порты:

ufw allow 443/tcp
ufw allow 443/udp
ufw allow 80/tcp
ufw allow 80/udp
ufw allow ssh
ufw enable

4.1 Устанавливаем nginx:

apt update && sudo apt upgrade
apt install nginx

Удаляем дефолтный конфиг:

rm /etc/nginx/sites-available/default && sudo rm /etc/nginx/sites-enabled/default

Если пишет rm: cannot remove ‘/etc/nginx/sites-available/default’: No such file or directory, то создаем их:

mkdir /etc/nginx/sites-available

mkdir /etc/nginx/sites-enabled

Перекидываем файлы для нашего сайта. Для начала создаем root-директорию, в которой будут находиться файлы нашего сайта:

sudo mkdir /var/www/<домен>

Создаем там файл index.html:

vim /var/www/<домен>/index.html

…и записываем туда что угодно, например:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1> Ололо! Всё работает</h1>
</body>
</html>

Открываем конфиг (/etc/nginx/nginx.conf) и модуле http прописываем директорию конфига, с которым мы будем работать:

include /etc/nginx/sites-enabled/*;

Создаем конфиг для нашего сайта:

vim /etc/nginx/sites-available/<домен>

Вставляем (и не забываем вставить свой домен вместо <домен>):

server {
    listen 80;
    #listen [::]:80;
    server_name <домен>;
    root /var/www/<домен>;
    index index.html;
 
    location /anime {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass http://localhost:8008;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
}

Включаем сайт:

ln -s /etc/nginx/sites-available/<домен> /etc/nginx/sites-enabled/

Рестартим энжиникс:

sudo systemctl restart nginx

Вбиваем  в адресную строку браузера наш сайт и проверяем, что всё работает:

Если всё прошло успешно, то приступаем к следующей части — установки и настройки shadowsocks. Рекомендую сделать снапшот вашей ВПСки, чтобы в случае, если что-то пойдёт не так, откатиться назад. Если что-то пошло не так и сайт не открывается, то, возможно, вы зафакапили настройки фаервола, либо iptables конфликтует с ufw. Можно попробовать вернуть дефолтные политики iptables (если всё работает, то ничего из этого вводить не нужно):
iptables --policy INPUT ACCEPT;
iptables --policy OUTPUT ACCEPT;
iptables --policy FORWARD ACCEPT;
iptables -Z;
iptables -F;
iptables -X;

4.2 Устанавливаем shadowsocks:

Создаем папку под бинарники сс:

mkdir /etc/ss-go

Качаем бинарник сс с гитхаба:

wget https://github.com/shadowsocks/go-shadowsocks2/releases/download/v0.1.5/shadowsocks2-linux.gz
Распакуем архив сс-го:
gzip -d shadowsocks2-linux.gz
Переносим и переименуем бинарник:
mv shadowsocks2-linux /etc/ss-go/ss-go
Делаем бинарник исполняемым:

chmod +x /etc/ss-go/ss-go
Повышаем права сс и позволяем ему занимать привилегированные порты:
setcap "cap_net_bind_service=+eip" /etc/ss-go/ss-go

4.3  Устанавливаем v2ray плагин 

– скачиваем плагин (тут вместо “v1.3.1/v2ray-plugin-linux-amd64-v1.3.1.tar.gz” может быть что-то другое, последняя версия лежит тут https://github.com/shadowsocks/v2ray-plugin/releases/latest)

wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.3.1/v2ray-plugin-linux-amd64-v1.3.1.tar.gz

Разархивируем сам плагин, тут опять же может быть другой файл в зависимости от скачиваемой версии:

tar -xf v2ray-plugin-linux-amd64-v1.3.1.tar.gz

Переносим и переименуем плагин:

mv v2ray-plugin_linux_amd64 /etc/ss-go/v2ray-plugin

Даем возможность v2ray-плагину занимать привилегированные порты:

setcap "cap_net_bind_service=+eip" /etc/ss-go/v2ray-plugin
Открываем файл /etc/systemd/system/ss-v2ray.service и ставляем следующее (вместо <пароль> нужно придумать пароль):
 
[Unit]
Description=Go-shadowsocks2 with V2RAY-websocket obfuscation
After=network.target
 
[Service]
Type=simple
User=nobody
Group=nogroup
LimitNOFILE=51200
ExecStart=/etc/ss-go/ss-go -s localhost:8008 -password <пароль> -cipher AEAD_CHACHA20_POLY1305 -plugin /etc/ss-go/v2ray-plugin -plugin-opts "server;loglevel=none;path=/anime"
 
[Install]
WantedBy=multi-user.target
Включаем сервис:
systemctl enable ss-v2ray.service

5. Настройка клиента.

5.1 Windows

Качаем последнюю версию клиента shadowsocks с гитхаба – https://github.com/shadowsocks/shadowsocks-windows/releases и устанавливаем.

Качаем последнюю версию плагина v2ray: https://github.com/shadowsocks/v2ray-plugin/releases

Файлик v2ray-plugin_windows_amd64.exe кидаем в одну с папку с исполняемым файлом ss-клиента Shadowsocks.exe

Далее в конфиге клиента прописываем:

server addr - <домен>
server port - 443
password - <пароль>
encryption - chacha20-ietf-poly1305
plugin program - v2ray-plugin_windows_amd64.exe
plugin options - tls;host=<домен>;path=/anime
proxy port - локальный порт куда будем направлять браузер (по дефолту 1080, можно не трогать)

Выглядит это примерно так:

 

 

5.2 Linux

Качаем shadowsocks-rust (https://github.com/shadowsocks/shadowsocks-rust) и v2ray-plugin (https://github.com/shadowsocks/v2ray-plugin). Если в вашем репозитории этих пакетов нет, то компилируем из исходников (как это сделать написано в readme). После того, как вы откомпилировали v2ray-plugin, исполняемый файл v2ray-plugin желательно кинуть в директорию /usr/local/bin/. Создаем конфиг клиента 

vim ~/ssconfig.json

C примерно таким содержанием:

{
"server":"example.com",
"server_port":443,
"local_address": "127.0.0.1",
"local_port": 1080,
"password":"<пароль>",
"timeout":600,
"method":"chacha20-ietf-poly1305",
"plugin":"/usr/local/bin/v2ray-plugin",
"plugin_opts":"path=/anime;host=example.com;tls"
}

Пробный запуск клиента:

sslocal -c ~/ssconfig.json

Если все ок, то можно создать сервис systemd, который будет поднимать клиент каждый раз автоматически после установления связи с Интернетом. Для этого создаем в директории /etc/systemd/system файл ss-local.service примерно такого содержания:

[Unit]
Description=Daemon to start Shadowsocks Client
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=sslocal -c ~/ssconfig.json
Slice=-.slice
[Install]
WantedBy=multi-user.target

Проводим стандартные манипуляции:

sudo systemctl daemon-reload
sudo systemctl start ss-local.service
sudo systemctl status ss-local.service

sudo systemctl enable ss-local.service

6. Получаем lets encrypt сертификат

apt install snapd
snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot --nginx

 

После этого в консолечке должно быть поздравление о том, что все прошло успешно, и путь до сертификата:

Пару слов касательно продления сертификата. По идее, сертификат должен обновиться автоматически сидящим в процессах сервера демоном certbot’a, но если автоматические продление по каким-то причинам не сработало, то можно сделать это вручную лишь одной командой:

certbot renew 

Если доменов несколько и нужно продлить сертификат для определенного домена, то команда будет выглядеть примерно так:

certbot certonly --force-renew -d example.com
 

Рестартим энжинкс:

systemctl restart nginx

Рестартим v2ray:

systemctl restart ss-v2ray

7. Настраиваем клауду:

В настройках своего домена на cloudflare, в разделе SSL/TLS ставим Full(strict).

Переходим на свой сайт, убеждаемся, что все работает:

Прописываем прокси в тех приложениях, которые вы хотите проксировать. Например, в firefox это выглядит так:

Можно так же не мелочиться и проксировать всю систему.

Все! Если перейти на свой сайт, он должен открыться через https. Теперь провайдер видит как от вас к серверам клауды идет настоящий https, при этом если фрином решит просканировать наш домен, он найдет нашу страничку и пройдет мимо (фрином может отобрать домен, если ничего не найдет).