Reticulum: сеть, которая живёт на 5 битах в секунду — разбор стека по слоям

Есть класс задач, где обычный сетевой стек просто не заводится. Канал в 300 бод на КВ. LoRa-модуль, который отдаёт пару килобит и то не всегда. Спутниковый линк с задержкой в секунды. Кабель между двумя зданиями, который кто-то регулярно перерезает. TCP/IP на этом либо не работает, либо работает так, что лучше бы не работал: три раунд-трипа на рукопожатие, ретрансмиты по таймауту, DHCP, который ждёт ответа, DNS, который ждёт своего.

Reticulum — попытка собрать стек заново, начиная с предположения «канал плохой, и это норма». Заявленный нижний порог — 5 бит в секунду и MTU 500 байт, верхний ориентир разработчиков — гигабит. Проект живой: последний релиз RNS 1.3.8 вышел 10 июля 2026 года, API и формат кадра объявлены стабильными.

Ниже — разбор по слоям: что именно там устроено иначе, почему адрес себе выдаёт сам узел, и во что это выливается, когда доходишь до pip install.

Info:

Кому это может пригодиться

Радиолюбителям и LoRa-энтузиастам; тем, кто строит связь на объектах без интернета; людям, которым нужен канал между двумя точками через неуправляемую среду. Тем, у кого дома гигабит и стабильный VPS, Reticulum не заменит ничего — он решает другой класс проблем.

Сначала — чем это не является

Reticulum регулярно называют «децентрализованным интернетом», и это ровно та формулировка, из-за которой потом разочаровываются. Три уточнения:

  • Это не сеть, а конструктор сетей. Никакого «подключиться к Reticulum» не существует — вы либо соединяетесь с чьим-то узлом, либо поднимаете свой сегмент. Формулировка самого проекта — «инструмент для построения тысяч сетей», а не одна большая.
  • Это не анонимайзер уровня Tor. Шифрование включено всегда и отключить его нельзя, адрес отправителя в пакете действительно не передаётся — но транспортные узлы видят адрес назначения, размеры и тайминги пакетов, а радиопередатчик пеленгуется независимо от криптографии.
  • Это не замена IP. Reticulum работает в userland поверх чего угодно, включая обычный TCP. Ядерных модулей нет, интерфейсов в системе он не создаёт.

Слой за слоем

Interface: всё, по чему можно передать байты

Нижний слой абстрагирует физическую среду. В поставке — Ethernet и WiFi (через AutoInterface с multicast-обнаружением соседей), TCP и UDP, последовательные порты, KISS-совместимые модемы и TNC для пакетного радио, LoRa через устройства RNode, а также запуск произвольной внешней программы с общением через stdio.

Требование к среде ровно одно: полудуплексный канал быстрее 5 бит/с с MTU не меньше 500 байт. Всё остальное — детали конфигурации.

Интерфейс Ключевые параметры Где применяется
AutoInterface group_id, devices, multicast_address_type автообнаружение соседей в локалке
TCPServerInterface listen_ip, listen_port (по умолчанию 4242) точка входа на VPS
TCPClientInterface target_host, target_port, kiss_framing подключение к чужому узлу
UDPInterface listen_port, forward_ip, forward_port широковещание в сегменте
RNodeInterface port, frequency, bandwidth, spreadingfactor, codingrate, txpower LoRa
I2PInterface connectable, peers линк через I2P без публичного IP

Destination: адрес, который никто не выдаёт

Адрес в Reticulum — это 16 байт, усечённый SHA-256 от публичного ключа и имени назначения. Выглядит как <13425ec15b621c1d928589718000d814>. При необходимости длина расширяется до 256 бит.

Ключевое: адрес себе создаёт сам узел, локально, без обращения куда-либо. Нет регистратора, нет DHCP, нет выделения подсетей. Адрес переносим — узел переехал в другую точку сети и остаётся достижимым по тому же идентификатору. Новый адрес становится видимым остальным за секунды-минуты, по мере распространения анонса.

