1
Информационные технологии и интернет
Апрель 2024
Cloudflare предлагает мощный инструмент cloudflared access для безопасного доступа к удаленным сервисам без проброса портов наружу. Подключение идет через зашифрованный туннель Cloudflare, без публичного IP, с поддержкой Zero Trust политик. Технически это работает отлично, но есть один большой минус: cloudflared это CLI-утилита.
Чтобы подключиться к серверу по RDP или SSH через Cloudflare Tunnel, пользователю нужно помнить точную команду cloudflared access tcp с аргументами, самостоятельно выбрать свободный локальный порт, запустить процесс в фоне и не закрыть терминал, запомнить какой PID к какому туннелю относится, отдельно запустить нативный клиент (mstsc, ssh) с правильными параметрами и где-то надежно хранить логины и пароли к серверам.
Когда у тебя 2-3 сервера, это терпимо. Когда 20-30, как у системного администратора или фрилансера с пулом клиентов, это превращается в реальную боль. Параллельно открыто 5-7 терминалов с туннелями, периодически они отваливаются, путаются порты, теряются учетные данные. Энтерпрайз-решения вроде Cloudflare WARP закрывают часть этих проблем, но они требуют корпоративной подписки Cloudflare и не решают задачу безопасного хранения учетных данных к самим серверам.
Целевая аудитория продукта: системные администраторы, DevOps инженеры, фрилансеры и небольшие IT-команды, которые работают с инфраструктурой клиентов через Cloudflare Tunnels. Те, кто привык к нативным клиентам Windows Remote Desktop или OpenSSH, но устал от ручного управления туннелями.
Цель проекта - настольное приложение с графическим интерфейсом, которое полностью заменяет ручную работу с CLI cloudflared. Один клик создает туннель, второй клик его останавливает. Без терминалов и без знания командной строки.
Функциональные требования:
Автоматическое управление жизненным циклом cloudflared. Приложение само скачивает и устанавливает бинарник, если его нет в системе. Поддержка macOS, Windows, Linux на amd64 и arm64. Подбор свободных локальных портов в диапазоне 10000-60000. Отслеживание PID и корректное завершение процессов при закрытии туннеля или приложения.
Иерархическая структура серверов и сервисов: компания, сервер, сервис (RDP/SSH/TCP). С группировкой, поиском по командной палитре (Cmd/Ctrl+K), избранным и недавними подключениями.
Безопасное хранение учетных данных. Не plain text JSON в домашней директории, а правильное шифрование через системный keychain. Дополнительно - встроенный менеджер паролей формата KeePass (.kdbx) с шифрованием AES-256 и ключевой деривацией Argon2, чтобы пользователь мог использовать существующие базы паролей без миграции.
Автоматический запуск нативных клиентов после установки туннеля. mstsc на Windows с правильно сгенерированным .rdp-файлом и преднастроенными параметрами. xfreerdp на Linux. Windows App на macOS. Для SSH системный ssh с временным ключом или sshpass с паролем.
Кроссплатформенность с одним кодом. Без Electron-монстра на 200 МБ оперативки, а легковесное приложение на нативных webview. Цель по памяти - менее 100 МБ для базового приложения, плюс 10-20 МБ на каждый активный туннель.
Журнал активности и аудит. Все события (открытие туннеля, ввод учетных данных, изменение настроек, операции с KeePass) пишутся в локальный лог с уровнем важности. С возможностью экспорта и фильтрации.
Интерфейс на русском и английском с темной темой по умолчанию.
Нефункциональные ограничения. Приложение работает полностью офлайн от облачных сервисов разработчика, без отправки данных на внешние сервера. Все настройки, серверы, учетные данные хранятся локально. Простая установка через .dmg, .exe, .deb или .AppImage без дополнительных зависимостей. Время холодного старта не более 2 секунд. Окно single-instance, чтобы повторный запуск не плодил процессы.
Отдельная техническая сложность - корректная работа с дочерними процессами cloudflared на трех ОС: на Windows завершение через taskkill /F /PID, на Unix через kill, с обязательной очисткой при сбое родительского процесса, чтобы не оставались сироты-туннели после краша приложения.
Стек выбирал из соображений: малый размер бандла, нативная производительность, хорошая работа с системными процессами. Tauri 2.0 + Rust на бэкенде, React 18 + TypeScript + Tailwind CSS на фронте. Это дало приложение в 15-20 раз меньше Electron-аналогов при той же функциональности, нативные системные диалоги, доступ к OS keychain через keyring crate.
Архитектурно приложение разделено на четкие модули в Rust-бэкенде: cloudflared (управление бинарником и процессами), keepass (работа с .kdbx через crate keepass + кастомные расширения), servers (иерархия и хранилище конфигурации через tauri-plugin-store), remote (запуск нативных клиентов RDP/SSH), activity (журнал событий), settings (конфигурация приложения). Каждый модуль регистрирует свои Tauri-команды через единый invoke_handler.
Фронтенд работает на Zustand для глобального состояния, TanStack Router для маршрутизации, Framer Motion для анимаций, i18next для локализации. Связь с Rust через типизированные Tauri commands с автоматической генерацией TypeScript типов из Rust-структур через ts-rs.
Особое внимание уделил двум вещам: правильному управлению жизненным циклом дочерних процессов cloudflared (чтобы не оставались висеть после краша) и безопасному хранению секретов через системный keychain с прозрачным fallback на встроенный KeePass.
Проект разрабатывался итеративно, релиз-цикл около двух недель. На момент сдачи актуальная версия 0.3.11, опубликована на Product Hunt, доступна как opensource под MIT
Начал с проработки архитектуры и выбора технологий. Сравнивал Electron, Tauri и Wails. Tauri 2.0 победил по трем критериям: размер бандла (3-5 МБ против 80+ у Electron), нативная производительность Rust для работы с процессами, зрелая система плагинов с готовыми решениями для clipboard, store, shell и single-instance. Заложил модульную структуру бэкенда: каждая фича отдельный Rust-модуль с собственным state и набором Tauri-команд.
В рамках MVP реализовал базовый цикл: запуск cloudflared access tcp как дочернего процесса через std::process::Command, сохранение PID в HashMap внутри shared state (TunnelState), корректное завершение через kill/taskkill в зависимости от ОС. Сделал автоматический подбор свободных локальных портов в диапазоне 10000-60000. Фронтенд получил минимальный экран Active Connections с таблицей запущенных туннелей и кнопкой Stop.
Решил проблему первого запуска. На большинстве машин cloudflared не установлен, требовать ручной установки через brew или winget — плохой UX. Сделал автоматический детект и установку: приложение проверяет наличие бинарника в app_data_dir, если нет, скачивает с GitHub Releases напрямую через reqwest. Реализовал маппинг архитектур (darwin-amd64, linux-amd64/arm64/386/arm, windows-amd64/386).
Для macOS отдельная сложность: Cloudflare выкладывает только .tgz архивы, прямого бинарника нет. Сделал отдельный путь install_cloudflared_macos с использованием системных curl и tar для скачивания и распаковки, с последующей установкой прав 0755 через std::os::unix::fs::PermissionsExt.
Добавил команду get_latest_cloudflared_version, которая дергает GitHub API и сравнивает с локальной версией, чтобы предлагать обновление. Все системные вызовы обернул в proper error handling с понятными сообщениями для пользователя.
Хранение учетных данных к серверам — критичная часть. Системный keychain покрывает базовые случаи, но многие админы уже ведут KeePass-базу и не хотят дублировать. Реализовал полноценный модуль работы с .kdbx форматом: открытие, создание, чтение и поиск записей через Rust crate keepass с поддержкой KDBX 4.0.
Добавил шифрование на уровне формата: AES-256-GCM для данных, Argon2 для деривации мастер-ключа. Поддержка key-файлов в дополнение к мастер-паролю для двухфакторной защиты. Реализовал состояния контейнера (open/locked/unlocked), автоматическое блокирование при простое, сканирование директории ~/KeePassContainers для автоматического обнаружения существующих баз.
Сделал анализатор качества паролей: длина, наличие разных классов символов, расчет энтропии, оценка времени взлома, рекомендации по улучшению. Добавил подсчет статистики безопасности контейнера: слабые пароли, дубликаты, истекшие записи, общий security score от 0 до 100.
Самое тонкое место в кроссплатформе. Каждая ОС имеет свои особенности запуска RDP и SSH клиентов. Сделал абстракцию RemoteHandle с тремя реализациями для RDP (mstsc на Windows, xfreerdp на Linux, Windows App на macOS) и двумя для SSH (системный ssh с ключом, sshpass с паролем).
Для Windows генерирую .rdp-файл с полным набором параметров: full address, username, password, domain, screen mode, multimon, redirects для буфера обмена, принтеров, смарт-карт, USB. Файл сохраняется в app_local_data_dir с UUID сервиса в имени, чтобы не было коллизий между параллельными подключениями. Для Linux формирую командную строку xfreerdp с теми же параметрами. Для macOS открываю Windows App через open -a с URL.
Для SSH с ключом записываю приватный ключ во временный файл с правильными правами и передаю его через -i. Для парольной аутентификации использую sshpass -p, понимая что пароль виден в process list. Все процессы запускаются через tauri-plugin-shell, который дает контроль над stdin/stdout/stderr и proper cleanup при завершении.
Финальная отделка. Дизайн в духе современных dev-tools: glassmorphism, темная тема по умолчанию, плавные анимации через Framer Motion. Командная палитра на Cmd/Ctrl+K через cmdk для быстрого поиска по серверам и сервисам. Sidebar с навигацией (Dashboard, Servers, Active Connections, KeePass, Activity, Settings).
Локализация на двух языках через i18next и react-i18next, файлы переводов отдельно от кода в src/i18n/locales/. Архитектура легко расширяемая на новые языки.
Журнал активности с типизированными событиями (UserLogin, RelayConnected, RdpServiceConnected, CredentialsUpdated, KeePassContainerImported и так далее), уровнями важности (Info, Warning, Error, Critical), фильтрацией по типу/severity/сервису/датам, пагинацией, экспортом в JSON. Хранится в памяти с лимитом 10000 событий и периодической записью в файл в app_data_dir.
Сборка под три ОС через GitHub Actions с матрицей runners (macos-latest, windows-latest, ubuntu-latest). На выходе .dmg, .exe (NSIS installer), .deb и .AppImage. Релизы публикуются на GitHub Releases с автогенерацией changelog. Текущая версия 0.3.11 опубликована и доступна на Product Hunt.
Готовое настольное приложение Desktop Argo Tunnel Manager версии 0.3.11, опубликованное как opensource под лицензией MIT и представленное на Product Hunt. Полностью заменяет ручную работу с CLI-утилитой cloudflared графическим интерфейсом, доступно для macOS, Windows и Linux.
Технические показатели
Размер установочного пакета 8-12 МБ в зависимости от платформы — против 80-150 МБ у аналогичных Electron-приложений. Потребление оперативной памяти базовым процессом 50-100 МБ, плюс 10-20 МБ на каждый активный туннель. Время холодного старта 1-2 секунды. Поддержка одновременной работы до нескольких десятков параллельных туннелей, ограничено только диапазоном свободных локальных портов (10000-60000) и системными ресурсами.
Функциональный охват
Реализовано полное покрытие команд cloudflared access (ssh, rdp, tcp) через GUI. Автоматическая установка бинарника cloudflared при первом запуске для всех поддерживаемых платформ и архитектур (amd64, arm64, 386, arm) с корректной обработкой macOS-специфичного формата .tgz. Автоматическая проверка обновлений через GitHub API.
Иерархическое управление инфраструктурой: компании, серверы, сервисы. Подключение по RDP, SSH и произвольному TCP. Автозапуск нативных клиентов после установки туннеля: mstsc на Windows с генерацией .rdp-файла, xfreerdp на Linux, Windows App на macOS, системный ssh с поддержкой ключей и паролей.
Встроенный менеджер паролей формата KeePass .kdbx с шифрованием AES-256-GCM и деривацией ключа Argon2. Поддержка мастер-пароля и key-файлов для двухфакторной защиты. Анализатор качества паролей с расчетом энтропии и оценкой времени взлома. Статистика безопасности контейнера с выявлением слабых и дублирующихся паролей.
Дополнительно: командная палитра на Cmd/Ctrl+K, журнал активности с типизированными событиями и фильтрацией, экспорт логов в JSON, локализация на русский и английский, темная тема, single-instance окно.
Безопасность
Учетные данные хранятся через системный keychain (Keychain на macOS, Credential Manager на Windows, Secret Service на Linux) с прозрачным fallback на встроенный KeePass. Никаких данных в plain text. Все операции выполняются локально без отправки на внешние сервера. Каждый туннель работает в изолированном дочернем процессе с корректным завершением при закрытии приложения, что исключает появление процессов-сирот.
Дистрибуция и поддержка
Сборка под три ОС автоматизирована через GitHub Actions. Доступны установщики .dmg для macOS, .exe (NSIS) для Windows, .deb и .AppImage для Linux. Релизы публикуются на GitHub Releases с автоматической генерацией changelog. Документация в docs/ покрывает архитектуру, пользовательский гайд и описание API. Поддерживается активная разработка с регулярными релизами.
Эффект для пользователя
Время на установку первого подключения сократилось с 5-10 минут (установить cloudflared, разобраться с командами, найти свободный порт, запустить mstsc отдельно) до 30 секунд (добавить сервер в GUI и нажать Connect). Параллельная работа с десятками серверов превратилась из набора терминалов и заметок в один экран Active Connections с кнопками Stop. Безопасность повысилась за счет исключения plain text паролей и временных RDP-файлов с реквизитами в открытом виде.