redtea f3cb7701f2 fix: remove an agent's forward rules with the agent (0.0.4)
Deleting a machine left its forward rules behind: the host ports stayed
bound and "busy" with no page to remove them from. The rules, their
listeners and ufw rules now go with the agent, and rules orphaned by
older versions are dropped on start.

A host port equal to the direct tunnel port gets its own message.
2026-10-13 16:30:53 +03:00
2026-10-13 16:16:31 +03:00
2026-10-13 00:36:19 +03:00
2026-10-13 00:25:29 +03:00
2026-10-13 00:25:29 +03:00
2026-10-13 00:24:16 +03:00

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-доступ), как и смена/создание пользователя.

Скриншоты

image image image image
S
Description
Создан в GitHub 13 окт., 2026, перенесен 19 окт., 2026
Readme MIT
62 MiB
0 Stars 1 Watchers 0 Forks
Languages
Go 52%
JavaScript 31%
CSS 8.2%
HTML 7.1%
Shell 1.2%
Other 0.5%