Перейти к содержимому

SSH-реле и туннели

Оба участника — ваш ноутбук с nyx-operator (или агент-хост) и целевая машина — уже держат исходящие WebSocket-соединения к серверу управления. Реле использует их:

ssh -p 2222 127.0.0.1 nx.3fe.ru машина B
┌────────────────┐ WS (out) ┌──────────┐ WS (out) ┌────────────┐
│ nyx-operator │──────────>│ relay │<──────────│ агент → :22│
│ слушает :2222 │ binary │ registry │ binary │ (loopback) │
└────────────────┘ └──────────┘ └────────────┘
  1. Инициатор просит панель открыть поток к порту машины B.
  2. Панель проверяет: обе стороны в одной организации, машина B online, у неё включено «Реле». Каждое открытие попадает в аудит.
  3. Агент на B подключается только к 127.0.0.1:port — реле нельзя использовать для сканирования её сети.
  4. Дальше сервер переключает бинарные кадры между двумя соединениями, не разбирая их.

Что видит панель: SSH-протокол шифруется между вашим клиентом и sshd машины, поэтому сервер управления переносит только шифротекст. Он знает, кто, когда и к какому порту какой машины открыл поток, но не содержимое сессии. Аутентификация тоже сквозная — ваши обычные SSH-ключи и пароли; панель ключей не выпускает и не хранит.

  • Включённое «Реле» в «Админ → Агенты» (или токен регистрации с отметкой «С реле»). По умолчанию реле выключено.
  • Работающий sshd на 127.0.0.1:22 (или другой сервис на нужном порту). На Windows установщик ставит OpenSSH Server галочкой; входящий порт в брандмауэре открывать не нужно.

Свои ключи или пароль для входа по SSH на машину у вас должны быть заранее — реле их не заменяет. Если ключа на машине ещё нет, администратор может положить туда ваш публичный ключ через агента, не заходя на машину: панель передаёт одну строку authorized_keys, а агент кладёт её туда, откуда её читает локальный sshd — на Linux в ~/.ssh/authorized_keys указанного пользователя, на Windows в administrators_authorized_keys с нужными правами. Повторная установка того же ключа ничего не меняет. Машина должна быть online, а само действие пишется в аудит: в журнал попадают только тип ключа и комментарий.

Если nyx-operator ещё не установлен, поставьте его одной командой, см. Рабочее место оператора.

  1. В кабинете «Настройки → API-токены» нажмите «Создать токен», задайте имя (например laptop) и скопируйте значение — оно показывается один раз.
  2. Сохраните его в CLI:
Окно терминала
nyx-operator login --server https://app.nx.3fe.ru --token nyxop_…

Конфигурация записывается в ~/.config/nythronix/operator.json; переменные окружения NYX_SERVER и NYX_TOKEN имеют приоритет над файлом.

  1. Найдите машину. Список выглядит как в кабинете: имя, hostname, состояние, ОС, версия, реле и теги.
Окно терминала
nyx-operator agents # весь парк
nyx-operator agents --online --tag env:prod # только нужное
  1. Откройте туннель и подключайтесь. Машина называется по имени, hostname, логину или ID, хватает уникальной подстроки. Если подходит несколько записей и online ровно одна, выбирается она.
Окно терминала
nyx-operator tunnel web-01 --port 22 --listen 127.0.0.1:2222
ssh -p 2222 user@127.0.0.1
scp -P 2222 ./backup.tgz user@127.0.0.1:/tmp/
rsync -e 'ssh -p 2222' -av ./dist/ user@127.0.0.1:/srv/app/

--port — порт на loopback машины (по умолчанию 22), --listen — локальный адрес (по умолчанию 127.0.0.1:2222). Каждое принятое соединение становится отдельным потоком через реле; Ctrl-C закрывает всё. Порт любой, не только 22: --port 3389 для RDP, --port 5432 для Postgres. На странице «Туннели» и в «Админ → Агенты» есть кнопка «Копировать команду nyx-operator», которая подставляет выбранную машину.

Те же туннели умеет открывать Claude Code через MCP для операторов.

Отозвать API-токен можно там же в настройках — CLI с ним сразу перестанет работать.

Если вам нужно, чтобы одна управляемая машина достучалась до другой (например, rsync между серверами за разными NAT), откройте туннель в кабинете, пункт «Туннели»:

  • Агент-хост (A) — машина, на которой откроется локальный порт;
  • Целевой агент (B) — машина, к чьему loopback-порту он ведёт;
  • Удалённый порт и Адрес прослушивания.

После «Открыть туннель» в таблице появится Локальный адрес на машине A и счётчик Соединения. Туннели эфемерны: живут в памяти агента A и исчезают при его перезапуске; кнопка «Остановить» закрывает туннель вместе со всеми соединениями.

То же самое из командной строки самой машины A (нужен root для чтения /etc/nythronix/agent.json):

Окно терминала
sudo nythronix-agent tunnel <agent-id-B> --port 22 --listen 127.0.0.1:2222

В форме «Новая сессия» поле «SSH на другой агент» запускает ssh на агенте-хосте до выбранной машины через то же реле и показывает его как обычный терминал в кабинете. См. Терминал и сессии.

Прямой SSH-терминал из браузера без агента-хоста пока недоступен.

Пункт «Консоль порта» открывает сырой TCP-поток к порту машины прямо в терминале кабинета. Подходит для текстовых протоколов и отладочных портов, а для оболочки используйте SSH.

Там же кнопка «Открыть как веб-страницу»: панель откроет в новой вкладке адрес

https://app.nx.3fe.ru/proxy/<agent-id>/<port>/

и будет проксировать HTTP-запросы к сервису, который слушает на loopback машины — админке роутера, Grafana, внутреннему дашборду. Доступ проверяется так же, как для реле: нужна ваша сессия в кабинете и машина вашей организации.

Ограничения текущей версии прокси: каждый запрос — отдельный поток через реле, ответ ограничен 16 МиБ и 30 секундами, WebSocket не проксируется; относительные ссылки на HTML-страницах переписываются, абсолютные — нет. Для сложных веб-приложений надёжнее туннель nyx-operator до нужного порта и обычный http://127.0.0.1:<локальный порт>/.