Развёртывание

Установка и настройка Qeli

Основные команды и файлы обновлены для выпущенной Qeli 0.8.1 beta. Руководство охватывает установку, безопасное обновление сервера и приложений, маршрутизацию, панель, резервные копии и диагностику.

Выберите платформу

Короткие инструкции по способу установки

Эта страница остаётся полным руководством. Для быстрого старта откройте отдельную инструкцию под свою платформу — в ней только нужные требования, команды и проверки.

Быстрый старт

Установка одной командой

На чистом сервере Debian 12+ / Ubuntu 22.04+ выполните от root — скрипт развернёт reality-tls сервер на :443 целиком: поставит зависимости и последний .deb из релизов, запишет конфиг с full-tunnel NAT, сгенерирует ключ сервера, заведёт пять пользователей с готовыми ссылками qeli:// и запустит службу.

терминал сервера
# 1. скачать скрипт
$ curl -fsSLO https://raw.githubusercontent.com/litvinovtd/qeli/main/install-qeli-server.sh
# 2. прочитать его — и только потом запускать от root
$ less install-qeli-server.sh
$ bash install-qeli-server.sh

Чтобы задать адрес подключения явно (IP, домен или IPv6), передайте его аргументом: bash install-qeli-server.sh vpn.example.com — иначе публичный адрес определится автоматически. Профиль и порт задаются переменными QELI_PROFILE=reality-tls|fake-tls|udp-quic и QELI_PORT=<1-65535>. Готовые строки подключения появятся в /etc/qeli/client-links/.
Почему не curl … | bash: скрипт работает от root, поэтому сначала скачайте и прочитайте его.
Что меняется в системе: включаются forwarding и MSS clamp, применяются BBR/fq, TCP/PMTU и socket-buffer sysctl. Панель остаётся на HTTPS 127.0.0.1:8080; открывайте её через SSH-туннель. Для воспроизводимости используйте файл из тега v0.8.1.

Обновление сервера

Для сервера, установленного из .deb, используйте штатный updater. Он обновляет пакет и бинарник, сохраняет конфигурацию и при неудачном старте пытается откатить пакет. Перед запуском сделайте резервную копию /etc/qeli и /var/lib/qeli.

терминал сервера
$ sudo qeli check-config --config /etc/qeli/server.conf
$ curl -fsSLO https://raw.githubusercontent.com/litvinovtd/qeli/main/update-qeli-server.sh
$ less update-qeli-server.sh
$ sudo bash update-qeli-server.sh

Если переходите с версии до 0.7.15, удалите устаревший tun.netmask: единственным источником подсети теперь служит pool.cidr. Затем выполните sudo qeli check-config. Обновление перезапускает службу и разрывает активные сессии; клиенты подключатся снова автоматически. Скрипт запускается от root — скачайте и прочитайте его перед выполнением.

Проверка перед обновлением

0.8.1 опубликована как beta. До замены бинаря сделайте проверяемую резервную копию, выполните qeli check-config для сервера и каждого клиентского профиля, а 17 payload-файлов релиза сверяйте с SHA256SUMS.

проверка перед заменой рабочей установки
$ sudo qeli check-config --config /etc/qeli/server.conf
$ sudo qeli check-config --client --config /etc/qeli/clients/<profile>.conf

Первая команда проверяет серверный конфиг и базу пользователей; вторую повторите для каждого включённого клиентского профиля. Исправьте ошибки маршрутов и IPv6 до restart. При обновлении приложения используйте вложенный native core 0.8.1 — вручную подменять его старой версией нельзя.

Официальный релиз 0.8.1 →

Текущий выпущенный релиз · beta

Обновление до Qeli 0.8.1

Сначала обновите сервер, проверьте конфигурацию и перезапустите службу. Затем установите новые приложения целиком вместе с вложенными native cores. UDP batching включается автоматически; NDP proxy и большие route_file требуют осознанной настройки.

