Свой VPN-сервис: Marzban

Дисклеймер: Материал носит исключительно информационный характер. Автор не призывает к каким-либо действиям.
Статья-гайд о том, как создать свой VPN-сервис на основе веб-панели Marzban.
Возможно, вы уже пользовались другой панелью управления прокси-сервером — 3x-ui. Если так, то, думаю, знаете о её главном минусе: объединить несколько 3x-ui и управлять ими централизованно не так-то просто. Приходится придумывать костыльные решения, например, агрегаторы.
Но есть ещё один выход: найти другую панель, умеющую управлять сразу несколькими прокси-серверами. Такие есть, и имя одной из них — Marzban. О ней сегодня и поговорим. Marzban позволяет связать множество серверов из разных стран, благодаря чему подписочные ссылки становятся невероятно удобными.
Настройка сервера
Как арендовать сервер, описывать здесь уже не буду. По опыту юзеров могу сказать, что как и для 3x-ui, хватит 1 ядра, 1гб RAM и 10гб дискового пространства. Есть вероятность найти для себя хороших хостеров по следующим ссылкам: тык; тык.
Можете также посоветовать проверенных провайдеров VPS в комментариях! 👇
MobaXterm
Чтобы было удобнее работать с серверами, рекомендую установить MobaXterm: она умеет запоминать данные сессий, а значит вам не придётся вводить каждый раз команду ssh...
вручную.
Для подключения нажимаем на Sessions -> New session -> SSH. В “Remote host” нужно ввести IP сервера, в “Specify username” — пишем root
, порт оставляем как есть. Имя сессии можно изменить в разделе “Bookmark settings” в “Session name”. Жмём “OK”.
P.S. Когда перейдёте на сессию, использующую ключ для авторизации, нажмите “Advanced SSH settings” -> “Use private key” -> выберите путь до ключа.

Обновления
Переходим непосредственно к настройке сервера. В целом большинство из представленных пунктов является важной БАЗОЙ для безопасности вашего VPS. Пренебрегать какими-либо из них не рекомендуется, если вы абсолютно не уверены в своих действиях.
Начнём с обновления системы, а также скачаем нужные инструменты и включим автоматическое обновление пакетов, связанных с безопасностью ОС:
|
|
В открывшийся файл вставить:
|
|
Ctrl + x
-> y
-> Enter
Для проверки работы: unattended-upgrade --dry-run --debug
. Если всё сделано правильно, пакеты либо обновятся, либо будет указано, что обновлять нечего.
Новый пользователь
Следуя канонам, создадим пользователя и включим его в группу sudo: useradd -m {username} -G sudo -s /bin/bash
.
Правим конфиг visudo
:
- Исправляем предпоследнюю незакомментированную строку на
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
- Комментируем строку
%admin ALL=(ALL) ALL
Так при выполнении команд, требующих прав админа, вам не придётся вводить пароль пользователя.
Сохраняем и закрываем. Теперь заходим под новым юзером: su - {username}
и ставим маску прав на все создаваемые файлы: echo 'umask 0077' >> .bashrc
.
SSH
Теперь настроим ssh config. Открываем файл sudo nano /etc/ssh/sshd_config
и меняем в нём следующие значения:
Port
— любой в рекомендуемом диапазоне 49152-65535PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication no
PermitEmptyPasswords no
KbdInteractiveAuthentication no
— если естьClientAliveInterval 360
— для продления сессииClientAliveCountMax 12
— для продления сессии
Создаём папку для хранения ssh ключей: mkdir .ssh && chmod 700 .ssh
.
На локальной машине создаём пару ключей: Win + R
-> cmd
-> в командной строке пишем ssh-keygen
-> указываем путь к файлу (обычно C:\Users\{Username}\.ssh\{filename}
). Открываем публичный ключ и меняем в нём имя и адрес на имя пользователя и адрес сервера соответственно. Копируем всю строку в буфер.
На сервере из домашней директории пользователя выполняем команду (вставьте PUBLIC_KEY в указанное место и уберите фигурные скобки): echo "{PUBLIC_KEY}" > .ssh/authorized_keys
— она создаст файл и вставит туда ключ.
Применяем изменения: sudo systemctl restart sshd
.
Firewall
Firewall — утилита для контроля входящего и исходящего трафика. Она решает, может произойти соединение или нет.
sudo ss -tulnp
. Список открытых портов можно будет посмотреть командой sudo ufw status
Firewall уже установлен, осталось настроить правила и активировать его. На данный момент требуется только порт для SSH — откроем его и ещё парочку на будущее:
|
|
Запрещаем все входящие подключения и разрешаем все исходящие:
|
|
Включаем firewall: sudo ufw enable
.
Готово. С этого момента, если понадобится открыть какой-либо порт, введите команду: sudo ufw allow {port}/tcp
.
Главная панель
С настройкой сервера немало повозились, но оно того стоило.
А теперь перейдём к более интересному, а именно к настройке панели. В Marzban есть главный сервер, управляющий остальными нодами. С его установки и начнём.
Есть несколько вариантов установки, разберём самый простой — скриптом. Также есть возможность выбрать базу данных, которая будет использоваться для панели, лично я предпочитаю MySQL. Итак:
-
sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install
— SQLite -
sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install --database mysql
— MySQL -
sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install --database mariadb
— MariaDB
При успешной установке вы увидите следующее в конце логов. Ctrl + c

