The direct tunnel port (8446 by default) and the host agents dial for it can be set in Settings. The server moves its listeners at once and agents pick the address up from the panel: on connect and with every poll, unless TUNNEL_ADDR / TUNNEL_PORT pin it locally. ufw: run with a C locale (the output is translated), do not adopt rules that existed before the panel, skip loopback-only listeners, re-open what saved forwards need on start and when the integration is turned on, move the shared tunnel rule with the port and drop it when no direct forward is left. The last ufw error is shown in Settings. The forwards page shows the real tunnel and panel ports.
LPRA — LongPolling Remote Access
Лёгкий self-hosted сервис для доступа к Linux-машинам без белого IP (за NAT). Агент на клиенте сам исходяще подключается к серверу по HTTP long-polling; админ в веб-панели видит список машин и открывает по каждой терминал в браузере (по умолчанию от root, пользователя можно сменить).
браузер ──WS──> [nginx :8445 TLS] ──> [Go server 127.0.0.1:8091] <──long-poll── агент (root, за NAT)
│
SQLite
Компоненты
- Сервер (
cmd/server) — админ-панель + точка встречи для агентов. За nginx (TLS). - Агент (
cmd/agent) — Linux-бинарь, systemd-сервис от root, PTY по запросу. - install.sh — интерактивный установщик, отдаётся сервером как статика.
Сборка
./build.sh
Получаются bin/lpra-server и dist/agent-linux-{amd64,arm64}.
Запуск сервера
./bin/lpra-server -addr 127.0.0.1:8091 -dist ./dist -db ./lpra.db
Поставьте перед ним nginx по deploy/nginx.conf.example (TLS, long-poll/WS).
Локально без TLS можно добавить -insecure-cookies.
Первый запуск: откройте /setup — мастер создаст администратора. Дальше /settings:
адрес хоста (по умолчанию https://localhost:8445), enroll-секрет и готовая
команда установки.
Установка агента на клиент
Одной командой (под root):
curl -fsSL https://localhost:8445/install.sh | sudo HOST=https://localhost:8445 ENROLL_SECRET=<секрет> sh
Или интерактивно (спросит секрет, а если агент уже стоит — предложит удалить):
curl -fsSL https://localhost:8445/install.sh | sudo sh
Проброс портов и прямой туннель
Правила проброса создаются на странице машины. Режим http идёт через адрес панели (long-poll),
режимы tcp/udp — через прямой туннель: агент держит исходящее соединение к порту туннеля хоста
(по умолчанию 8446, флаг -tunnel / LPRA_TUNNEL_ADDR).
Порт туннеля и хост, к которому для него подключаются агенты (например, IP вместо домена панели),
меняются в /settings → «Прямой туннель». Агенты забирают адрес с панели сами — при подключении и
при каждом опросе, переустановка не нужна. Локальные TUNNEL_ADDR / TUNNEL_PORT в окружении агента
имеют приоритет над настройкой панели (TUNNEL_ADDR=off отключает туннель).
Если на хосте активен ufw и сервер запущен от root, панель сама открывает порт хоста правила
(tcp для http/tcp, udp для udp) и порт туннеля для прямых режимов, а при удалении правила — закрывает.
При ProtectSystem=strict в systemd-юните ufw нужны права на запись: ReadWritePaths=/etc/ufw /run.
Версия
Версия задаётся в одном месте — VERSION.txt; файл вшивается в сервер и агент при сборке.
Пользователь терминала
По умолчанию терминал открывается от пользователя, под которым запущен агент (на Linux — root). В окне «Изменить машину» можно выбрать другого пользователя машины или создать нового (имя, пароль, опционально — добавить в sudo). Смена и создание работают, только если агент запущен от root. Файловый менеджер по-прежнему работает от пользователя агента.
Безопасность
- Пароли админов — bcrypt; сессии в HttpOnly/Secure/SameSite куках; CSRF на формах; rate-limit логина.
- Агенты: общий enroll-секрет → индивидуальный токен (хранится хешем, сверка constant-time).
- Открытие терминала пишется в таблицу
audit(терминал даёт root-доступ), как и смена/создание пользователя.