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

/articles/vpn_server/images/feature.png

Дисклеймер: Материл носит исключительно информационный характер. Автор не призывает к каким-либо действиям.

Статья-гайд, посвящённая установке своего 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мбит/сек.

/articles/vpn_server/images/VPS.png

Первое подключение к серверу

На своём пк открываем терминал/Bash/PowerShell от имени администратора. Пишем следующую команду ssh root@ip_сервера, где вместо “ip_сервера”, соответственно, вставляем ip своего сервера. Терминал сначала спросит, точно ли мы хотим подключиться — пишем “yes”, затем предложит ввести пароль, скорее всего при покупке хостинг самостоятельно сгенерировал его, ищем на почте или на странице купленной услуги.

Инфо
Вставка текста в терминал осуществляется либо клавишами Ctrl + Shift + V, либо правой кнопкой мыши (PowerShell/cmd/PuTTY).
При вбивании пароля символы отображаться не будут, поэтому удобнее делать копи-пастом. Если не получается авторизоваться, хотя пароль правильный, измените раскладку клавиатуры на английскую.
Инфо
SSH — сетевой протокол, позволяющий удалённо управлять ОС
/articles/vpn_server/images/ssh.png

Если вы видите приглашение типа root@host_name — вы внутри, поздравляю! Да, тут нет привычного графического интерфейса как в обычном пк, но он и не нужен, ведь всё можно сделать через консоль.

Защита сервера

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

/articles/vpn_server/images/passwd.png

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

Теперь перед каждой командой, требующей доступ администратора, нам придётся писать sudo и вводить пароль (единоразово для сессии), ведь мы работаем не через суперпользователя, имеющего доступ ко всему и вся.

/articles/vpn_server/images/new_user.png

Так, пора бы обновить систему. Пишем 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-подобных ОС). Он покажется довольно специфичным юзеру, пользовавшемся только графическими редакторами, поэтому вот пару советов, которые могут вам помочь:

  1. Передвигать курсор мышкой не получится, впрочем как и во всём терминале, так что используйте для этого стрелки на клавиатуре.
  2. Нажмите Ctrl + O -> Enter, чтобы сохранить файл; Нажмите Ctrl + X, чтобы выйти из редактора.
/articles/vpn_server/images/nano.png

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

Инфо
IP — адрес сетевого устройства, порт — адрес сетевой службы/программы на этом IP
/articles/vpn_server/images/nano2.png
Инфо
Если вам надоело, что соединение с сервером теряется после нескольких минут бездействия, измените значения параметров 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

Вернёмся к практической части. Выполняем последовательность следующих команд:

1
2
3
4
sudo apt install docker.io docker-compose -y
git clone https://github.com/MHSanaei/3x-ui.git
cd 3x-ui
sudo nano docker-compose.yml

Изменим строчки, начинающиеся с $PWD на:

1
2
      - /home/имя_пользователя/3x-ui/db/:/etc/x-ui/
      - /home/имя_пользователя/3x-ui/cert/:/root/cert/

Выйдем из файла, предварительно сохранив изменения -> вставляем sudo docker-compose up -d

Готово. Теперь переходим в браузер, в поисковой строке вбиваем http://ip_сервера:2053/panel/. В качестве логина и пароля вводим дефолтные admin/admin.

/articles/vpn_server/images/3x-ui.png

Защита панели

Хорошо, панель есть. Теперь нужно защитить её от тех же брутфорс-атак. Для этого переходим в настройки и:

  1. Меняем корневой путь URL адреса. У меня будет /kekw/ (запишите его).

  2. Меняем порт панели. Желательно выбрать в пределах от 60000 до 65535 (также запомните или запишите).

/articles/vpn_server/images/settings1.png
Инфо
Чтобы изменить язык на русский, выберите страну в настройках в поле “Language”

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

  1. На странице “Настройки безопасности” измените стандартные логин и пароль.
/articles/vpn_server/images/settings2.png

Настройка VLESS и Reality

Теперь, наконец-таки, займёмся подключением протокола! Переходим во вкладку “Подключения” (Inbounds) и жмём плюсик.

В “Примечании” (Remark) пишем любое название подключения, протокол — VLESS, “Порт IP” (Listening IP) — пустой, порт — 443.

/articles/vpn_server/images/vless1.png

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

/articles/vpn_server/images/vless2.png

Ниже в строке “Безопасность” выбираем “Reality”, после чего в настройках клиента появляется строка “Flow”. В выпадающем окне жмём на “xtls-rprx-vision”.

Возвращаемся к настройке транспорта. В “uTLS” выбирайте что хотите из знакомого и популярного, я оставил chrome.

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

Получили что-то такое:

/articles/vpn_server/images/reality.png

Мда, не густо. Возможно дело в дешевизне хостинга VPS, ну да неважно. Главное выбрать популярный зарубежный сайт, который заблокируют с наименьшей долей вероятности для жителей РФ. Также важно учесть пинг: в идеале он должен быть <10мс. Проверить можно командой ping выбранный_сайт (Ctrl + C, чтобы остановить процесс).

Я выберу google.com:443, основываясь на вышеуказанных критериях. В “SNI” указываем “google.com,www.google.com”.
Отныне провайдер будет думать, что вы подключаетесь к google.com, даже если вы находитесь на nelzagram.com.

“Sniffing” рекомендуется оставлять по дефолту, но я включил 🤷‍♂️.

/articles/vpn_server/images/vless3.png

Подключение к VPN

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

Вернёмся к панельке. Сейчас имеем такую ситуацию:

/articles/vpn_server/images/inbound1.png

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

/articles/vpn_server/images/inbound1.png

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

/articles/vpn_server/images/hiddify.png

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

