четверг, 31 марта 2022 г.

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

 

Данный гайд написан благодаря анонам из 2ch.hk/s, в частности благодаря этому и этому доброму анону.

Преамбула.

В свете нынешних событий в России, тема блокировок интернета стала актуальной, как никогда. На сегодняшний день самым популярным способом обхода блокировок являются 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:

nano /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/*;

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

nano /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
Вставляем следующее (вместо <пароль> нужно придумать пароль):
nano /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
Сохраняем ctrl + o, закрываем ctrl + x
Включаем сервис:
systemctl enable ss-v2ray.service

5. Настраиваем клиент под 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, можно не трогать)

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, при этом если фрином решит просканировать наш домен, он найдет нашу страничку и пройдет мимо (фрином может отобрать домен, если ничего не найдет).

 

3 комментария:

  1. Анонимный06 апреля, 2022

    Спасибо за гайд

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

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

    В какое именно место вставлять эту строку? Там же раздел http немалый.

    ОтветитьУдалить
    Ответы
    1. >В какое именно место вставлять эту строку? Там же раздел http немалый.
      В любую же. Главное, чтобы эта строка была внутри http { }

      Удалить
  2. Анонимный16 апреля, 2022

    У кого arm64, go не взлетит.

    Так что качаем
    https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.14.3/shadowsocks-v1.14.3.aarch64-unknown-linux-gnu.tar.xz

    Берём оттуда ssserver
    mv ssserver /etc/ss-go/ss-go

    Делаем конфиг
    /etc/ss-go/shadowsocks-rust.json
    {
    "server": "127.0.0.1",
    "server_port": 8008,
    "password": "пароль",
    "timeout": 120,
    "method": "chacha20-ietf-poly1305",
    "no_delay": true,
    "fast_open": true,
    "reuse_port": true,
    "workers": 1,
    "ipv6_first": false,
    "nameserver": "1.1.1.1",
    "mode": "tcp_and_udp",
    "plugin": "/etc/ss-go/v2ray-plugin",
    "plugin_opts": "server;loglevel=none;path=/anime"
    }

    Меняем в /etc/systemd/system/ss-v2ray.service
    ExecStart=/etc/ss-go/ss-go -c /etc/ss-go/shadowsocks-rust.json

    Не забываем что v2ray-plugin нужен arm64

    ОтветитьУдалить