Свой VPN для самых маленьких | 3X-UI + VLESS

Дисклеймер: Материл носит исключительно информационный характер. Автор не призывает к каким-либо действиям.
Статья-гайд, посвящённая установке своего VPN-сервера(вернее прокси) на удалённом хостинге с помощью 3X-UI панели и протокола VLESS/XTLS-Reality
А вот и гайдик подъехал. Плюсы своего VPN-сервера, что такое VPS и VLESS мы обговаривали в предыдущей статье, сейчас же пошагово разберёмся, как его настроить, также обсудим некоторую теоретическую часть по ходу установки.
Тут будет много работы с терминалом, поэтому желательно понимать, как взаимодействовать с этой сущностью. В Windows можно работать через PowerShell/cmd от имени администраторы, в macOS — через стандартный терминал. Если у вас Linux — вы и без меня всё знаете :)
Аренда сервера
Покупаем VPS/VDS. Я пользуюсь HSHP, но он может затянуть с выдачей IP. Примеры хороших хостингов, которые можно оплатить из рф или криптой можно найти здесь и здесь. Разумеется, при покупке нужно выбирать расположение сервера вне России. Для личного пользования хватит 1 ядра и 1гб RAM, желательно хотя бы 10гб на диске, ОС — Ubuntu 22.04 (для других дальнейшие инструкции могут не подойти). Также важным фактором для нас является скорость передачи данных. По-хорошему нужно брать от 500мбит/сек, но для тестового показа я арендую дешёвенький VPS со 100мбит/сек.

Первое подключение к серверу
На своём пк открываем терминал/Bash/PowerShell от имени администратора. Пишем следующую команду ssh root@ip_сервера
, где вместо “ip_сервера”, соответственно, вставляем ip своего сервера. Терминал сначала спросит, точно ли мы хотим подключиться — пишем “yes”, затем предложит ввести пароль, скорее всего при покупке хостинг самостоятельно сгенерировал его, ищем на почте или на странице купленной услуги.
Ctrl + Shift + V
, либо правой кнопкой мыши (PowerShell/cmd/PuTTY).При вбивании пароля символы отображаться не будут, поэтому удобнее делать копи-пастом. Если не получается авторизоваться, хотя пароль правильный, измените раскладку клавиатуры на английскую.

Если вы видите приглашение типа root@host_name
— вы внутри, поздравляю! Да, тут нет привычного графического интерфейса как в обычном пк, но он и не нужен, ведь всё можно сделать через консоль.
Защита сервера
root — стандартная учётная запись администратора, которая чаще других становится целью брутфорс-атак (перебора паролей). Обезопасим себя, создав нового пользователя и запретив вход для root (также называемого суперпользователем). Пишем adduser новое_имя
, придумываем сложный пароль и вбиваем/вставляем его. Для генерации сильных паролей я использую KeePass. Дальше нажимаем Enter
несколько раз, пока не появится вопрос. Жмём y
. Даём новому пользователю возможность выполнять команды от имени суперпользователя: usermod -aG sudo имя_пользователя
, выходим из системы командой exit
либо закрывая терминал.

Зайдём под именем созданного пользователя: ssh имя_пользователя@ip_сервера
, и проверим работоспособность командой sudo ls -la /root
. Вывод есть? Значит всё хорошо, идём дальше.
Теперь перед каждой командой, требующей доступ администратора, нам придётся писать sudo
и вводить пароль (единоразово для сессии), ведь мы работаем не через суперпользователя, имеющего доступ ко всему и вся.

