Управление из другой сети
Как управлять домом снаружи, не делая облако его хозяином?
Внешняя сеть переносит защищённый поток. Решение о доступе остаётся на станции.
Дома приложение обращается к станции напрямую. В другой сети нужен дополнительный путь: VPN либо проверенный ретранслятор. При этом конечная сторона, которой доверяет приложение, остаётся той же станцией.
Для первой сборки важнее прозрачная схема с понятными ключами и восстановлением, чем обещание незаметно пройти любую сеть. Блокировка удалённого пути не должна разрушать локальную работу, а доступ пользователя не должен автоматически давать SSH-права.
За пределами дома у телефона нет прямого локального маршрута к хабу. Дом может находиться за CGNAT, а входящие соединения — быть запрещены. Поэтому первая реализуемая схема строится на исходящих соединениях и небольшом сервере-посреднике под контролем владельца. Этот сервер не хранит модель комнаты и не исполняет автоматизации.
Три архитектуры удалённого пути#
| Вариант | Механика | Плюс | Минус |
|---|---|---|---|
| WireGuard через VPS | Телефон и хаб подключаются к VPN-узлу | Понятный проверенный транспорт | Настройка VPN и зависимость от UDP |
| Opaque relay на 443 | Хаб держит исходящий канал, relay передаёт поток | Удобнее встроить в приложение | Собственная маршрутизация, лимиты, сложнее реализация |
| Прямое соединение с fallback | Сначала поиск прямого пути, затем relay | Меньше задержка при удаче | NAT traversal и смена сети усложняют систему |
WireGuard использует стандартную для него модель ключей и защищённого туннеля. Persistent keepalive может помочь сохранению NAT-состояния, но не гарантирует прохождение блокировок. Его частота выбирается с учётом мобильной батареи и сетевой среды. [59][72]
Первый работающий удалённый экземпляр#
Для E0 предлагается штатный WireGuard-клиент на телефоне и станции, VPS владельца и маршрут только к хабу/нужным адресам. Это не окончательный бесшовный UX, но работающая проверяемая основа. Внутри туннеля сохраняется защищённая прикладная сессия Koobique, чтобы VPN-сервер не становился единственным основанием доверия.
Приложение выбирает локальный endpoint дома и VPN-endpoint вне дома, проверяя один и тот же ключ станции. Переход не создаёт новую команду при повторе: сохраняется прежний command_id. Локальный доступ не отправляется через удалённый VPS только потому, что тот доступен.
Интеграция VPN внутрь KMP-приложения — отдельная платформенная задача с разрешениями и жизненным циклом ОС. На iOS её нельзя считать обычным сокетом без дополнительных возможностей приложения. Для E1 сравнивается встроенный туннель и relay без системного VPN; результат требует реального мобильного стенда.
Что должен делать будущий relay#
Relay принимает аутентифицированную регистрацию станции, ограничивает число каналов и объём данных, не доверяет произвольным идентификаторам маршрута и не хранит расшифрованные команды. Конечная сессия между приложением и станцией защищается независимо. Компрометация relay всё равно раскрывает часть метаданных: время соединения, адреса, объём и доступность.
Relay на TCP/443 не является «неблокируемым протоколом». Белые списки, блокировка IP, обрыв связи и политика сети могут остановить удалённый путь. Это ограничение честно отражается в приложении; локальные функции не зависят от попыток восстановления внешнего канала.
SSH как отдельный административный контур#
SSH включён для владельца, но не публикуется в интернет автоматически. Вход по ключам, отдельная учётная запись, запрет общего пароля и прямого root-входа. OpenSSH позволяет настроить эти ограничения и дополнительные параметры сеанса. [60]
Право управлять светом не равно праву открыть shell. Техподдержка получает временный доступ по конкретному ключу, с явным разрешением владельца. Не нужен общий сервисный ключ всей группы проектов или скрытый постоянный reverse tunnel.
Команда обновления по SSH вызывает штатную проверяемую процедуру, а не произвольную замену бинарника в работающей системе. Диагностический пакет маскирует ключи, Wi-Fi-пароли и персональные данные. Временный доступ можно отозвать независимо от мобильных пользователей.
Восстановление без внешней инфраструктуры#
При недоступном VPS сохраняются локальный Wi-Fi, доверенный сервисный путь и физическое восстановление. Инструкция не должна требовать зайти на наш сайт, чтобы вернуть собственный дом. Конфигурация удалённого сервера экспортируется, а протокол не привязывается навсегда к одному домену производителя.
Приёмка удалённого пути#
Проверить телефон в мобильной сети, смену Wi-Fi на LTE/5G, временную потерю VPS, смену адреса дома и повтор команды во время переключения. Убедиться, что VPS не может выдать себя за станцию и что обычный пользователь не получает SSH.
Туннель не отменяет авторизацию приложения#
WireGuard-пир на VPS не получает право обращаться ко всем службам Hub. На wg-интерфейсе firewall разрешает только нужный порт приложения; SSH — отдельное явное разрешение и собственные ключи. Между приложением и Hub сохраняется проверка конечной идентичности и пользовательских полномочий. Компрометация ретранслятора не должна превращаться в административную локальную сеть.
Headscale/DERP — вариант уменьшить собственный код транспортной инфраструктуры; он сравнивается с простым WireGuard для личного E0 и встроенным relay для E1. Ни один вариант не гарантирует удалённый доступ при недоступности всех разрешённых внешних каналов. Локальная работа остаётся независимой. В мобильном опыте проверяются sleep, смена Wi-Fi/LTE, отзыв и незавершённая команда. [175]