Типов назначения четыре:

  • single — шифрованный юникаст на уникальный публичный ключ, ходит через несколько хопов;
  • plain — нешифрованный, только локально, без многохоповой маршрутизации;
  • group — симметричное AES-256 на предварительно разделённом ключе;
  • link — абстракция канала, о ней ниже.

Криптография фиксированная и без выбора: X25519 для обмена ключами, Ed25519 для подписей, AES-256-CBC с PKCS7 для симметрики, HKDF для деривации, HMAC-SHA256 для аутентификации, токены по спецификации Fernet. Нешифрованный линк установить нельзя в принципе, нешифрованные пакеты отбрасываются как невалидные.

Пакет: 19 байт служебки

Формат кадра плоский и короткий: два байта заголовка, 16 или 32 байта адресов, один байт контекста, дальше данные — до 465 байт. Первый байт заголовка — набор флагов (IFAC, тип заголовка, флаг контекста, режим распространения, тип назначения, тип пакета), второй — счётчик хопов.

Отсюда и цифры, которые проект любит показывать: запрос на установку линка — 51 байт, анонс — 167 байт, подтверждение линка — 115 байт.

Link: три пакета и анонимный инициатор

Link — эфемерный шифрованный канал поверх пути. Инициатор шлёт запрос, назначение генерирует одноразовую пару X25519, стороны считают общий секрет по ECDH, назначение подписывает доказательство ключом Ed25519.

Вся установка — три пакета общим объёмом 297 байт. Удержание установленного канала стоит 0,45 бит в секунду. Для сравнения: TLS-рукопожатие поверх TCP на таком канале заняло бы минуты.

Побочный эффект схемы: инициатор в процессе установки не раскрывает свою идентичность — назначение узнаёт только эфемерный ключ. Плюс forward secrecy, потому что ключи одноразовые.

Note:

Сравните порядок величин. На канале в 5 бит/с установка Link займёт около восьми минут — и это работает. Обычный TCP+TLS на такой скорости не установится вовсе: сработают таймауты.

Transport: маршрут по факту услышанного

Маршрутизации в привычном смысле здесь нет — нет протокола обмена таблицами, нет метрик, нет площадей. Есть анонсы: узел объявляет о себе, соседи ретранслируют, каждый запомнивший строит запись «до этого адреса — через такого-то соседа, столько-то хопов».

Параметры по умолчанию: максимум 128 хопов, под анонсы отводится 2 % полосы интерфейса, одна попытка ретрансмита со случайной задержкой, дубликаты игнорируются.

Узел по умолчанию не пересылает чужой трафик. Чтобы он стал транспортным, в конфиге нужно явно включить:

[reticulum]
  enable_transport = Yes

Транспортный узел хранит таблицы линков и знание об анонсах — то есть именно он видит, кто с кем в принципе разговаривает, пусть и без содержимого.

Практика: от pip до первого файла

Ставится это как обычный питоновский пакет:

pip install rns
# на Debian/Ubuntu/Raspberry Pi и свежих macOS:
pip install rns --break-system-packages
# либо изолированно:
pipx install rns

Дальше — демон и конфиг:

rnsd --exampleconfig > ~/.reticulum/config   # шаблон с комментариями
rnsd -vvv                                    # запуск с подробным логом
rnstatus                                     # состояние интерфейсов

Конфиг живёт в ~/.reticulum/config, формат — INI с вложенными секциями. Минимальный узел на VPS, который принимает подключения и работает транспортом:

[reticulum]
  enable_transport = Yes
  share_instance = Yes

[interfaces]
  [[Local WiFi]]
    type = AutoInterface
    enabled = yes

  [[Public TCP]]
    type = TCPServerInterface
    enabled = yes
    listen_ip = 0.0.0.0
    listen_port = 4242

Клиент на ноутбуке подключается к нему встречным блоком:

  [[Uplink]]
    type = TCPClientInterface
    enabled = yes
    target_host = 203.0.113.10
    target_port = 4242

