- Сервер на Linuxлюбой VPS с публичным IP, 1–2 ядра, ~512 МБ RAM
- root-доступнужны сетевые права: TUN, NAT, привязка к порту
Установка и настройка Qeli
Полное руководство: от сборки сервера до сценариев использования. Все команды и конфиги — рабочие, для Linux-сервера с публичным IP.
Что понадобится
- Rustдля сборки из исходников — либо готовый бинарь / .deb
- Клиентпод вашу платформу: Linux, Windows, macOS или Android
Сборка и установка
Соберите единый бинарь сервера-и-клиента из исходников и положите его в /usr/bin. Один и тот же бинарь работает и как сервер, и как клиент, и как утилита управления.
$ git clone https://github.com/litvinovtd/qeli.git
$ cd qeli && cargo build --release
$ sudo install -Dm755 target/release/qeli /usr/bin/qeli
$ sudo install -Dm644 config/server.conf /etc/qeli/server.conf
Конфигурация сервера
Откройте /etc/qeli/server.conf — единый текстовый формат (flat-INI). Минимальный профиль reality-tls на 443 с выходом в интернет:
[auth]
require_client_key_proof = false
[profile:main]
bind.address = 0.0.0.0
bind.port = 443
bind.transport = tcp
obf.mode = reality-tls
tun.address = 10.0.0.1
tun.netmask = 255.255.255.0
pool.cidr = 10.0.0.0/24
routing.nat.enabled = true # выпуск клиентов в интернет
dns.enabled = true # резолвер в туннеле
Глобальные секции — [auth], [web], [logging]; каждый интерфейс — это [profile:имя]. Можно поднять несколько профилей сразу (TCP и UDP на разных портах). Комментарии — только на отдельной строке.
Транспортный режим задаётся одной строкой obf.mode: reality-tls (основной), fake-tls, obfs (нужен obf.obfs_key) или plain. Для UDP-профиля включите obf.quic.enabled = true и bind.transport = udp.
Запуск как служба
Через systemd (рекомендуется): служба qeli работает под отдельным пользователем с минимальными правами (только сетевые capabilities), сама перезапускается при сбое.
$ sudo systemctl enable --now qeli
$ journalctl -u qeli -f # смотреть логи
# либо вручную для проверки (foreground):
$ sudo qeli server --config /etc/qeli/server.conf
Пример вывода при старте — одна служба поднимает несколько режимов сразу:
$ qeli server --config /etc/qeli/server.conf
[info] qeli 0.7.1 · запуск 5 профилей
[info] Profile 'reality' tcp/443 reality-tls · основной
[ ok ] REALITY real-TLS termination enabled
[info] Profile 'tls' tcp/8443 fake-tls · запасной
[info] Profile 'obfs' tcp/8444 obfs + WebSocket
[info] Profile 'plain' tcp/8445 raw · доверенные сети
[info] Profile 'udp' udp/4443 QUIC-masking
[ ok ] web admin → https://0.0.0.0:8080
При старте сервер печатает поднятые профили и адрес веб-панели. HUP (или systemctl reload qeli) перечитывает конфиг без разрыва сессий.
Ключ сервера и пиннинг
Покажите публичный ключ каждого профиля — клиенты «пиннят» его, чтобы исключить подключение к подменному серверу (анти-MITM):
$ qeli show-identity --config /etc/qeli/server.conf
main a3f5…d290 # → в поле key у клиента
Скопируйте ключ в поле key клиента. Чтобы отклонять непиненных клиентов и скрыть ключ от сканеров — поставьте require_client_key_proof = true. Сменить ключ: qeli rotate-identity <профиль> (после этого клиенты обновляют key).
Заведение пользователей
Команда add-client хэширует пароль (Argon2id) и дописывает пользователя в файл. С флагами --link --host она сразу печатает ссылку qeli:// — её можно показать QR-кодом и импортировать в приложение одним нажатием.
$ qeli add-client alice --link --host vpn.example.com:443
password: x7Qp…m2K # сгенерирован, печатается один раз
qeli://alice:x7Qp…m2K@vpn.example.com:443?proto=tcp&mode=reality-tls&key=a3f5…d290
# с ограничениями:
$ qeli add-client bob --password 's3cret' --profiles main --max-sessions 2
Пароль можно задать (--password) или сгенерировать автоматически — он печатается один раз и не восстанавливается (хранится только хеш). Ограничения: --profiles (доступ к профилям), --static-ip (фиксированный IP в туннеле), --max-sessions.
Подключение клиента
Приложение (телефон / десктоп): импортируйте ссылку qeli:// или отсканируйте QR — сервер, режим и закреплённый ключ подтянутся сами.
CLI-клиент (Linux): заполните client.conf и запустите:
[qeli]
server = vpn.example.com:443
proto = tcp
mode = reality-tls
user = alice
pass = ••••••••
key = a3f5…d290 # ключ из show-identity
$ sudo qeli client --config /etc/qeli/client.conf
Поля proto, mode и (для obfs) obfs_key должны совпадать с профилем сервера. Маршруты, DNS и MTU сервер выдаёт сам при подключении — их в клиенте указывать не нужно.
Выход в интернет через сервер
Весь трафик устройства идёт через сервер и выходит в интернет с его IP — классический VPN: приватность в публичных сетях, единый внешний адрес, ничего не «утекает» мимо. Это поведение по умолчанию для полного туннеля.
routing.nat.enabled = true # MASQUERADE клиентов в интернет
dns.enabled = true # резолвер в туннеле
# клиент по умолчанию заворачивает весь трафик — доп. настроек не нужно
Доступ к сети за сервером
Дотянуться из любой точки до локальной сети за сервером — NAS, камеры, принтеры, внутренние сервисы. Сервер раздаёт маршрут к подсети повторяемым ключом route, и клиент применяет его к туннелю автоматически.
routing.forward_private = true # форвардинг в приватные сети
route = 192.168.1.0/24 gateway=10.0.0.1 # подсеть за сервером
Маршрут можно выдать и индивидуально — тем же ключом route в секции [user:имя] (переопределяет глобальные). Так, например, подрядчик получит доступ только к одной подсети.
Объединение сетей (site-to-site)
Соедините целые сети нескольких площадок так, чтобы их узлы видели друг друга — связать офисы, филиалы, домашнюю и рабочую сеть. На каждой площадке ставится шлюз с qeli client и фиксированным IP в туннеле; сервер раздаёт маршруты к подсетям площадок, и трафик ходит между сетями через туннель на уровне L3.
routing.forward_private = true
route = 10.20.0.0/24 gateway=10.0.0.1 # сеть площадки A
route = 10.30.0.0/24 gateway=10.0.0.1 # сеть площадки B
$ qeli add-client gw-a --static-ip 10.0.0.10
# /etc/qeli/client.conf на шлюзе площадки A:
[qeli]
route_local = true # завернуть локальную подсеть в туннель
На хостах-шлюзах включается IP-форвардинг (net.ipv4.ip_forward=1). Сервер выступает «хабом», маршрутизируя трафик между подсетями площадок. Адресацию площадок держите непересекающейся.
Раздельный туннель (split-tunnel)
В туннель идёт только то, что нужно — например, рабочие подсети, — а остальной трафик клиента идёт напрямую. Достаточно раздать конкретные маршруты и не включать полный выход в интернет.
routing.nat.enabled = false # без полного выхода в интернет
route = 10.50.0.0/16 gateway=10.0.0.1 # только рабочие подсети
Команды управления
Работают на лету через управляющий сокет, без перезапуска сервера:
qeli list-clientsкто сейчас подключёнqeli kick <user>отключить пользователяqeli disable-user <user>заблокировать (отключить + запретить реконнект)qeli enable-user <user>снова разрешить входqeli set-bandwidth <user> <mbps>лимит скорости (0 = без лимита)qeli show-routes <user>маршруты пользователяqeli rotate-identity <profile>сменить ключ сервера у профиляУправление через браузер
Включите секцию [web] — и получите панель: пользователи, профили, генерация ссылок и QR прямо из браузера, с защитой входа (Argon2id + same-origin CSRF). По умолчанию слушает только localhost — наружу выставляйте через свой reverse-proxy с TLS.
[web]
enabled = true
bind = 127.0.0.1
port = 8080
username = admin
password_hash = $argon2id$…