/articles/vpn_server/images/hiddify2.png

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

/articles/vpn_server/images/hiddify_android.png

Пользователи

Для каждого подключения есть возможность создать несколько пользователей. Для чего? Ну можно следить за расходом трафика, ограничивать его, задавать начальную и окончательную даты использования и может что-то ещё…

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

/articles/vpn_server/images/add_user.png

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

/articles/vpn_server/images/add_user2.png
Предупреждение
Рассчитайте, сколько устройств смогут комфортно пользоваться вашим прокси. Если вы дадите доступ слишком большому количеству людей, серверу может банально не хватить пропускной способности. Для скорости в 500мбит/c я бы ограничился 25 устройствами.

Установка сертификата

Вверху панели вы наверняка заметили предупреждение о том, что соединение не защищено. Так и есть, ведь мы подключаемся к этой панели по протоколу http, а вот чтобы подключаться по https, нам нужен SSL/TLS сертификат. Разберём два способа подключения этой сущности.

Способ 1

Вообще сертификаты TLS подписываются специализированными центрами, но такой вариант может подойти не всем, так как он требует наличия домена, а это либо затраты + раскрытие своих паспортных данных, либо ненадёжные бесплатные поддомены, так что обучу вас тайной технике самоподписи…

Будем пользоваться утилитой OpenSSL. Снова подключаемся к нашему серверу: ssh имя_пользователя@ip_сервера -p номер_порта -> вводим пароль. Скачиваем пакеты: sudo apt install openssl (хотя скорее всего уже установлены) -> снова вводим пароль.

Перейдём в папку, куда устанавливали панель и создадим там директорию, где будут храниться ключи (если после второй команды вылезает ошибка, проигнорируйте её):

1
2
3
cd 3x-ui
mkdir cert
cd cert

Теперь создадим приватный ключ командой 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:

/articles/vpn_server/images/openssl.png

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

Сохранилось? Ну и славно. Перезапускаем панель и видим предупреждение браузера:

/articles/vpn_server/images/browser-warning.png

Это нормально, просто хром в курсе, что сертификат самоподписанный, но нехотя установит https соединение, если мы всё таки перейдём по ссылке.

Ну что там, проверяем… Ура! Красное предупреждение исчезло 🥳

Способ 2

А для тех, кто не хочет испытывать на себе буллинг со стороны браузеров, я покажу как получить сертификат, подписанный сертифицированным центром. Так, что там нужно.. ах да, для начала — домен. Тут либо покупать, либо использовать бесплатные поддомены, я воспользуюсь вторым вариантом.

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

/articles/vpn_server/images/subdomain.png

Возвращаемся в консоль. Как и в первом способе, переходим в папку cert и используем OpenSSL: openssl genrsa -out private.key 2048; openssl req -key private.key -new -out public.csr — здесь также прожимаем Enter везде, КРОМЕ пункта “Common Name”, где вписываем ДОМЕН, который только что создали.

Установим новую утилиту, которая отправит наш сертификат на подпись в центр и запросим эту подпись:

1
2
3
4
5
6
docker-compose down
sudo apt install certbot
certbot certonly --csr public.csr --email email_адресс --agree-tos --no-eff-email
1
cat 0000_cert.pem 0000_chain.pem > public.pem
docker-compose up -d
Предупреждение
Если на этом этапе вы получили отказ из-за слишком большого количества выданных сертификатов за последнее время “There were too many requests of a given type :: too many certificates (50) already issued for…”, то нужно либо подождать указанное время и попробовать снова, либо получить и попробовать новый поддомен, расположенный в другой доменной зоне (в моём случае не .strangled.net).

По той же схеме переходим в настройки панели и пишем пути для сертификата в соответствующих полях: /root/cert/public.pem — путь к публичному ключу, а /root/cert/private.key — путь к приватному ключу.

Вот и всё, теперь браузеры не будут ругаться! А чтобы так было, впредь нужно заходить в 3x-ui панель по следующему адресу: https://домен:указанный_порт/корневой_путь/.

Telegram бот

Интересная фича, которая позволит вам управлять панелью через Telegram бота. Делается всё очень и очень просто.

Для начала переходим к @BotFather, стартуем -> /newbot -> Пишем любое имя -> Пишем юзернейм с “bot” на конце -> Копируем токен и вставляем его в панели в соответствующую строку в настройках Telegram бота. Сохраняем изменения и перезапускаем панель.

/articles/vpn_server/images/bot.png

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

/articles/vpn_server/images/bot2.png

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

/articles/vpn_server/images/bot3.png

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

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

/articles/vpn_server/images/bot4.png

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

/articles/vpn_server/images/bot5.png

Поздравляю, бот готов!

Подписки

Тоже довольно интересная функция, позволяющая придать процессу создания своего VPN коммерческий вектор. С помощью подписки можно создать ссылку сразу на несколько подключений, то есть у пользователя появится сразу несколько конфигураций VPN в клиенте, к тому же, изменения будут подтягиваться автоматически (без подписки придётся удалять и создавать подключения в клиенте заново). Вдруг какой-то перестанет работать, а тут второй как раз под рукой.

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

/articles/vpn_server/images/ss.png

Можно также изменить URI путь в подписке json, чтобы избавиться от предупреждения.

Сохраняем конфиг и перезапускаем панельку. Получили что-то подобное:

/articles/vpn_server/images/subscription.png

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

/articles/vpn_server/images/subscription2.png

P.S. Для примера я сделал второе подключение и вписал идентичное название подписки для его клиента.

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

/articles/vpn_server/images/hiddify3.png

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

Ну и конечно, с наступающим Новым Годом! 🎅🎁

Поддержать автора
NoisyCake cloudtipscloudtips
0%