Порядок обновления: сервер → проверка → restart → приложения. Не смешивайте UI 0.8.1 с вручную скопированным старым native core. Сервер сохраняет совместимость с прежними peers, но свойства подключения и исправления platform lifecycle корректны только у полного комплекта 0.8.1.
server · validate and restart
$ sudo qeli check-config --config /etc/qeli/server.conf
$ sudo systemctl restart qeli
$ qeli --version
$ sudo journalctl -u qeli -n 100 --no-pager

UDP batching не требует нового ключа. Linux и Android автоматически используют bounded recvmmsg/sendmmsg пачки до 32 без дополнительного таймера накопления; порядок пакетов, roaming, pacing и PMTU fallback сохраняются.

Перед импортом больших списков проверьте новый формат route_file: ключ можно повторять, поддерживаются CIDR и OpenVPN route-строки, общий лимит — 250 000. Нечитаемый файл, битая маска или превышение лимита теперь останавливают подключение fail-closed.

Android и iOS теперь ждут реально пригодный Wi‑Fi/LTE carrier и не тратят backoff в состоянии без сети. Установите приложение 0.8.1 целиком; ручное отключение остаётся окончательным и не должно запускать автоматическое восстановление.

Оставьте routing.ipv6.ndp_proxy = off, если провайдер маршрутизирует клиентский префикс на WAN-адрес сервера. Для on-link префикса сначала проверьте Neighbor Solicitation и используйте auto; required включайте после проверки интерфейса и CAP_NET_RAW.

Контейнер

Запуск в Docker

Контейнер совмещает обе роли — server и client — со всеми зависимостями внутри. Он работает на Linux-хостах и в контейнерных рантаймах роутеров (MikroTik RouterOS v7, OpenWrt). Чтобы установка 0.8.1 не зависела от состояния GHCR :latest, инструкция собирает образ из закреплённого тега v0.8.1 и запускает его через Docker Compose:

терминал сервера
# получить исходники опубликованной версии 0.8.1:
$ git clone --branch v0.8.1 --depth 1 https://github.com/litvinovtd/qeli.git
$ cd qeli
# собрать локальный образ из закреплённого тега:
$ docker buildx build -f release/docker/Dockerfile -t qeli:latest --load .
$ cp release/docker/docker-compose.yml .
# запустить сервер:
$ docker compose -f docker-compose.yml up -d qeli-server

Контейнеру нужны /dev/net/tun и capabilities NET_ADMIN, NET_RAW, NET_BIND_SERVICE (без --privileged); для серверного NAT — net.ipv4.ip_forward=1. Том /etc/qeli обязательно сохраняйте — там ключ сервера и пользователи. Тот же образ запускается и как клиент-шлюз (client); для клиента в контейнере задайте dns = off. Полное руководство (Linux и MikroTik) — в release/docker/README.md.

Клиенты

Скачать клиент 0.8.1

Берите файлы только из официального релиза: QeliWin-standalone.exe либо QeliWin-net-required.exe для Windows, Qeli-macOS-universal.zip для macOS, qeli-android-0.8.1.apk для Android и qeli-linux-amd64 либо qeli_0.8.1_amd64.deb для Linux. Обновляйте приложения вместе с вложенными native cores; готовой iOS-сборки в релизе нет.

проверка загруженных файлов
# Linux / macOS: SHA256SUMS и нужный файл должны лежать рядом
$ sha256sum -c SHA256SUMS --ignore-missing

# Windows PowerShell: сравните результат со строкой в SHA256SUMS
PS> Get-FileHash .\QeliWin-standalone.exe -Algorithm SHA256

Открыть официальный релиз 0.8.1 →

Роутеры

MikroTik, Keenetic и OpenWrt

На MikroTik RouterOS v7 Qeli запускается из OCI-образа через встроенный контейнерный рантайм. Для Keenetic и OpenWrt в релизе есть протестированные client-only сборки под несколько архитектур; работоспособность на реальных роутерах подтверждена. Перед установкой проверьте архитектуру, наличие TUN и SHA-256 файла.

