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 или немного модифицированный.
Краткий план действий.
- Приобретаем VPS-ку.
- Приобретаем домен.
- Регистрируемся в Cloudflare и привязываем туда домен.
- Разворачиваем на нашей VPS-ке shadowsocks
- Получаем бесплатный SSL-сертификат и настраиваем обфускацию трафика
- Настраиваем клиент под windows/android/ios/linux
- ?????
- 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
Вбиваем в адресную строку браузера наш сайт и проверяем, что всё работает:
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, при этом если фрином решит просканировать наш домен, он найдет нашу страничку и пройдет мимо (фрином может отобрать домен, если ничего не найдет).