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

/articles/marzban/images/feature.png

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

Статья-гайд о том, как создать свой VPN-сервис на основе веб-панели Marzban.

Предупреждение
Инструкции актуальны только для Ubuntu 22.04 и могут незначительно отличаться для других версий данного дистрибутива

Возможно, вы уже пользовались другой панелью управления прокси-сервером — 3x-ui. Если так, то, думаю, знаете о её главном минусе: объединить несколько 3x-ui и управлять ими централизованно не так-то просто. Приходится придумывать костыльные решения, например, агрегаторы.

Но есть ещё один выход: найти другую панель, умеющую управлять сразу несколькими прокси-серверами. Такие есть, и имя одной из них — Marzban. О ней сегодня и поговорим. Marzban позволяет связать множество серверов из разных стран, благодаря чему подписочные ссылки становятся невероятно удобными.

Настройка сервера

Как арендовать сервер, описывать здесь уже не буду. По опыту юзеров могу сказать, что как и для 3x-ui, хватит 1 ядра, 1гб RAM и 10гб дискового пространства. Есть вероятность найти для себя хороших хостеров по следующим ссылкам: тык; тык.

Можете также посоветовать проверенных провайдеров VPS в комментариях! 👇

MobaXterm

Чтобы было удобнее работать с серверами, рекомендую установить MobaXterm: она умеет запоминать данные сессий, а значит вам не придётся вводить каждый раз команду ssh... вручную.

Инфо
В бесплатной версии MobaXterm можно сохранять до 14 сессий

Для подключения нажимаем на Sessions -> New session -> SSH. В “Remote host” нужно ввести IP сервера, в “Specify username” — пишем root, порт оставляем как есть. Имя сессии можно изменить в разделе “Bookmark settings” в “Session name”. Жмём “OK”.
P.S. Когда перейдёте на сессию, использующую ключ для авторизации, нажмите “Advanced SSH settings” -> “Use private key” -> выберите путь до ключа.

Инфо
Чтобы скопировать содержимое в MobaXterm, достаточно просто выделить текст
/articles/marzban/images/mobaxterm.png

Обновления

Переходим непосредственно к настройке сервера. В целом большинство из представленных пунктов является важной БАЗОЙ для безопасности вашего VPS. Пренебрегать какими-либо из них не рекомендуется, если вы абсолютно не уверены в своих действиях.

Начнём с обновления системы, а также скачаем нужные инструменты и включим автоматическое обновление пакетов, связанных с безопасностью ОС:

1
2
3
4
apt update && apt upgrade -y
apt install nano git curl ufw -y
apt install unattended-upgrades
nano /etc/apt/apt.conf.d/20auto-upgrades

В открывшийся файл вставить:

1
2
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Инфо
Чтобы закрыть файл в редакторе nano, выполните: 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-65535
  • PermitRootLogin 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 — откроем его и ещё парочку на будущее:

1
2
3
sudo ufw allow {port}/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Запрещаем все входящие подключения и разрешаем все исходящие:

1
2
sudo ufw default deny incoming
sudo ufw default allow outgoing

Включаем firewall: sudo ufw enable.

Готово. С этого момента, если понадобится открыть какой-либо порт, введите команду: sudo ufw allow {port}/tcp.


Главная панель

С настройкой сервера немало повозились, но оно того стоило.
А теперь перейдём к более интересному, а именно к настройке панели. В Marzban есть главный сервер, управляющий остальными нодами. С его установки и начнём.

Инфо
Вся самая актуальная информация по Marzban находится на github разработчика и в документации

Есть несколько вариантов установки, разберём самый простой — скриптом. Также есть возможность выбрать базу данных, которая будет использоваться для панели, лично я предпочитаю MySQL. Итак:

  1. sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install — SQLite

  2. sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install --database mysql — MySQL

  3. sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install --database mariadb — MariaDB

При успешной установке вы увидите следующее в конце логов. Ctrl + c

/articles/marzban/images/installation_1.png

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

/articles/marzban/images/installation_2.png

Получаем сертификат мощно и быстро

Отредактируем некоторые переменные панели в конфиге: 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}”.