Установка зависит от модели, архитектуры и наличия TUN. Следуйте version-pinned инструкциям, а не случайной команде для другой платформы.

Полная инструкция: Docker на MikroTik RouterOS v7 → Инструкция Keenetic → Инструкция OpenWrt →

Что понадобится

  • Сервер на LinuxVPS с публичным IP, 1–2 ядра, ~512 МБ RAM; готовый .deb — amd64
  • root-доступнужны сетевые права: TUN, NAT, привязка к порту
  • Rustдля сборки из исходников — либо готовый бинарь / .deb
  • Клиентпод вашу платформу: Linux, Windows, macOS или Android
Шаг 1

Сборка и установка

Для воспроизводимой сборки переключитесь на тег v0.8.1, включите production allocator фичей jemalloc и установите runtime-зависимости. Один бинарь работает как сервер, клиент и утилита управления.

терминал сервера
$ git clone https://github.com/litvinovtd/qeli.git
# зафиксировать именно опубликованную версию
$ cd qeli && git checkout v0.8.1 && cd qeli
# jemalloc используется серверной релизной сборкой и удерживает RSS под churn
$ cargo build --release --features jemalloc
$ sudo install -Dm755 target/release/qeli /usr/bin/qeli

# служба, пользователь и каталоги — при установке из .deb это делает пакет,
# при ручной сборке создайте их сами:
$ sudo apt install -y iproute2 iptables libcap2-bin
$ getent passwd qeli >/dev/null || sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin qeli
$ sudo install -d -o qeli -g qeli /etc/qeli /var/log/qeli /var/lib/qeli
$ sudo install -m640 -o qeli -g qeli config/server.conf /etc/qeli/server.conf
$ sudo touch /etc/qeli/users.conf
$ sudo chown qeli:qeli /etc/qeli/users.conf && sudo chmod 640 /etc/qeli/users.conf
$ sudo install -Dm644 debian/qeli.service /etc/systemd/system/qeli.service
# разрешить непривилегированной панели перезапускать только qeli.service
$ sudo qeli install-polkit
$ sudo systemctl daemon-reload
Шаг 2

Конфигурация сервера

Откройте /etc/qeli/server.conf — единый текстовый формат (flat-INI). Минимальный профиль reality-tls на 443 с выходом в интернет:

/etc/qeli/server.conf
[auth]
# reality-tls и H-1 требуют настоящий закреплённый ключ клиента;
# true дополнительно отклоняет непиненных клиентов до AUTH и не раскрывает
# identity-ключ сетевому сканеру.
require_client_key_proof = true

[profile:main]
bind.address   = 0.0.0.0
bind.port      = 443
bind.transport = tcp
# reality-tls использует параметры reality_proxy ниже
obf.mode = reality-tls
tun.address    = 10.0.0.1
pool.cidr      = 10.0.0.0/24
# выпуск клиентов в интернет
routing.nat.enabled = true
# резолвер в туннеле
dns.enabled = true
dns.listen  = 10.0.0.1
dns.upstream = 1.1.1.1

# reality-tls: туннель внутри настоящего TLS 1.3
# server_name должен совпадать с target — именно он попадёт в ссылку qeli://
obf.tls.server_name = www.microsoft.com
obf.tls.reality_proxy.enabled   = true
# чей сертификат заимствуем
obf.tls.reality_proxy.target = www.microsoft.com
# токен клиента (reality_sid)
obf.tls.reality_proxy.short_ids = 7e78a17ad41f1004
# настоящий TLS (handrolled по умолч.)
obf.tls.reality_proxy.real_tls = true

Глобальные секции — [auth], [web], [logging]; каждый интерфейс — это [profile:имя]. Можно поднять несколько профилей сразу (TCP и UDP на разных портах). Комментарии — только на отдельной строке.