Так, пора бы обновить систему. Пишем sudo apt update && sudo apt full-upgrade -y
и ждём.
Установим nano: sudo apt install nano
, откроем конфиг SSH командой sudo nano /etc/ssh/sshd_config
и изменим параметр “PermitRootLogin” с “yes” на “no”.
nano — консольный текстовый редактор Linux (UNIX-подобных ОС). Он покажется довольно специфичным юзеру, пользовавшемся только графическими редакторами, поэтому вот пару советов, которые могут вам помочь:
- Передвигать курсор мышкой не получится, впрочем как и во всём терминале, так что используйте для этого стрелки на клавиатуре.
- Нажмите
Ctrl + O -> Enter
, чтобы сохранить файл; НажмитеCtrl + X
, чтобы выйти из редактора.

Так лучше, теперь root не сможет зайти в систему никоим образом. Ещё один важный шаг: нужно перевесить порт SSH с дефолтного на повыше. Открываем (если уже закрыли) тот же самый файл sshd_config, раскомментируем строку “Port”, убрав #
и пишем произвольный номер порта. Нужно запомнить его.

ClientAliveInterval
и/или ClientAliveCountMax
на более высокие. У меня стоят 300 и 12 соответственноНе забываем перезапустить службу SSH: sudo systemctl restart sshd
.
Выйдем и зайдём нормально :D
Прописываем exit
, затем подключаемся к серверу с нового порта: ssh имя_пользователя@ip_сервера -p номер_порта
.
Все предыдущие шаги были сделаны с целью обезопасить систему от непрошеных гостей. Сейчас же начнём установку 3X-UI панели, которая облегчит настройку XRay и даст графический интерфейс.
- Так, стоп, а что за XRay?
- XRay — ПО, выполняющее функции прокси. Оно не является таковым в физическом смысле, но содержит протоколы, транспорты и всё нужное для работы прокси-сервера.
- Окей, кажется ещё упоминались какие-то VLESS и Reality?
- VLESS — протокол передачи данных, поддерживающий технологии маскировки, к примеру XTLS-Reality, позволяющий скрыть трафик под обычные HTTPS запросы.
- Я запутался…
- Давайте ещё разок с самого начала. VPS — виртуальный сервер, размещённый на физическом. В нашем случае он находится где-то в Германии. На нём установлена операционная система, вроде Windows, но не он, а дистрибутив (реализация) Linux, называемый Ubuntu. На эту ОС мы накатим 3X-UI — программу, которая облегчит настройку XRay — ПО для маршрутизации и проксирования трафика, использующее для этой цели протоколы по типу VLESS, а последний, в свою очередь, улучшает свой функционал, работая с технологией XTLS-Reality, которая позволит маскироваться под определённый сайт. Фух, ну с объяснениями вроде закончили…
Установка 3x-ui
Вернёмся к практической части. Выполняем последовательность следующих команд:
|
|
Изменим строчки, начинающиеся с $PWD на:
|
|
Выйдем из файла, предварительно сохранив изменения -> вставляем sudo docker-compose up -d
Готово. Теперь переходим в браузер, в поисковой строке вбиваем http://ip_сервера:2053/panel/
. В качестве логина и пароля вводим дефолтные admin/admin.

Защита панели
Хорошо, панель есть. Теперь нужно защитить её от тех же брутфорс-атак. Для этого переходим в настройки и:
Меняем корневой путь URL адреса. У меня будет
/kekw/
(запишите его).Меняем порт панели. Желательно выбрать в пределах от 60000 до 65535 (также запомните или запишите).

Сохраните настройки и перезапустите панель. Теперь вы сможете войти в неё по следующему URL: http://ip_сервера:указанный_порт/корневой_путь/
- На странице “Настройки безопасности” измените стандартные логин и пароль.

Настройка VLESS и Reality
Теперь, наконец-таки, займёмся подключением протокола! Переходим во вкладку “Подключения” (Inbounds) и жмём плюсик.
В “Примечании” (Remark) пишем любое название подключения, протокол — VLESS, “Порт IP” (Listening IP) — пустой, порт — 443.

В настройках клиента меняем Email (по факту никнейм) на что-то уникальное и удобочитаемое. ID сгенерировано панелью, общий расход и дату окончания устанавливаем по усмотрению, я же оставлю эти поля пустыми.

