Установка серверной части AmneziaWG на Ubuntu/Debian VPS

В прошлой статье мы разобрали, как AmneziaWG обманывает DPI с помощью шумовых пакетов, мимикрии под QUIC и шифрования заголовков. Теперь — практика. Будем поднимать сервер. Хорошая новость: вам не нужен мощный VPS. AmneziaWG работает на модуле ядра Linux, а значит, потребляет минимум ресурсов. Хватит самого дешёвого сервера за 2–4 $ в месяц с 1 vCPU и 512 МБ ОЗУ. Если планируете подключать много клиентов или гонять 4K-видео — берите 1 ГБ ОЗУ для комфорта. Что понадобится VPS с Ubuntu 24.04 LTS, Ubuntu 22.04 или Debian 12/13. Поддерживаются и другие версии, но на этих всё проверено. Доступ по SSH с правами root (или sudo). 2 ГБ свободного места на диске — минимум. Лучше 3+. 15–20 минут времени. 💡 Важно: В отличие от Marzban, для AmneziaWG не нужен домен, SSL-сертификат или reverse-proxy. Сервер работает на уровне ядра и общается с клиентами напрямую по UDP. Это одновременно и проще, и безопаснее — меньше поверхности для атаки. Шаг 1. Подготовка сервера ...

🧩 Интеграция Marzban с Caddy: HTTPS и красивый веб-интерфейс

 В прошлых статьях мы настроили Marzban и разобрались с подписками. Но есть один нюанс, который часто упускают: по умолчанию панель Marzban работает по HTTP. Это значит, что пароль администратора передаётся по сети в открытом виде. А без HTTPS не будут работать ссылки-подписки, QR-коды и Deep Links. Сегодня мы решим эту проблему раз и навсегда — с помощью Caddy.


🎯 Вместо введения: почему без HTTPS никуда

Представьте, что вы оставляете ключи от квартиры под ковриком у двери. Удобно? Да. Безопасно? Нет. То же самое с HTTP. Когда вы входите в панель Marzban по HTTP, ваш логин и пароль передаются по сети в открытом виде. Любой, кто находится в той же сети (например, в кафе или аэропорту), может их перехватить.

HTTPS решает эту проблему, шифруя весь трафик между вашим браузером и сервером. Но чтобы включить HTTPS, нужен SSL-сертификат. И тут начинается самое интересное.

Традиционный путь: получить сертификат через Let's Encrypt → настроить Nginx → прописать кучу директив → настроить автообновление → следить, чтобы сертификат не истёк. Звучит утомительно? Именно поэтому существует Caddy.


🧠 Часть 1. Что такое Caddy и почему он лучше Nginx

Коротко о главном

Caddy — это веб-сервер с открытым исходным кодом, написанный на Go. Его главная особенность — автоматический HTTPS из коробки.

Вы просто пишете в конфиге:

example.com {

    reverse_proxy localhost:8000

}

И Caddy сам:

  1. Получает SSL-сертификат от Let's Encrypt
  2. Настраивает HTTPS на порту 443
  3. Перенаправляет HTTP на HTTPS
  4. Продлевает сертификат перед истечением срока

Никаких certbot, acme.sh, cron и ручных настроек. Всё автоматически.

Caddy vs Nginx: сравнение

📋 Сравнение Caddy и Nginx

Критерий Nginx Caddy
Автоматический HTTPS ❌ Нужен Certbot ✅ Встроено
Настройка HTTPS 20+ строк 3 строки
Продление сертификата Вручную через cron Автоматически
HTTP → HTTPS редирект Нужно прописывать Автоматически
Синтаксис конфига Сложный Простой
Потребление памяти ~50 МБ ~30 МБ
Скорость Высокая Сопоставимая

Таблица обновлена в рамках серии статей о WireGuard и Marzban

Главное преимущество Caddy — он убирает 80% рутинных операций, связанных с сертификатами. Для небольшого проекта это идеальный выбор.


🛠 Часть 2. Установка Caddy

