March 28

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 записей

DNS - Records

Далее нам нужно добавить A запись с поддоменом и нашим адресом. Я вам рекомендую ставить многоуровневый поддомен для лучшей защиты от случайных гостей. Также я вам рекомендую избежать использования в поддомене слов "vpn", "vless", "reality" и тому подобных, поскольку это может быть триггером для ТСПУ. Я для демонстрации буду использовать свой старый, ныне не рабочий домен farevfx.site, но выполнять действия в терминале буду с другим доменом

Нажимаем "Add record"
Вариант длинного поддомена который не палится ТСПУ. Обязательно выключайте проксирование "Cloudflare".

Теперь необходимо подождать пока все записи не обновятся на 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 или что-то сломал?

Просто повтори всю инструкцию ещё раз. Всё сломанное ранее перезапишется корректными данными