Ниже в строке “Безопасность” выбираем “Reality”, после чего в настройках клиента появляется строка “Flow”. В выпадающем окне жмём на “xtls-rprx-vision”.
Возвращаемся к настройке транспорта. В “uTLS” выбирайте что хотите из знакомого и популярного, я оставил chrome.
В “Dest” прописываем адрес сайта, по которому будет перенаправляться подключения для маскировке трафика. Вот тут сложнее. Желательно выбрать сайт из той же сети, в которой находится наш сервер, чтобы пинг и шанс блокировки сервера были ниже.
Для Windows/Linux можно использовать эту утилиту. Переходим по ссылке, качаем на ХОСТ (т.е. ваш пк), открываем командную строку, переходим в папку скачивания и запускаем программу (для Windows: Win+R -> cmd
-> cd Downloads
-> .\RealiTLScanner-windows-64 -addr ip_сервера
). Ждём несколько минут, нажимаем Ctrl+C и смотрим на вывод (также можно открыть созданный .csv
файл).
Получили что-то такое:

Мда, не густо. Возможно дело в дешевизне хостинга VPS, ну да неважно. Главное выбрать популярный зарубежный сайт, который заблокируют с наименьшей долей вероятности для жителей РФ. Также важно учесть пинг: в идеале он должен быть <10мс. Проверить можно командой ping выбранный_сайт
(Ctrl + C, чтобы остановить процесс).
Я выберу google.com:443, основываясь на вышеуказанных критериях. В “SNI” указываем “google.com,www.google.com”.
Отныне провайдер будет думать, что вы подключаетесь к google.com, даже если вы находитесь на nelzagram.com.
“Sniffing” рекомендуется оставлять по дефолту, но я включил 🤷♂️.

Подключение к VPN
Готово! Осталось только подключиться. Для этого воспользуемся каким-либо из клиентов. Для любых устройств я рекомендую Hiddify. Чтобы скачать его, перейдите по ссылке или найдите репозиторий в поисковике, промотайте вниз до “Direct Download” и выберите свою платформу.
Вернёмся к панельке. Сейчас имеем такую ситуацию:

Жмём на плюсик рядом с “ID”, выпадут текущие пользователи. Тыкаем на значок qr-кода, затем на сам высветившийся qr — ссылка будет скопирована в буфер обмена.

Теперь откроем Hiddify. Жмём на плюсик в правом верхнем углу, далее на “Добавить из буфера обмена”. Осталось нажать на центральную кнопку.. та-дам! Всё работает, можно пользоваться :)

В параметрах конфигурации вы можете поставить регион ru, чтобы подключаться к сайтам с доменами .ru
напрямую — так шанс идентификации использования прокси приближается к нулю. Если же всякие нельзяграммы так и не работают, измените в настройках режим работы на “VPN”. Учтите, что в этом случае нужно будет открыть приложение с правами администратора. У меня, к примеру, по дефолту режим стоял “Прокси”.

Схема подключения на мобильных устройствах практически идентична. Ссылку можете получить, отсканировав qr или переслав через тот же телеграм. Также нужно выбрать режим работы VPN и установить регион по желанию. К слову, я использую VPN для всех сайтов (регион — Другой), и за полтора месяца проблем не было.

Пользователи
Для каждого подключения есть возможность создать несколько пользователей. Для чего? Ну можно следить за расходом трафика, ограничивать его, задавать начальную и окончательную даты использования и может что-то ещё…
Создать новых пользователей очень просто. Ищем наше подключение, нажимаем на значок под “Меню” -> “ Добавить пользователя”. В качестве Email пишем уникальное имя, а в качестве Flow устанавливаем тот же “xtls-rprx-vision”.

Супер, теперь у нас есть 2 пользователя. Ко второму может подключиться, например, наш друг. Просто берём ссылку, нажав на соответствующий qr в строке пользователя.