obf.mode принимает plain, fake-tls, obfs (нужен obf.obfs_key) и reality-tls. Для reality/reality-tls задайте блок obf.tls.reality_proxy.*; real_tls = true включает настоящий TLS 1.3, false оставляет режим port-sharing proxy. Для UDP-профиля нужны obf.quic.enabled = true и bind.transport = udp.

Шаг 3

Запуск как служба

Через systemd (рекомендуется): служба qeli работает под отдельным пользователем с минимальными правами (только сетевые capabilities), сама перезапускается при сбое.

терминал сервера
$ sudo systemctl enable --now qeli
$ sudo journalctl -u qeli -f   # смотреть логи

# либо вручную для проверки (foreground):
$ sudo qeli server --config /etc/qeli/server.conf

Сокращённый пример: фактический журнал содержит дополнительные строки диагностики, а одна служба может поднять несколько профилей сразу:

сервер — Qeli
$ sudo qeli server --config /etc/qeli/server.conf
[info] qeli 0.8.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   udp-quic · QUIC-shaped masking
[ ok ] web admin → https://127.0.0.1:8080

При старте сервер печатает поднятые профили и адрес веб-панели. HUP (или sudo systemctl reload qeli) перечитывает пользователей и часть runtime-настроек без разрыва сессий. Изменения профилей, портов, TUN и транспорта требуют sudo systemctl restart qeli.

Шаг 4

Ключ сервера и пиннинг

Покажите публичный ключ каждого профиля — клиенты «пиннят» его, чтобы исключить подключение к подменному серверу (анти-MITM):

терминал сервера
$ sudo qeli show-identity --config /etc/qeli/server.conf
main  a3f5…d290   # → в поле key у клиента

Скопируйте ключ в поле key клиента. Для reality-tls и включённого по умолчанию H-1 настоящий закреплённый ключ обязателен; require_client_key_proof = true дополнительно отклоняет непиненных клиентов до AUTH. Сменить ключ: sudo qeli rotate-identity <профиль>, затем перезапустить службу и обновить key у клиентов.

Шаг 5

Заведение пользователей

Команда add-client сохраняет Argon2id-хеш и защищённую обратимо зашифрованную копию пароля для повторной выдачи ссылки/QR. С флагами --link --host она сразу печатает ссылку qeli:// для импорта в приложение.

терминал сервера
$ sudo 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&sni=www.microsoft.com&rsid=7e78a17ad41f1004

# свой пароль без утечки в argv и историю shell:
$ read -rsp 'Password: ' QELI_USER_PASSWORD; echo
$ printf '%s\n' "$QELI_USER_PASSWORD" | sudo qeli add-client bob --password-stdin --profiles main --max-sessions 2
$ unset QELI_USER_PASSWORD

# применить новых пользователей (без разрыва активных сессий)
$ sudo systemctl reload qeli

Файл пользователей (auth.users_file, по умолчанию /etc/qeli/users.conf) можно править и вручную — по секции на пользователя плюс шаблоны [group:*]:

/etc/qeli/users.conf
[user:alice]
# добавляет qeli add-client alice
password_hash = $argon2id$…
enabled      = true
# одновременных устройств (0 = без лимита)
max_sessions = 2
# фиксированный IP в туннеле (из pool.cidr)
static_ip = 10.0.0.50
# доступ только к этим профилям
profiles = main
# куда можно ходить (ACL); пусто = без ограничений
allowed_networks = 10.0.0.0/24
# лимит скорости, Мбит/с (0 = без лимита)
bandwidth.limit_mbps = 50
# наследовать лимиты из [group:premium]
group = premium
# доп. маршрут этому пользователю
route = 10.20.0.0/16 gateway=10.0.0.1

[group:premium]
bandwidth_limit_mbps = 100
max_sessions = 3