Далее требуется создать пользователя-админа, который будет управлять панелью. Рекомендуемый способ сделать это — через CLI: sudo marzban cli admin create --sudo
.

Получаем сертификат мощно и быстро
Отредактируем некоторые переменные панели в конфиге: sudo nano /opt/marzban/.env
:
Необходимо поменять следующие параметры:
UVICORN_PORT
на любой, но не 443 (на нём будет VLESS)UVICORN_SSL_CERTFILE = "/var/lib/marzban/certs/fullchain.pem"
UVICORN_SSL_KEYFILE = "/var/lib/marzban/certs/privkey.pem"
DASHBOARD_PATH
на любой посложнееXRAY_SUBSCRIPTION_URL_PREFIX = "https://{DOMAIN}:{UVICORN_PORT}"
XRAY_SUBSCRIPTION_PATH
на любой посложнее
Также можно настроить многие другие вещи. За подробностями обратитесь к документации
Не забываем открыть порт: sudo ufw allow <UVICORN_PORT>/tcp
и перезапустить панель: sudo marzban restart
.
🎉 Поздравляю! Панель доступна по адресу: “https://{DOMAIN}:{UVICORN_PORT}/{DASHBOARD_PATH}”.

Подключения и пользователи
Входим в панель установленными логином/паролем. Изначально в Marzban недоступен VLESS, поэтому его нужно активировать. Отредактируем конфиг xray, нажав на значок шестерёнки в правом верхнем углу. В имеющемся конфиге уберём содержимое блока inbounds (если они не требуются) и вставим вместо них следующее:
|
|
Нужно также задать некоторые уникальные параметры. Открываем терминал и вбиваем sudo docker exec marzban-marzban-1 xray x25519
— строку после “Private key: " вставляем в значение “privateKey” конфига выше. Тоже самое делаем для “shortIds”: вбиваем openssl rand -hex 8
и вставляем результат в любую из строк.
Получится что-то такое:

Применим изменения: кнопка “Сохранить” -> перезагружаем страницу (F5).
Создание клиента
Создать клиента очень просто. Нужно лишь нажать на синюю кнопку “создать” -> выбрать vless tcp reality -> выбрать в качестве flow xtls-rprx-vision -> дать пользователю имя. Готово!

Ноды
А теперь то, ради чего все мы здесь собрались… подключение ноды!
На самом деле, процесс довольно тривиальный. Во-первых, очевидно, у нас уже должен быть свободный сервер, который станет нодой и, соответственно, локацией в нашей подписке. Откроем имеющуюся панель Marzban -> ≡ бар-меню -> “Настройки узлов” -> “Добавить новый узел Marzban”.
Копируем сертификат, скрывающийся под 👁 иконкой глаза, даём имя ребёнку, растим дерево..🌱 нет, не так. Даём имя ноде, вбиваем её IP, прописываем желаемые порты (по умолчанию оставлять не стоит), устанавливаем коэффициент использования и отмечаем галочкой “Добавить этот узел, как…”.

Переходим к серверу будущей ноды. Вставляем скрипт: sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban-node.sh)" @ install
По ходу выполнения нас попросят вбить скопированный сертификат и порты. Выполняем. Также соглашаемся на использование REST API.

Не забываем открыть необходимые порты:
|
|
Возвращаемся к главной панели и жмём “Добавить узел”. Ждём успешного соединения. Congrats!

Если потребуется изменить конфиг в будущем, достаточно вбить sudo marzban-node edit
, а после внесений всех изменений перезапустить ноду: sudo marzban-node restart
.
Сертификат
Чтобы получить автообновляемый сертификат, который находится в нужной для marzban папке, воспользуемся acme.sh.
|
|
The end
Очередной гайд подошёл к концу! Надеюсь, мой репит документации на русском помог вам быстрее разобраться, а если не особо — задавайте вопросы в комментариях. Спасибо, что читаете!