Установка сертификата
Вверху панели вы наверняка заметили предупреждение о том, что соединение не защищено. Так и есть, ведь мы подключаемся к этой панели по протоколу http, а вот чтобы подключаться по https, нам нужен SSL/TLS сертификат. Разберём два способа подключения этой сущности.
Способ 1
Вообще сертификаты TLS подписываются специализированными центрами, но такой вариант может подойти не всем, так как он требует наличия домена, а это либо затраты + раскрытие своих паспортных данных, либо ненадёжные бесплатные поддомены, так что обучу вас тайной технике самоподписи…
Будем пользоваться утилитой OpenSSL. Снова подключаемся к нашему серверу: ssh имя_пользователя@ip_сервера -p номер_порта
-> вводим пароль. Скачиваем пакеты: sudo apt install openssl
(хотя скорее всего уже установлены) -> снова вводим пароль.
Перейдём в папку, куда устанавливали панель и создадим там директорию, где будут храниться ключи (если после второй команды вылезает ошибка, проигнорируйте её):
|
|
Теперь создадим приватный ключ командой openssl genrsa -out private.key 2048
, где вместо “private” вы можете вставить любое имя для ключа.
Далее, создаём запрос на подпись сертификата: openssl req -key private.key -new -out public.csr
, где вместо “public” вы также можете вставить любое имя. Сейчас у нас будут спрашивать информацию о нашем сайте / компании, которую он представляет. Оставляем всё по умолчанию, нажимая Enter
, КРОМЕ пункта “Common Name”, где вписываем ip VPS сервера.
И, наконец, самостоятельно подписываем сертификат: openssl x509 -signkey private.key -in public.csr -req -days 3650 -out public.crt
, где вместо “3650” вы можете вставить любое число дней, на которое хотите подписать сертификат. По истечении срока вам снова придётся его подписать или создать новый.
Посмотрим, что имеется в папке cert:

Отлично, все файлы на месте.
Открываем панельку и бежим в настройки. В поле “Путь к файлу публичного ключа сертификата панели” вводим /root/cert/public.crt
, а в поле “Путь к файлу приватного ключа сертификата панели” вводим /root/cert/private.key
. Нажимаем “Сохранить” в верхней левой части.
Сохранилось? Ну и славно. Перезапускаем панель и видим предупреждение браузера:

Это нормально, просто хром в курсе, что сертификат самоподписанный, но нехотя установит https соединение, если мы всё таки перейдём по ссылке.
Ну что там, проверяем… Ура! Красное предупреждение исчезло 🥳
Способ 2
А для тех, кто не хочет испытывать на себе буллинг со стороны браузеров, я покажу как получить сертификат, подписанный сертифицированным центром. Так, что там нужно.. ах да, для начала — домен. Тут либо покупать, либо использовать бесплатные поддомены, я воспользуюсь вторым вариантом.
Переходим на сайт и регистрируемся. К слову, кроме корректного email’а, вы можете ввести выдуманные данные. Активируем аккаунт через письмо на почте, тыкаем сюда и выбираем желаемый ПУБЛИЧНЫЙ домен -> попадаем в окно настройки. В поле “Subdomain” пишем имя, которое хотим видеть перед основным доменом, в “Destination” вставляем ip сервера -> сохраняем. Готово.

