14 KiB
ramshare_ui
Легковесная, автономная утилита для безопасного обмена текстом и файлами внутри локальных сетей (Wi-Fi, точки доступа со смартфонов, офисные LAN, домашние роутеры, VPN/Tailscale 100.64.0.0/10).
Приложение спроектировано для работы в условиях нестабильного окружения и роуминга устройств (ноутбуки, телефоны, сменяющие IP-адреса при переходе между сетями). Работает как в виде локального веб-интерфейса, так и через полноценный CLI без графической оболочки.
Ключевые особенности
-
Криптографическая безопасность из коробки:
-
Соединения работают строго по TLS 1.3 с обязательной взаимной аутентификацией (mTLS) через самоподписанные сертификаты.
-
Пиннинг сертификатов: соединение устанавливается только с известным и явно подтверждённым отпечатком (SHA-256).
-
SAS-коды сверки (Short Authentication String): 80-битный симметричный верификационный код вида
XXXX-XXXX-XXXX, вычисляемый из отпечатков обоих узлов, предотвращает атаки типа Man-in-the-Middle (MitM). -
Двусторонняя верификация: передача данных блокируется до тех пор, пока оба участника не подтвердят код на своих экранах.
-
Приватность и потоковая передача:
-
Текст принимается исключительно в ОЗУ (до 64 КБ на сообщение, кольцевой буфер на 50 записей). При закрытии процесса или нажатии кнопки очистки текст бесследно исчезает.
-
Потоковая передача файлов с backpressure: чтение и запись производятся чанками с константным потреблением памяти (
O(1)RAM), поддерживаются файлы объёмом до 2 ГБ. -
Файлы записываются во временные
.part_*файлы с атомарным переименованием и очисткой битых передач по таймауту. -
Адаптивность к смене сетей и роумингу:
-
Автоматическое отслеживание изменений сетевых интерфейсов и актуального IP-адреса без перезапуска.
-
Приоритезация IP-адресов: узлы сначала опрашивают адреса из своей текущей
/24подсети. -
Поддержка частных диапазонов RFC 1918 (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16), Link-Local (169.254.0.0/16) и CGNAT / Carrier VPN (100.64.0.0/10). -
Энергоэффективный опрос (Smart Ping):
-
Если устройство перестаёт отвечать, система делает до 5 попыток опроса, после чего переводит пир в
offlineи полностью прекращает фоновый опрос, экономя заряд батареи и сетевой трафик. -
Опрос возобновляется автоматически при ручном пинге, общем сканировании подсети или если пир сам пришлёт UDP-маяк/данные.
-
Автономное обнаружение:
-
Быстрое обнаружение через UDP-рассылку (порт
5354) без зависимости от тяжелых сервисов mDNS / Avahi / Bonjour. -
Встроенный многопоточный сканер диапазонов IPv4 (CIDR, списки, диапазоны тире).
-
Интерфейс без внешних зависимостей:
-
Web UI встроен непосредственно в бинарный файл (zero-external-assets, никаких внешних CDN и шрифтов).
-
Работает прямо на
[http://127.0.0.1:8080/](http://127.0.0.1:8080/)без необходимости ввода одноразовых токенов. -
Защита от межсайтовых атак: валидация заголовков
HostиOrigin(защита от DNS-rebinding и CSRF), строгие CSP-заголовки. -
Разделение интерфейса на активные устройства и отдельную вкладку со всеми ранее заверенными пирами.
Архитектура сетевого взаимодействия
+-------------+ +-------------+
| Node A | | Node B |
+-------------+ +-------------+
| |
| --- 1. UDP Broadcast Beacon (порт 5354) ------------> |
| |
| <--- 2. HTTPS/TLS 1.3 Handshake (mTLS /p2p/info) ---> |
| (Обмен именами, портами и статусом доверия) |
| |
| === 3. Сверка SAS-кода пользователями на экранах === |
| |
| --- 4. Запрос доверия: x-node-trusts: <FP_B> -------> |
| <--- Ответ: trusts_you: true --------------------- |
| |
| [Взаимное доверие установлено (Status: mutual)] |
| |
| --- 5. POST /p2p/text (Только в ОЗУ) ---------------> |
| --- 6. POST /p2p/media (Поток на диск) -------------> |
Сборка и установка
Требуется компилятор Rust версии 1.75+ (Cargo).
# Клонирование репозитория
git clone https://github.com/your-username/ramshare_ui.git
cd ramshare_ui
# Сборка оптимизированного релиза (LTO + Strip)
cargo build --release
# Исполняемый файл появится по пути:
./target/release/ramshare_ui
Быстрый старт
1. Запуск узла с веб-интерфейсом
Запустите узел на обоих устройствах в сети:
# Запуск с параметрами по умолчанию (P2P: 8443, UI: 8080)
ramshare_ui serve
# Либо с явным указанием имени узла
ramshare_ui serve --name "Laptop-Work"
После старта откройте в браузере: [http://127.0.0.1:8080](http://127.0.0.1:8080).
2. Запуск в headless-режиме (сервер/терминал)
Если веб-интерфейс не нужен (например, на удалённом сервере или Raspberry Pi):
ramshare_ui serve --no-ui --name "Home-Server"
Входящие текстовые сообщения будут выводиться прямо в stdout терминала, а принятые файлы сохраняться в папку received_media/.
Использование через CLI
Все операции можно выполнять через консоль без открытия веб-интерфейса.
Поиск устройств в сети
# Показать устройства, которые видны прямо сейчас
ramshare_ui peers
# Вывод списка в формате JSON
ramshare_ui peers --json
# Сканирование текущей подсети (например, 192.168.1.1-254)
ramshare_ui scan
# Сканирование произвольного диапазона
ramshare_ui scan 192.168.1.50-100
ramshare_ui scan 10.0.0.0/24
Заверение устройства (Trust)
Для отправки данных устройства должны взаимно подтвердить SAS-код:
# Заверить по имени, IP или префиксу ID
ramshare_ui trust Laptop
# С ожиданием подтверждения с противоположной стороны (до 60 секунд)
ramshare_ui trust 192.168.1.45 --confirm-wait 60
# Отозвать доверие
ramshare_ui untrust Laptop
Отправка текста и файлов
# Отправить текст в оперативную память устройства
ramshare_ui send-text Laptop "Привет! Пароль от архива: secret123"
# Передача содержимого через конвейер (stdin)
cat dump.sql | ramshare_ui send-text Laptop -
echo "токен_авторизации" | ramshare_ui send-text 192.168.1.50 -
# Отправка одного или нескольких файлов
ramshare_ui send-file Laptop ./document.pdf ./archive.tar.gz
Просмотр параметров узла
ramshare_ui config
Структура каталогов
По умолчанию приложение хранит данные рядом с бинарным файлом (или в пути, переданном через --data-dir):
.
├── ramshare_ui # Исполняемый файл
├── config/ # Каталог конфигурации
│ ├── config.json # Идентичность узла (приватный ключ, сертификат, имя)
│ └── trusted.json # База данных заверенных устройств и их адресов
└── received_media/ # Папка принятых файлов
├── report.pdf
└── 1774500000_a1b2c3_photo.png
Файл config.json генерируется автоматически при первом запуске с правами доступа 0600 (Unix).
Параметры командной строки
| Параметр | По умолчанию | Описание |
|---|---|---|
--name <имя> |
Имя хоста ОС | Имя устройства, отображаемое другим пирам в сети |
--p2p-port <порт> |
8443 |
Порт для HTTPS / mTLS соединений передачи данных |
--ui-port <порт> |
8080 |
Порт веб-интерфейса (привязывается строго к 127.0.0.1) |
--ip <IPv4> |
Авто | Принудительная привязка к конкретному локальному адресу |
--data-dir <путь> |
Рядом с бинарником | Базовая папка для каталогов config/ и received_media/ |
--ping-interval <с> |
15 |
Интервал периодического опроса устройств (от 10 до 30 с) |
--no-ui |
false |
Запуск сервера без поднятия локального веб-сервера |
--wait <с> |
4 |
Время прослушивания UDP-маяков при выполнении CLI-команд |
--scan <диапазон> |
None |
Автоматически сканировать указанную сеть, если пир не найден |
--confirm-wait <с> |
0 |
Время ожидания подтверждения со второго устройства при trust |
--json |
false |
Вывод списков узлов (peers, scan) в формате JSON |
-y, --yes |
false |
Пропуск интерактивного запроса подтверждения в CLI |
-h, --help |
— | Вывод справки по доступным командам |
Безопасность и модель угроз
- Защита от прослушивания в открытых сетях: Весь трафик шифруется TLS 1.3 с современными наборами шифров (AEAD). Провайдер сети или сосед по Wi-Fi не видят передаваемый контент или имена файлов.
- Защита от подмены (MitM): Если злоумышленник пытается перехватить трафик и подменить самоподписанный сертификат на лету, у пользователей не совпадут SAS-коды сверки. При несовпадении кодов подтверждать соединение запрещено.
- Безопасность Web UI: Сервер интерфейса слушает только
127.0.0.1. При попытке внешнего сайта выполнить запрос в локальный браузер (CSRF / DNS-rebinding) запрос отклоняется благодаря проверке заголовковOriginиHost, а также строгой политике CSP (frame-ancestors 'none',default-src 'none'). - Защита файловой системы: Имена входящих файлов нормализуются с вырезанием управляющих символов и попыток выхода из каталога (
../). Файлы с исполняемыми расширениями (.sh,.exe,.batи др.) помечаются в интерфейсе как потенциально опасные и не открываются автоматически.