/articles/marzban/images/marzban.png

Подключения и пользователи

Входим в панель установленными логином/паролем. Изначально в Marzban недоступен VLESS, поэтому его нужно активировать. Отредактируем конфиг xray, нажав на значок шестерёнки в правом верхнем углу. В имеющемся конфиге уберём содержимое блока inbounds (если они не требуются) и вставим вместо них следующее:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    {
      "tag": "VLESS TCP REALITY",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "tcpSettings": {},
        "security": "reality",
        "realitySettings": {
          "show": false,
          "dest": "google.com:443",
          "xver": 0,
          "serverNames": [
            "google.com",
            "www.google.com"
          ],
          "privateKey": "",
          "shortIds": [
            "",
            ""
          ]
        }
      },
      "sniffing": {
        "enabled": false,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      }
    }

Нужно также задать некоторые уникальные параметры. Открываем терминал и вбиваем sudo docker exec marzban-marzban-1 xray x25519 — строку после “Private key: " вставляем в значение “privateKey” конфига выше. Тоже самое делаем для “shortIds”: вбиваем openssl rand -hex 8 и вставляем результат в любую из строк.

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

/articles/marzban/images/xray_config.png

Применим изменения: кнопка “Сохранить” -> перезагружаем страницу (F5).

Создание клиента

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

/articles/marzban/images/marzban_user.png

Ноды

А теперь то, ради чего все мы здесь собрались… подключение ноды!

На самом деле, процесс довольно тривиальный. Во-первых, очевидно, у нас уже должен быть свободный сервер, который станет нодой и, соответственно, локацией в нашей подписке. Откроем имеющуюся панель Marzban -> ≡ бар-меню -> “Настройки узлов” -> “Добавить новый узел Marzban”.

Копируем сертификат, скрывающийся под 👁 иконкой глаза, даём имя ребёнку, растим дерево..🌱 нет, не так. Даём имя ноде, вбиваем её IP, прописываем желаемые порты (по умолчанию оставлять не стоит), устанавливаем коэффициент использования и отмечаем галочкой “Добавить этот узел, как…”.

Инфо
Параметр “Коэффициент использования” нужен, чтобы множить количество использованного трафика на него. Так, если пользователь потратил 2гб, а коэффициент использования установлен в 1.4, после объёмных вычислений получаем 2.8гб потрачено. Пригождается это, например, для балансировки стоимости разных VPS и их использованного траффика
/articles/marzban/images/new_node.png

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

По ходу выполнения нас попросят вбить скопированный сертификат и порты. Выполняем. Также соглашаемся на использование REST API.

/articles/marzban/images/marzban_node.png

Не забываем открыть необходимые порты:

1
2
sudo ufw allow {SERVICE_PORT}/tcp
sudo ufw allow {XRAY_API_PORT}/tcp

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

/articles/marzban/images/marzban_node_connected.png

Если потребуется изменить конфиг в будущем, достаточно вбить sudo marzban-node edit, а после внесений всех изменений перезапустить ноду: sudo marzban-node restart.


Сертификат

Чтобы получить автообновляемый сертификат, который находится в нужной для marzban папке, воспользуемся acme.sh.

Инфо
acme.sh — это обыкновенный скрипт, позволяющий без труда получать сертификаты от разных центров различными способами
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
su -
apt install curl socat cron -y
curl https://get.acme.sh | sh

# Перезаходим на сервер
su -
acme.sh --set-default-ca --server letsencrypt  # меняет центр сертификации на Let's Encrypt
acme.sh --issue --standalone -d {DOMAIN}  # подписывает сертификат
mkdir /var/lib/marzban/certs
acme.sh --install-cert -d {DOMAIN} --key-file /var/lib/marzban/certs/privkey.pem --fullchain-file /var/lib/marzban/certs/fullchain.pem  # перемещает цепочку сертификатов и ключ в нужную папку

su - {username}

The end

Очередной гайд подошёл к концу! Надеюсь, мой репит документации на русском помог вам быстрее разобраться, а если не особо — задавайте вопросы в комментариях. Спасибо, что читаете!

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