Не передавайте секрет через --password: аргумент виден в списке процессов и часто остаётся в истории shell. Используйте автоматическую генерацию или --password-stdin. Рядом с Argon2id-хешем Qeli хранит password_enc — зашифрованную копию под ключом /var/lib/qeli/panel-secret.key; включайте этот файл в аварийную резервную копию. Для dual-stack доступна выдача --static-ipv6.

Повторно выдать ссылку существующему пользователю

Команда share-link использует защищённую копию пароля и заново собирает ссылку из текущего профиля сервера:

терминал сервера
$ sudo qeli share-link alice --host vpn.example.com:443 --profile main
# только для старого пользователя без password_enc: пароль будет заменён
$ sudo qeli share-link legacy-user --host vpn.example.com:443 --profile main --reset
$ sudo systemctl reload qeli

--reset — разрушающая операция: старый клиентский конфиг перестанет работать. Без --reset пароль не меняется и reload не требуется.

Шаг 6

Подключение клиента

Приложение (телефон / десктоп): импортируйте ссылку qeli:// или отсканируйте QR — сервер, режим и закреплённый ключ подтянутся сами.

CLI-клиент (Linux): заполните client.conf и запустите:

/etc/qeli/client.conf
[qeli]
server = vpn.example.com:443
proto  = tcp
mode   = reality-tls
user   = alice
pass   = ••••••••
# ключ из show-identity
key = a3f5…d290
# short_id из профиля сервера
reality_sid = 7e78a17ad41f1004
# как у reality-цели
sni = www.microsoft.com
терминал клиента
$ sudo qeli client --config /etc/qeli/client.conf

