VLESS на SNI Steal Oneself: как наебать РКН
РКН продолжает модифицировать оборудование для блокировки ВПН-ов, а мы продолжаем водить РКНу хуём по губам. Всё стабильно.
Сегодня мы будем разворачивать ВПН сервер на технологии VLESS с использованием SNI Steal Oneself (или возможно вы могли слышать про self-steal, это одно и то же). Но для начала немного теории
Steal Oneself или как сторонние SNI стали палиться
Раньше при разворачивании VLESS сервера мы указывали в строках SNI и Target какие-либо кастомные значения, маскируя трафик под условный майкрософт, гугл или под российские сервисы (что работало в начале для обхода белых списков). Но оборудование РКН модифицирует и такие методы стали палиться.
IP-SNI Mismatch и зондирование - как сетевые отличия палят твой шедевросервер
Предположим что ваш айпишник 12.34.56.78 и вы маскируетесь под microsoft.com. У самого же microsoft другое всё: айпишник (они в подсетях 13.107.x.x и 150.171.x.x), сертификаты (у микропениса свой центр лицензирования, у тебя либо самоподпись, либо бесплатный let's encrypt либо его вообще нет) и контент (у микрослопа рекламные материалы на главной, а ты либо даже не ставил веб сервер, либо у тебя стандартная заглушка от apache/nginx).
И если РКНовская ТСПУшка решит проверить "а не впн ли там хостится) то совокупность этих факторов спалит тебя и айпишник твоей VPS'ки полетит в бан, после чего ты никогда не увидишь этот сервер.
Спасение: маскируемся под самих себя
По итогу умные ребята с форума ntc.party посидели, подумали. И пришли к выводу.
А зачем маскироваться под кого-то, если можно поднять там же веб-сервер и маскироваться под него? А если ТСПУ посмотрит айпишник, увидит обычный сайт, тот же самый который указан в SNI и для него это не будет "странным"
Так на свет появился Steal Onself - метод маскировки трафика для VLESS который вместо того чтобы притворяться кем-то, будет притворяться самим собой.
Если ранее при маскировке мы получали множество несоответствий нашего сервера с маскируемым, то теперь наш сервер и является тем под кого идёт маскировка. Как итог: несоответсвий просто нет. ТСПУ не видит различий между вашим трафиком, который маскируется под ваш сайт и самим сайтом, потому что это он и есть.
Установка
Теперь когда мы разобрались с тем что из себя представляет Steal Onself перейдём к его установке на реальный сервер. Вообще изначально тут могло быть 20-ти страничное руководство по настройке веб-сервера, но благо гемини смогла уложить всё в единый скрипт который самостоятельно с нужными параметрами его разворачивает. Нам надо лишь развернуть панель и создать инбаунд.
Требования
- VPS сервер на Ubuntu 24.04 с доступом к root по ssh и адресом за пределами россии. Возможно можно использовать и 22.04, но у меня действия выполняются на 24.04
- Собственный домен. Можно использовать и верхние поддомены сервисов, но я вам рекомендую потратить 200 рублей на свой домен в зоне .site и привязать его к хабу cloudflare для большего контроля
- Прямые руки (на этом этапе отсеется 99% юзеров)
Шаг 1: привязка домена к айпишнику.
Для начала нужно привязать ваш домен к айпишнику нашей VPS-ки. Я для примера буду использовать хаб cloudflare, вам также рекомендую перенести домен в него. Как это сделать - ищите в интернете по запросам "перенос домена в cloudflare" "смена ns записей (ваш регистратор)" и тому подобным.
Для начала переходим в меню слева в список DNS записей
Далее нам нужно добавить A запись с поддоменом и нашим адресом. Я вам рекомендую ставить многоуровневый поддомен для лучшей защиты от случайных гостей. Также я вам рекомендую избежать использования в поддомене слов "vpn", "vless", "reality" и тому подобных, поскольку это может быть триггером для ТСПУ. Я для демонстрации буду использовать свой старый, ныне не рабочий домен farevfx.site, но выполнять действия в терминале буду с другим доменом
Теперь необходимо подождать пока все записи не обновятся на DNS серверах. Обычно это занимает не более часа, но может быть до 48-ми часов. После чего можно переходить к шагу 2.
Шаг 2: установка веб сервера
Теперь необходимо установить веб-сервер под который мы в последствии будем маскироваться. Для этого мы логинимся на нашем VPS сервере под рутом и вводим команду ниже.
bash <(curl -Ls https://raw.githubusercontent.com/FareEditor/steal-onself-nginx/refs/heads/main/prep-web.sh)
Логика у скрипта простая: это обычный баш скрипт который запрашивает внешний айпишник VPS сервера, спрашивает на каком домене вы хотите развернуть сервер, после чего проверяет соответствие вашего домена и айпи адреса через утилиту dig. Если айпи домена соотвтетсвует вашего, то скрипт обновляет всю систему, разворачивает веб-сервер подготовленный для установки 3x-ui на порту 8443, запрашивает сертификат у Let's Encrypt через certbot и деплоит его на сервер. Если же айпишник не соответствует вашему домену - абортит установку.
После запуска скрипта вам нужно только ввести ваш домен. В нормальной ситуации ваши первые строчки в консоли будут выглядеть так:
root@similarlime:~# bash <(curl -Ls https://raw.githubusercontent.com/FareEditor/steal-onself-nginx/refs/heads/main/prep-web.sh) Detecting external IP address... Current server IP: 12.34.56.78 Enter your domain (e.g., example.com): your_country.subdomain.domain.com Verifying DNS records for your_country.subdomain.domain.com... Success! Domain your_country.subdomain.domain.com correctly points to 12.34.56.78
После чего начнётся установка веб-сервера. Если в конце выполнения скрипта вы получили сообщение как ниже - вы можете приступать к шагу 3
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Done! Web server and SSL certificates are ready for REALITY. root@similarlime:~#
Шаг 3: установка VLESS-панели
Теперь когда мы установили ловушку для цензоров - мы можем приступать к установке панели. Я буду использовать 3x-ui, но вы можете использовать и другие панели если работаете с ними. Установку мы начинаем следующей командой
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
Скрипт самостоятельно обновит систему, скачает недостающие пакеты и в конце спросит хотите ли вы задать свой порт, а также как ему получить SSL. Отвечаем также как в виде ниже
Would you like to customize the Panel Port settings? (If not, a random port will be applied) [y/n]: y
Please set up the panel port: 2053
Your Panel Port is: 2053
Port set successfully: 2053
Username and password updated successfully
Base URI path set successfully
═══════════════════════════════════════════
SSL Certificate Setup (MANDATORY)
═══════════════════════════════════════════
For security, SSL certificate is required for all panels.
Let's Encrypt now supports both domains and IP addresses!
Choose SSL certificate setup method:
1. Let's Encrypt for Domain (90-day validity, auto-renews)
2. Let's Encrypt for IP Address (6-day validity, auto-renews)
3. Custom SSL Certificate (Path to existing files)
Note: Options 1 & 2 require port 80 open. Option 3 requires manual paths.
Choose an option (default 2 for IP): 3
Using custom existing certificate...
Please enter domain name certificate issued for: your_country.subdomain.domain.com
Input certificate path (keywords: .crt / fullchain): /etc/letsencrypt/live/your_country.subdomain.domain.com/fullchain.pem
Input private key path (keywords: .key / privatekey): /etc/letsencrypt/live/your_country.subdomain.domain.com/privkey.pem
✓ Custom certificate paths applied.
Note: You are responsible for renewing these files externally.
═══════════════════════════════════════════
Panel Installation Complete!
═══════════════════════════════════════════
Username: UcMN1q7CD2
Password: fefP6BX3pm
Port: 2053
WebBasePath: SLAkcFLwyvyWzu0t8l
Access URL: https://your_country.subdomain.domain.com:2053/SLAkcFLwyvyWzu0t8l
═══════════════════════════════════════════Важно: вместо your_country.subdomain.domain.com укажите свой домен который вы задавали в шаге 1
В конце скрипт даст вам ссылку для доступа к панели, а также юзернем и пароль. Заходим по ссылке, логинимся и приступаем к шагу 4.
Шаг 4: настройка подключения в панели
Теперь когда мы в панели, надо создать подключение и первого клиента. Для этого переходим в меню "подключения" и нажимаем на зелёную кнопку "создать подключение"
Затем нужно создать подключение. Вот именно здесь пригодится то для чего мы настраивали Steal Oneself
Здесь важно вбить порт 443. В примечании можете выставить что хотите, это просто ярлык. Остальное оставляем как на скрине (такие параметры выставляются самостоятельно).
Вот именно здесь мы и устанавливаем SNI Steal Oneself. В качестве Target мы устанавливаем 127.0.0.1:8443 - это тот самый веб сервер который мы ставили во втором шаге, а в SNI устанавливаем наш домен. Так цензор не увидит наш трафик как нелегитимный, потому что мы будем трафик с сервера маскировать под тот же самый сервер. Не забудьте создать ключи шифрования, чтобы соединение работало.
В конце нажимаем "создать" и переходим к созданию ключа для приложения-клиента. Для этого в новом соединении нажимаем на 3 точки и выбираем "Добавить клиента"
Здесь мы вводим в поле "Email" имя клиента которое будет использовать ключ. Рекомендую для одного устройства выдавать один ключ. И обязательно (ОБЯЗАТЕЛЬНО) ставим Flow на xtls-rprx-vision для наиболее лучшей маскировки соединения. После чего нажимаем "добавить" и переходим в информацию о клиенте
И в конце окна будет ключ который вы и вставляете в ваш VLESS клиент, а также маленькая кнопочка для копирования ключа в буфер обмена. На этом установка сервера закончена.
Итог
И вот мы в очередной раз поводили РКНу хуём по губам, я очередной раз нарушил законы РФ, а все в итоге счастливы. Пожалуйста распространяйте эту статью, у каждого должно быть право на свободный интернет, а не тот обрубок что нам предоставляет вовочка пыпа. Интернет - свободное от запретов место, так давайте сохраним наше право на свободу хотя бы здесь, пока в диктаторском государстве всё запрещают.
Я не буду говорить о том как добавить ключ в приложение, это вероятнее всего вы знаете и без меня + клиентов овердохуя, каждый разбирать я не собираюсь.
F.A.Q
Небольшой список возможно возникших вопросов на которые здесь будет ответ
1. Почему я ввожу адрес сайта в браузере, а он не открывается?
Так и должно быть. Пока вы не настроите VLESS в 3x-ui сайт будет "спрятан" внутри сервера, а как только создадите подключение, он станет отдавать заглушку nginx в виде 403 forbidden, которой хватит для ТСПУшки. Я так сделал чтобы никто не лез туда из любопытства
2. Нужно ли мне самому продлевать сертификат SSL через 3 месяца?
Нет, в скрипте я добавил systemd-virus таймер работающий на systemd который самостоятельно через 75 дней выполнит автообновление сертификата и перезагрузит nginx
3. Зачем вообще нужен этот сайт-заглушка?
Перечитайте теорию, там всё расписано о том зачем всё это нужно
4. Можно ли без домена?
Нет, без буквенного адреса вообще нельзя. Можно использовать бесплатные поддомены, но я как раньше и говорил рекомендую купить домен в зоне .site за 200 рублей.
5. Что делать, если я случайно удалил Nginx или что-то сломал?
Просто повтори всю инструкцию ещё раз. Всё сломанное ранее перезапишется корректными данными