Требования

  • Сервер с Ubuntu 22.04 / Debian 12
  • Домен, указывающий на IP сервера (A-запись)
  • Открытые порты 80 и 443

Установка на Ubuntu/Debian

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

sudo apt update

sudo apt install caddy

После установки Caddy автоматически запустится и будет слушать порты 80 и 443.

Проверка:

sudo systemctl status caddy

Вы должны увидеть active (running).


🔧 Часть 3. Базовая настройка Caddy

Где находится конфиг

Главный конфигурационный файл — /etc/caddy/Caddyfile. Именно здесь мы будем прописывать все правила.

Минимальный Caddyfile для Marzban

Откройте файл:

sudo nano /etc/caddy/Caddyfile

Замените его содержимое на:

panel.example.com {

    reverse_proxy localhost:8000

}

Что это значит:

  • panel.example.com — ваш домен (или поддомен)
  • reverse_proxy localhost:8000 — Caddy будет проксировать все запросы на локальный порт 8000, где работает Marzban

Сохраните файл и перезагрузите Caddy:

sudo systemctl reload caddy

Что произойдёт:

  1. Caddy увидит новый домен
  2. Автоматически запросит SSL-сертификат у Let's Encrypt
  3. Настроит HTTPS
  4. Начнёт проксировать трафик на Marzban

Проверка:

curl -I https://panel.example.com

Должен быть HTTP/2 200 и заголовок server: Caddy.


🚀 Часть 4. Продвинутая настройка: подписки и API

Если вы хотите, чтобы панель, подписки и API работали через один домен, можно использовать path-based routing.

Пример Caddyfile