Если сегмент должен быть закрытым, включается IFAC — интерфейсная аутентификация. Она не заменяет шифрование данных, а отсекает чужие узлы на уровне интерфейса:

    network_name = internal_1
    passphrase = <ваша-длинная-фраза>
    ifac_size = 16
Warning:

passphrase в конфиге лежит открытым текстом. Права на ~/.reticulum/config стоит выставить в 600, а на общей машине — трижды подумать, кто ещё имеет доступ к домашнему каталогу пользователя, под которым крутится rnsd.

Утилиты, ради которых это ставят

Сам по себе стек ничего не делает — интерес в том, что поверх него уже написано и идёт в комплекте:

  • rnstatus — состояние интерфейсов и трафик;
  • rnpath — просмотр и сброс известных путей;
  • rnprobe — диагностика связности до конкретного адреса;
  • rncp — копирование файлов между узлами;
  • rnid — управление идентичностями, шифрование и расшифровка файлов;
  • rnsh — интерактивный удалённый шелл;
  • rnx — запуск одной команды на удалённом узле с возвратом вывода;
  • rngit и git-remote-rns — git-ремоут поверх Reticulum, с подписью и валидацией коммитов.

Отдельно — прикладной слой. LXMF — протокол обмена сообщениями, терпимый к задержкам и разрывам (мессенджер, который переживает отсутствие связи часами). Поверх него Sideband — графический клиент для Android, Linux, macOS и Windows с файлами, голосовыми, картами и телеметрией, и Nomad Network — текстовая среда со страницами и файлообменом.

Success:

Разумный первый эксперимент

  1. Поднять rnsd на VPS с TCPServerInterface и enable_transport = Yes.
  2. На ноутбуке добавить TCPClientInterface на этот VPS, проверить rnstatus.
  3. Прогнать rnprobe до адреса VPS, посмотреть хопы через rnpath.
  4. Перекинуть файл через rncp и открыть rnsh.
  5. Только после этого браться за радиочасть — она добавляет свой пласт проблем.

Где это ломается

Честный список ограничений, без которого разбор был бы рекламой.

Производительность. Референсная реализация написана на Python. Для 5 бит/с это неважно, для гигабита — важно очень. Есть отдельный пакет rnspure для систем без PyCA/cryptography, и он заметно медленнее обычного.

Метаданные. Шифрование содержимого — не то же самое, что скрытие факта связи. Транспортные узлы наблюдают адреса назначения, объёмы и время. В радиоканале добавляется физика: передатчик пеленгуется, и никакая криптография этому не мешает.

Радио — это регулируемая среда. LoRa на 433/868/915 МГц и пакетное радио в VHF живут в разных правовых режимах в разных странах: где-то нужна лицензия, где-то ограничена мощность и доля эфирного времени, где-то шифрование в любительских диапазонах прямо запрещено. Это не мелочь — это первое, что стоит выяснить до покупки железа.

Security:

Проверьте местные правила использования выбранного диапазона до того, как выйдете в эфир. Требования к лицензии, к максимальной мощности, к duty cycle и к допустимости шифрования различаются по странам, и незнание тут не помогает.

Экосистема маленькая. Это не тот случай, когда на вопрос находится десять ответов на Stack Overflow. Документация у проекта подробная, сообщество — узкое.

Important:

Reticulum осмысленно выбирать тогда, когда обычный стек уже не справляется: канал слишком медленный, слишком рваный или слишком враждебный. Если у вас есть работающий IP и вопрос только в приватности — правильные инструменты другие: WireGuard, Tor, обычные VPN-решения.

По теме на форуме

Источники

Question:

Кто-нибудь уже пробовал Reticulum на практике — не как игрушку, а под задачу? Особенно интересны две вещи: реальная дальность и стабильность на LoRa-линке между зданиями, и опыт использования rnsh/rncp как запасного канала управления сервером, когда основной канал лёг.