Кроме базовых полей, клиент понимает локальные опции (задаются только в файле, в ссылку qeli:// не входят) — авто-MTU, режим туннеля, kill-switch и совместимые с OpenVPN persist_tun / local / metric (а в клиентах Windows/macOS — ещё и route_file):

/etc/qeli/client.conf · [qeli]
# локальные опции (в ссылку qeli:// не входят).
# ВАЖНО: комментарий — только отдельной строкой. Всё, что стоит после «=»,
# попадает в значение целиком, вместе с «# ...».

# авто-подбор MTU (важно на LTE/CGNAT); >0 = вручную
mtu         = 0
# полный туннель; false = split-tunnel
gateway     = true
# заворачивать и приватные подсети сервера
route_local = false
# эти подсети — мимо туннеля
exclude     = 203.0.113.0/24
# блокировать выход, пока туннель не поднят (Linux)
kill_switch = true
# держать адаптер и маршруты между реконнектами (Win/macOS)
persist_tun = true
# авто-подключение при старте панели/супервизора
autostart   = true

Поля proto, mode и (для obfs — obfs_key; для reality-tls — key, reality_sid, sni) должны совпадать с профилем сервера — проще всего импортировать ссылку qeli://, она подставит их сама. Маршруты, DNS и MTU сервер выдаёт при подключении; локальные опции выше — по желанию. Полный аннотированный список ключей — в config/client.conf; есть и алиасы режима mode = udp-quic / udp-obfs.

Справочник

Несколько профилей и режимов

Один сервер поднимает несколько профилей сразу — по профилю на транспортный режим и порт; пользователи общие и работают на любом. Ниже сокращённый пример на основе актуального server-multiprofile.conf; у каждого профиля должны быть собственные порт, TUN и пул адресов.

/etc/qeli/server.conf
[profile:reality-tls]   # настоящий TLS 1.3 — TCP :443
bind.port      = 443
bind.transport = tcp
obf.mode       = reality-tls
obf.tls.reality_proxy.enabled  = true
obf.tls.reality_proxy.real_tls = true
obf.tls.reality_proxy.target   = www.microsoft.com
obf.tls.reality_proxy.short_ids = 0123456789abcdef
tun.address    = 10.9.0.1
pool.cidr      = 10.9.0.0/24

[profile:fake-tls]       # TLS-подобный хендшейк — TCP :8443
bind.port      = 8443
bind.transport = tcp
obf.mode       = fake-tls
tun.address    = 10.9.1.1
pool.cidr      = 10.9.1.0/24

[profile:obfs]           # ChaCha20-обфускация — TCP :8444
bind.port      = 8444
bind.transport = tcp
obf.mode       = obfs
obf.obfs_key   = смените-меня
tun.address    = 10.9.2.1
pool.cidr      = 10.9.2.0/24

[profile:udp-quic]       # fake-tls + QUIC поверх UDP — UDP :8449
bind.port      = 8449
bind.transport = udp
obf.mode       = fake-tls
obf.quic.enabled = true
tun.address    = 10.9.7.1
pool.cidr      = 10.9.7.0/24

Полный шаблон 0.8.1 содержит 10 готовых профилей: reality-tls, reality, fake-tls, obfs-ws, obfs-none, plain, udp-fake-tls, udp-quic, udp-obfs и obfs-awg. Новые шаблоны включают bounded roaming, dual-stack и recordizer.policy=prefer.

Открыть шаблон 0.8.1 →

Сценарии

Выход в интернет через сервер

Весь трафик устройства идёт через сервер и выходит в интернет с его IP — классический VPN: приватность в публичных сетях, единый внешний адрес. На сервере нужен NAT, а на клиенте — gateway = true: по умолчанию клиент работает в режиме split-tunnel.

/etc/qeli/server.conf · [profile:main]
# MASQUERADE клиентов в интернет
routing.nat.enabled = true
# резолвер в туннеле
dns.enabled = true
/etc/qeli/client.conf · [qeli]
# полный туннель включается НА КЛИЕНТЕ: по умолчанию gateway = false (split-tunnel)
gateway = true
# опционально: не выпускать трафик мимо туннеля, пока он не поднят (Linux)
kill_switch = true
Сценарии

Доступ к сети за сервером

Дотянуться из любой точки до локальной сети за сервером — NAS, камеры, принтеры, внутренние сервисы. Сервер раздаёт клиенту маршрут к LAN и пересылает пакеты без NAT; домашний роутер возвращает ответы в pool.cidr через LAN-адрес Qeli-сервера.

/etc/qeli/server.conf · [profile:main]
# маршрутизация без подмены исходных адресов
routing.nat.enabled = false
routing.forward_private = true
# подсеть за сервером
route = 192.168.1.0/24 gateway=10.0.0.1

Настройте обратный путь: на домашнем роутере добавьте маршрут к pool.cidr через постоянный LAN-адрес Qeli-сервера. Маршрут клиенту можно выдать индивидуально — ключом route в секции [user:имя]. NAT используйте только как запасной вариант, если роутер не поддерживает статические маршруты.

Сценарии

Объединение сетей (site-to-site)

Соедините целые сети нескольких площадок так, чтобы их узлы видели друг друга — связать офисы, филиалы, домашнюю и рабочую сеть. На каждой площадке ставится шлюз с qeli client и фиксированным IP в туннеле; сервер раздаёт маршруты к подсетям площадок, и трафик ходит между сетями через туннель на уровне L3.

Так умеет только настоящий VPN. Прокси (VLESS, V2Ray, Shadowsocks) гоняет трафик отдельных приложений и не маршрутизирует целые подсети — объединить сети им нельзя в принципе. Qeli работает с TUN на уровне маршрутизации (L3), поэтому связывает сети как один сетевой контур.
/etc/qeli/users.conf
[user:branch-a]
# LAN ЗА этим клиентом — аналог iroute в OpenVPN (ключевая строка)
client_subnet = 192.168.50.0/24
# фиксированный IP в туннеле — удобно, но не обязательно
static_ip = 10.0.0.10
/etc/qeli/server.conf · [profile:main]
# site-to-site идёт БЕЗ NAT — реальные адреса сохраняются
routing.nat.enabled = false
# транзит туннель ↔ сети, без MASQUERADE
routing.forward_private = true
# обратный маршрут к сети за сервером — пушится клиентам
route = 10.20.0.0/24 gateway=10.0.0.1
/etc/qeli/client.conf · шлюз площадки A
[qeli]
# ip_forward + FORWARD ACCEPT + MSS-clamp, но БЕЗ MASQUERADE —
# реальные адреса LAN сохраняются
forward = true

Ключевая строка — client_subnet у пользователя: она регистрирует подсеть за клиентом как входящий маршрут. Без неё сервер дропнет пакеты на любой адрес, кроме пулового IP клиента. На шлюзе площадки — forward = true (форвардинг без NAT). Доступно с 0.7.11; на Android не поддерживается. Адресацию площадок держите непересекающейся.

Сценарии

Раздельный туннель (split-tunnel)

В туннель идёт только то, что нужно — например, рабочие подсети, — а остальной трафик клиента идёт напрямую. Режим выбирает клиент: gateway = false (это значение по умолчанию), а сервер лишь раздаёт нужные маршруты. Отдельные подсети можно, наоборот, увести мимо туннеля ключом exclude.

/etc/qeli/server.conf · [profile:main]
# без полного выхода в интернет
routing.nat.enabled = false
# только рабочие подсети
route = 10.50.0.0/16 gateway=10.0.0.1
/etc/qeli/client.conf · [qeli]
# split-tunnel — значение по умолчанию: в туннель идут только выданные маршруты
gateway = false
# при желании увести отдельные подсети мимо туннеля
exclude = 203.0.113.0/24
Управление

Команды управления

Команды используют управляющий сокет с правами 0600, поэтому ниже указан sudo. Большинство изменений применяется на лету. Исключения — rotate-identity и set-web-password: они правят конфиг на диске и требуют sudo systemctl restart qeli.

sudo qeli list-clientsкто сейчас подключён
sudo qeli kick <user>отключить пользователя
sudo qeli disable-user <user>заблокировать (отключить + запретить реконнект)
sudo qeli enable-user <user>снова разрешить вход
sudo qeli set-bandwidth <user> <mbps>лимит скорости (0 = без лимита)
sudo qeli show-routes <user>маршруты пользователя
sudo qeli list-blockedIP, заблокированные защитой VPN-входа
sudo qeli unblock <ip>снять блокировку с IP; --all — со всех
sudo qeli rotate-identity <profile>сменить ключ сервера у профиля
sudo qeli set-web-passwordзадать пароль входа в веб-панель
Веб-панель

Управление через браузер

Панель управляет профилями, пользователями, группами, маршрутами, ключами и резервными копиями. Вход защищён Argon2id, CSRF и отдельной защитой от перебора. Ниже три самостоятельных сценария — не смешивайте их параметры в одном конфиге.

Общий шаг · Пароль панели

Добавьте параметры одного из вариантов ниже, затем выполните команду: без аргументов она сгенерирует стойкий пароль, покажет его один раз и добавит в ту же секцию username и password_hash. Для своего пароля используйте --password-stdin, а не небезопасный аргумент --password.

терминал сервера
$ sudo qeli set-web-password
$ sudo systemctl restart qeli

Вариант A · Только loopback и SSH-туннель

Самый безопасный вариант и значение автоустановщика по умолчанию: панель слушает только сервер. После изменения адреса или TLS нужен полный restart.

/etc/qeli/server.conf · [web]
[web]
# username и password_hash добавит qeli set-web-password
enabled = true
bind = 127.0.0.1
port = 8080
tls = true
csrf = true
session_ttl_secs = 86400
update_check = false
brute_force.max_attempts = 5
открыть туннель с рабочего компьютера
$ ssh -L 8080:127.0.0.1:8080 root@vpn.example.com
# затем откройте https://127.0.0.1:8080

Вариант B · Прямой публичный HTTPS

Публикуйте панель напрямую только с TLS и непустым allowed_ips. Укажите свой реальный IP или CIDR: тестовый адрес ниже не даст вам войти.

/etc/qeli/server.conf · [web]
[web]
# username и password_hash добавит qeli set-web-password
enabled = true
bind = 0.0.0.0
port = 8080
tls = true
allowed_ips = 203.0.113.4
public_host = vpn.example.com
allowed_origins = vpn.example.com:8080
csrf = true

Вариант C · За reverse-proxy

TLS завершается на прокси, а Qeli остаётся на loopback. В trusted_proxies укажите адрес самого прокси; allowed_origins должен совпадать с браузерным host. Проксируйте префикс без его срезания.

/etc/qeli/server.conf · [web]
[web]
# username и password_hash добавит qeli set-web-password
enabled = true
bind = 127.0.0.1
port = 8080
tls = false
base_path = /qeli
allowed_origins = panel.example.com
trusted_proxies = 127.0.0.1
secure_cookie = true
csrf = true

Если панель отвечает 403: на обычном GET сначала проверьте allowed_ips; если страница открывается, но сохранение даёт 403 — проверьте allowed_origins. Параметры сокета (enabled, bind, port, tls, base_path) применяются только после полного restart.

Эксплуатация

Резервная копия и восстановление

Кнопка резервной копии в панели создаёт проверенный архив /etc/qeli с конфигом, пользователями и ключами сервера. Машинный ключ /var/lib/qeli/panel-secret.key намеренно в него не входит. Поэтому для полного аварийного восстановления сохраните и /etc/qeli, и /var/lib/qeli; архив содержит секреты и должен храниться зашифрованным.

полная офлайн-копия сервера
$ sudo systemctl stop qeli
$ sudo tar --xattrs --acls -C / -czf /root/qeli-backup-0.8.1.tar.gz etc/qeli var/lib/qeli
$ sudo systemctl start qeli
$ sudo tar -tzf /root/qeli-backup-0.8.1.tar.gz

Перед восстановлением проверьте список файлов, остановите службу и сохраните текущее состояние отдельно. После возврата файлов восстановите владельца qeli:qeli и строгие права на секреты, выполните sudo qeli check-config --config /etc/qeli/server.conf и только затем запускайте службу. Панель умеет безопасно проверить и восстановить созданный ею архив /etc/qeli, но не заменяет полную копию /var/lib/qeli.

Операционное руководство 0.8.1 →

Проверка

Диагностика типовых проблем

Сначала проверьте конфиг, состояние службы и журнал. Затем отделите проблему туннеля от NAT, DNS и доступа к панели.

sudo qeli check-config --config /etc/qeli/server.confсинтаксис, пользователи, профили и конфликты
sudo systemctl status qeli --no-pagerстатус службы и последняя ошибка
sudo journalctl -u qeli -n 200 --no-pagerпоследние 200 строк журнала
sudo sysctl net.ipv4.ip_forwardдля full-tunnel значение должно быть 1
sudo iptables-save | grep qeli-natпроверить правила NAT, созданные Qeli

Туннель поднялся, но интернета нет — проверьте routing.nat.enabled = true, forwarding и правила firewall. TCP-сайты зависают — проверьте MSS clamp и MTU. Панель отдаёт 403 — сверяйте allowed_ips, allowed_origins и адрес доверенного прокси. Если проблема появилась после ручной правки, помните: комментарий допустим только на отдельной строке.

Обслуживание

Удаление Qeli

Сначала остановите службу и удалите пакет. Конфигурация и состояние оставляются намеренно, чтобы установку можно было восстановить.

терминал сервера
$ sudo systemctl disable --now qeli
$ sudo apt remove qeli

Необратимо: удаляйте /etc/qeli, /var/lib/qeli и /var/log/qeli только после проверенной резервной копии. Это сотрёт серверные ключи, пользователей и машинный ключ расшифровки password_enc; существующие конфиги клиентов нельзя будет перевыпустить с прежней идентичностью.

необязательное удаление всех данных
$ sudo rm -rf /etc/qeli /var/lib/qeli /var/log/qeli

← Вернуться к обзору продукта