panel.example.com {

    # Подписки Marzban

    handle /sub/* {

        reverse_proxy localhost:8000

    }

   

    # API Marzban

    handle /api/* {

        reverse_proxy localhost:8000

    }

   

    # Основной статический сайт

    handle {

        root * /opt/vpn-service/static

        file_server

    }

}

Как это работает:

  • Запросы к https://panel.example.com/sub/... → идут в Marzban
  • Запросы к https://panel.example.com/api/... → идут в Marzban
  • Все остальные запросы → отдаются из папки /opt/vpn-service/static

Использование Unix-сокета вместо порта

Marzban может работать через Unix-сокет — это быстрее и безопаснее, чем TCP-порт.

В Caddyfile:

panel.example.com {

    reverse_proxy unix//var/lib/marzban/marzban.socket

}

В .env Marzban нужно указать:

UVICORN_UDS = /var/lib/marzban/marzban.socket

XRAY_SUBSCRIPTION_URL_PREFIX = https://panel.example.com


🔒 Часть 5. Безопасность: что можно улучшить

1. Скрыть заголовок Server

По умолчанию Caddy показывает Server: Caddy. Злоумышленники могут использовать эту информацию. Уберите заголовок:

panel.example.com {

    header {

        -Server

    }

    reverse_proxy localhost:8000

}

2. Добавить HSTS

HSTS заставляет браузер всегда использовать HTTPS:

panel.example.com {

    header {

        Strict-Transport-Security "max-age=31536000; includeSubDomains"

    }

    reverse_proxy localhost:8000

}

3. Ограничить доступ по IP (опционально)

Если панель нужна только вам, можно ограничить доступ:

panel.example.com {

    @allowed {

        remote_ip 203.0.113.5

        remote_ip 127.0.0.1

    }

    handle @allowed {

        reverse_proxy localhost:8000

    }

    handle {

        respond "Access Denied" 403

    }

}

🔍 Что такое @allowed

В Caddy @allowed — это именованный матчер (named matcher). Это способ дать имя набору условий, чтобы потом ссылаться на него в других директивах.

Синтаксис:

caddy

@имя_матчера {

    условие1

    условие2

}

В нашем случае имя — allowed. Внутри — два условия remote_ip.


🔍 Что делает remote_ip

remote_ip — это условие, которое проверяет IP-адрес клиента, отправившего запрос.

caddy

remote_ip 203.0.113.5

remote_ip 127.0.0.1

Это значит: «запрос пришёл с одного из этих IP-адресов».

  • 203.0.113.5 — пример публичного IP-адреса. В документации этот адрес зарезервирован для примеров (TEST-NET-3). В реальной конфигурации здесь должен быть ваш личный IP или IP офиса.
  • 127.0.0.1 — это localhost. То есть запросы с самого сервера (например, при локальном обращении) тоже разрешены.

🔍 Как это работает вместе

Сам по себе матчер @allowed ничего не делает — он просто определяет условие. Чтобы он заработал, его нужно использовать в директивах handle, respond, reverse_proxy и т.д.

Полный пример:

caddy

panel.example.com {

    @allowed {

        remote_ip 203.0.113.5

        remote_ip 127.0.0.1

    }

 

    handle @allowed {

        reverse_proxy localhost:8000

    }

 

    handle {

        respond "Access Denied" 403

    }

}

Что происходит:

  1. Caddy получает запрос к panel.example.com.
  2. Срабатывает матчер @allowed: проверяется IP клиента.
  3. Если IP совпадает с одним из указанных (203.0.113.5 или 127.0.0.1) → выполняется handle @allowed → запрос проксируется на Marzban (порт 8000).
  4. Если IP не совпадает → выполняется второй handle (без условия) → сервер возвращает 403 Access Denied.

🎯 Зачем это нужно

Это простая и надёжная защита панели администратора:

  • Панель Marzban доступна только с вашего IP.
  • Все остальные (боты, сканеры, случайные люди) получают 403 Forbidden.
  • Даже если кто-то узнает URL панели, он не сможет даже увидеть страницу входа.

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


📊 Часть 6. Сравнение: HTTP vs HTTPS

📋 Сравнение HTTP и HTTPS

Критерий HTTP HTTPS
Шифрование ❌ Нет ✅ Да
Пароль в открытом виде ✅ Да ❌ Нет
QR-коды работают ❌ Нет ✅ Да
Подписки работают ❌ Нет ✅ Да
Доверие браузера ❌ «Небезопасно» ✅ «Защищено»
SEO ❌ Штраф ✅ Бонус

Таблица обновлена в рамках серии статей о WireGuard и Marzban


🧪 Часть 7. Проверка и отладка

Проверить сертификат

curl -vI https://panel.example.com 2>&1 | grep -E "issuer|expire"

Посмотреть логи Caddy

journalctl -u caddy -n 50 --no-pager

Проверить синтаксис Caddyfile

caddy validate --config /etc/caddy/Caddyfile

Перезагрузить Caddy после изменений

sudo systemctl reload caddy


💎 Часть 8. Что мы узнали?

  • Caddy — это веб-сервер с автоматическим HTTPS.
  • Он сам получает и продлевает SSL-сертификаты, избавляя от рутины.
  • Настройка Caddy для Marzban занимает 3 строки.
  • Path-based routing позволяет раздавать панель, подписки и статику через один домен.
  • Unix-сокет быстрее и безопаснее TCP-порта.

🔜 Что дальше?

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

Оставайтесь на связи! 🚀


📚 Источники

Материалы подготовлены на основе открытых источников:

  1. Marzban Docs — SSL activation with Caddy
  2. GitHub — Gozargah/Marzban — Issue #1969: Reverse proxy path isolation
  3. Caddy Documentation — Automatic HTTPS
  4. OneUptime Blog — How to Set Up Caddy with Automatic HTTPS
  5. Pikabu — Marzban: обзор панели управления
  6. Tencent Cloud — Caddy vs Nginx: production guide
  7. HostEase — Caddy reverse proxy deployment

 

Комментарии

Популярные сообщения

🧬 ChaCha20 и Curve25519: Криптография под капотом WireGuard

Немного о том, зачем это нужно.

🔌 L2TP: протокол, который объединил лучшее от двух миров

⚡ ИИ-помощник (на OpenRouter)

Спросите про VPN, протоколы или настройку серверов.