Возвращаемся в консоль. Как и в первом способе, переходим в папку cert и используем OpenSSL: openssl genrsa -out private.key 2048
; openssl req -key private.key -new -out public.csr
— здесь также прожимаем Enter везде, КРОМЕ пункта “Common Name”, где вписываем ДОМЕН, который только что создали.
Установим новую утилиту, которая отправит наш сертификат на подпись в центр и запросим эту подпись:
|
|
По той же схеме переходим в настройки панели и пишем пути для сертификата в соответствующих полях: /root/cert/public.pem
— путь к публичному ключу, а /root/cert/private.key
— путь к приватному ключу.
Вот и всё, теперь браузеры не будут ругаться! А чтобы так было, впредь нужно заходить в 3x-ui панель по следующему адресу: https://домен:указанный_порт/корневой_путь/
.
Telegram бот
Интересная фича, которая позволит вам управлять панелью через Telegram бота. Делается всё очень и очень просто.
Для начала переходим к @BotFather, стартуем -> /newbot -> Пишем любое имя -> Пишем юзернейм с “bot” на конце -> Копируем токен и вставляем его в панели в соответствующую строку в настройках Telegram бота. Сохраняем изменения и перезапускаем панель.

Перейдём по ссылке к боту. Получаем свой id командой, как ни странно, /id
, и также вставляем в панель, снова перезапуская её. Теперь бот знает, что вы — хозяин админ.

Панель сейчас выглядит как-то так:

По желанию вы можете настроить и другие параметры, например, частоту отправки уведомлений или язык бота.
Так, хорошо, посмотрим, что умеет бот. Снова пишем /start
— выпадает менюшка. Видим: Использование сервера, бэкапы баз данных, настройки подключений и их пользователей, просмотр онлайн клиентов и т.п. Также без подключения к самой панели через бота можно перезапускать ядро командой /restart force
.

Можно сделать так, чтобы пользователи тоже смогли просматривать свой объём используемого трафика. Для этого следуйте “All Clients” -> “имя_подключения” -> “имя_пользователя” -> “Set Telegram User” -> “Select Telegram User”. Теперь пользователь вашего VPN может просматривать свою информацию (но не более того).

Поздравляю, бот готов!
Подписки
Тоже довольно интересная функция, позволяющая придать процессу создания своего VPN коммерческий вектор. С помощью подписки можно создать ссылку сразу на несколько подключений, то есть у пользователя появится сразу несколько конфигураций VPN в клиенте, к тому же, изменения будут подтягиваться автоматически (без подписки придётся удалять и создавать подключения в клиенте заново). Вдруг какой-то перестанет работать, а тут второй как раз под рукой.
Чтобы активировать эту функцию, переходим в настройки панели -> “Подписка” и включаем службу. Пути к файлам сертификатов выбираем те же (оставьте пустыми, если сертификат самоподписанный), что делали для самой панели, корневой путь подписки меняем на произвольный. Порт выставляем какой-нибудь другой, но он не должен использоваться другими службами на вашем VPS. Чтобы проверить прослушиваемые порты, вбейте ss -ntlp
. Выбираем любой четырёх/пятизначный НЕ из этого списка.

Можно также изменить URI путь в подписке json, чтобы избавиться от предупреждения.
Сохраняем конфиг и перезапускаем панельку. Получили что-то подобное:

Теперь можем подключать клиентов к подписке. Для этого идём в подключения -> “ Редактировать пользователя”. В выпашем окне в поле “Subscription” пишем название подписки. Это же название вы будете писать каждый раз, когда хотите присоединить клиента в другом подключении к этой подписке. Сохраняем изменения.

P.S. Для примера я сделал второе подключение и вписал идентичное название подписки для его клиента.
Выбираем подключение и клиента, которому присвоили подписку, жмём на значок qr, затем на qr-код ПОДПИСКИ. Возвращаемся в Hiddify -> Ctrl + V. Видим новый профиль и значок перезагрузки рядом с ним. С помощью него мы и будем обновлять подписку, если понадобится вытянуть изменения настроек подключений 3x-ui панели. Также в левой менюшке “Прокси” можно выбрать конкретное подключение, которое вам нужно в данный момент.

Вот гайд и подошёл к концу! Если у вас возникнут трудности/вопросы/предложения, жду их в лс! Спасибо, что читаете!
Ну и конечно, с наступающим Новым Годом! 🎅🎁
