
Reticulum v1.3.9
Сетевой стек на основе криптографии для создания неостанавливаемых сетей с LoRa, Packet Radio, WiFi и всем, что между ними.
Reticulum Network Stack 


Этот репозиторий является публичным зеркалом. Вся разработка ведётся в другом месте.
Чтобы понять основополагающую философию и цели этой системы, прочтите Дзен Reticulum.
Reticulum — это криптографический сетевой стек для построения локальных и территориально-распределённых сетей с использованием доступного оборудования. Он может работать даже при очень высокой задержке и чрезвычайно низкой пропускной способности. Reticulum позволяет создавать сети масштаба района с помощью стандартных инструментов и обеспечивает сквозное шифрование и связность, анонимность инициатора, автоматическую настройку криптографически защищённой многопрыжковой маршрутизации, эффективную адресацию, неподдельные подтверждения доставки и многое другое.
Видение Reticulum состоит в том, чтобы позволить любому человеку стать собственным оператором сети и сделать создание недорогих и лёгких сетей, покрывающих обширные территории множеством независимых, взаимосвязываемых и автономных сетей, доступным и простым. Reticulum не является одной сетью. Это инструмент для построения тысяч сетей. Сетей без аварийных выключателей, слежки, цензуры и контроля. Сетей, которые могут свободно взаимодействовать, объединяться и разделяться друг с другом, не требуя централизованного надзора. Сетей для людей. Сетей для народа.
Reticulum — это полноценный сетевой стек, который не зависит от IP или более высоких уровней, но при этом возможно использовать IP в качестве нижележащего транспорта для Reticulum. Поэтому тривиально организовать туннелирование Reticulum через Интернет или частные IP-сети.
Отсутствие зависимостей от традиционных сетевых стеков высвобождает издержки, которые были использованы для реализации стека, построенного непосредственно на криптографических принципах, что обеспечивает устойчивость и стабильную функциональность даже в открытых и ненадёжных сетях.
Не требуются модули ядра или драйверы. Reticulum работает полностью в пользовательском пространстве и может быть запущен практически на любой системе, поддерживающей Python 3.
Читайте руководство
Полную документацию по Reticulum можно найти на markqvist.github.io/Reticulum/manual/.
Вы также можете скачать руководство по Reticulum в формате PDF или в виде электронной книги в формате EPUB.
Для получения дополнительной информации посетите reticulum.network и раздел FAQ вики.
Примечательные особенности
- Координационно-независимая глобально уникальная адресация и идентификация
- Полностью самонастраивающаяся многопрыжковая маршрутизация на разнородных несущих
- Гибкая масштабируемость на разнородных топологиях
- Reticulum может передавать данные через любые смеси физических сред и топологий
- Низкоскоростные сети могут сосуществовать и взаимодействовать с крупными высокоскоростными сетями
- Анонимность инициатора: общайтесь, не раскрывая свою личность
- Reticulum не включает адреса источника ни в один пакет
- Асимметричное шифрование X25519 и подписи Ed25519 как основа для всей связи
- Фундаментальные ключи идентичности Reticulum представляют собой 512-битные наборы ключей на эллиптических кривых
- Совершенная прямая секретность доступна для всех типов связи, как для отдельных пакетов, так и для соединений
- Reticulum использует следующий формат для зашифрованных токенов:
- Эфемерные ключи на пакет и для соединений, полученные из обмена ключами ECDH на Curve25519
- AES-256 в режиме CBC с заполнением PKCS7
- HMAC с использованием SHA256 для аутентификации
- IV генерируются с помощью os.urandom()
- Неподдельные подтверждения доставки пакетов
- Гибкая и расширяемая система интерфейсов
- Reticulum включает большое количество встроенных типов интерфейсов
- Возможность загрузки и использования пользовательских или созданных сообществом типов интерфейсов
- Легко создавайте собственные интерфейсы для связи через что угодно
- Аутентификация и сегментация виртуальной сети на всех поддерживаемых типах интерфейсов
- Интуитивно понятный и простой в использовании API
- Проще и удобнее, чем API сокетов, но при этом мощнее
- Значительно упрощает создание распределённых и децентрализованных приложений
- Надёжная и эффективная передача произвольных объёмов данных
- Reticulum может обрабатывать как несколько байт данных, так и файлы размером в несколько гигабайт
- Автоматические: упорядочивание, сжатие, координация передачи и контрольная сумма
- API очень прост в использовании и предоставляет информацию о ходе передачи
- Лёгкий, гибкий и расширяемый механизм «Запрос/Ответ»
- Эффективная установка соединений
- Полная стоимость установки зашифрованного и проверенного соединения составляет всего 3 пакета, общим объёмом 297 байт
- Низкая стоимость поддержания соединений открытыми — всего 0,44 бита в секунду
- Надёжная последовательная доставка с помощью механизмов Channel и Buffer
Эталонная реализация
Код Python в этом репозитории является эталонной реализацией Reticulum. Протокол Reticulum полностью и авторитетно определяется этой эталонной реализацией и прилагаемым руководством. Его поддерживает Mark Qvist, идентифицируемый идентичностью Reticulum <bc7291552be7a58f361522990465165c>.
Никаких производных спецификаций протокола второго порядка в настоящее время не существует и никогда не будет. Вы не получите более качественную спецификацию, чем та, которая является исполняемой, функциональной, тестируемой, развёрнутой и работающей круглосуточно по всей планете.
Не существует и никогда не будет отдельной, производной «формальной спецификации», «RFC» или чего-либо подобного для Reticulum:
Эталонная реализация является окончательной, авторитетной спецификацией.
Совместимость с протоколом Reticulum определяется как полная интероперабельность и достаточная функциональная эквивалентность с этой эталонной реализацией. Любая конкретная реализация протокола, которая этого достигает, является Reticulum. Любая, которая этого не делает, не является Reticulum.
Эталонная реализация распространяется под лицензией Reticulum License.
Протокол Reticulum был передан в общественное достояние в 2016 году.
Примеры приложений Reticulum
Если вы хотите быстро получить представление о возможностях Reticulum, ознакомьтесь с разделом Программы, использующие Reticulum руководства или следующими ресурсами:
- LXMF — это распределённый протокол передачи сообщений, устойчивый к задержкам и перебоям, построенный на Reticulum
- Протокол и фреймворк LXST обеспечивает транспорт аудио и сигналов в реальном времени через Reticulum. Он включает примитивы и утилиты для создания голосовых приложений и аппаратных устройств, таких как программа
rnphone, которую можно использовать для создания аппаратных телефонов. - Для офлайн-зашифрованной и отказоустойчивой меш-платформы связи см. Nomad Network
- Приложение Sideband для Android, Linux, macOS и Windows имеет графический интерфейс и множество расширенных функций, таких как передача файлов, изображения и голосовые сообщения, голосовые вызовы в реальном времени, распределённая телеметрическая система, картографические возможности и полная расширяемость через плагины.
- MeshChatX — это полнофункциональный клиент LXMF со многими встроенными инструментами и функциями, который также поддерживает изображения, голосовые сообщения, передачу файлов и голосовые вызовы. Он также включает встроенный браузер страниц для просмотра узлов Nomad Network.
- Вы можете использовать встроенную программу rnsh для установки удалённых сессий оболочки через Reticulum.
Где можно использовать Reticulum?
Практически на любой среде, поддерживающей хотя бы полудуплексный канал с пропускной способностью более 5 бит в секунду и MTU 500 байт. Радиомодемы, модемы, LoRa-радио, последовательные линии, TNC AX.25, любительские цифровые радиорежимы, устройства WiFi и Ethernet, оптические линии свободного пространства и подобные системы — все это примеры типов физических устройств, которые может использовать Reticulum.
Для использования с Reticulum был разработан интерфейс на основе LoRa с открытым исходным кодом под названием RNode. Его можно собрать самостоятельно или приобрести как готовый приёмопередатчик, которому требуется только USB-подключение к хосту.
Reticulum также может быть инкапсулирован поверх существующих IP-сетей, поэтому ничто не мешает вам использовать его через проводной Ethernet, локальную WiFi-сеть или Интернет, где он будет работать так же хорошо. Фактически, одним из сильных сторон Reticulum является то, как легко он позволяет объединять различные среды в самонастраивающуюся, отказоустойчивую и зашифрованную меш-сеть, используя любую доступную смесь инфраструктур.
В качестве примера: можно настроить Raspberry Pi, подключённый одновременно к LoRa-радио, TNC пакетного радио и WiFi-сети. После настройки интерфейсов Reticulum позаботится обо всём остальном, и любое устройство в WiFi-сети сможет связываться с узлами на стороне LoRa и пакетного радио, и наоборот.
С чего начать?
Лучший способ начать работу со Reticulum Network Stack зависит от того, что вы хотите сделать. Полные подробности и примеры можно найти в разделе Быстрый старт Руководства по Reticulum.
Чтобы просто установить Reticulum и связанные утилиты в вашу систему, проще всего использовать pip.
Затем вы можете запустить любую программу, использующую Reticulum, или запустить Reticulum как системную службу с помощью
утилиты rnsd.```bash
pip install rns
Если вы используете операционную систему, которая блокирует обычную установку пакетов пользователем через `pip`,
вы можете вернуть `pip` к нормальному поведению, отредактировав файл `~/.config/pip/pip.conf`
и добавив следующую директиву в раздел `[global]`:```text
[global]
break-system-packages = true
Альтернативно, вы можете использовать инструмент pipx для установки Reticulum в изолированной среде:```bash
pipx install rns
При первом запуске Reticulum создаст файл конфигурации по умолчанию, обеспечивающий базовое подключение к другим узлам Reticulum, которые могут быть доступны локально. Файл конфигурации по умолчанию содержит несколько примеров и ссылок для создания более сложной конфигурации.
Если у вас старая версия `pip` в системе, возможно, потребуется сначала обновить её с помощью `pip install pip --upgrade`. Если у вас ещё не установлен `pip`, вы можете установить его с помощью менеджера пакетов вашей системы командой `sudo apt install python3-pip` или аналогичной.
Более подробные примеры расширения связи через множество сред, таких как пакетное радио или LoRa, последовательные порты, или через быстрые IP-каналы и Интернет с использованием интерфейсов UDP и TCP, смотрите в разделе [Поддерживаемые интерфейсы](https://markqvist.github.io/Reticulum/manual/interfaces.html) [Руководства по Reticulum](https://markqvist.github.io/Reticulum/manual/).
## Включённые утилиты
Reticulum включает ряд полезных утилит для управления вашими сетями, просмотра состояния и информации, а также других задач. Вы можете узнать больше об этих программах в разделе [Включённые служебные программы](https://markqvist.github.io/Reticulum/manual/using.html#included-utility-programs) [Руководства по Reticulum](https://markqvist.github.io/Reticulum/manual/).
- Системный демон `rnsd` для запуска Reticulum как постоянно доступного сервиса
- Утилита состояния интерфейсов `rnstatus`, отображающая информацию об интерфейсах
- Инструмент поиска и управления путями `rnpath`, позволяющий просматривать и изменять таблицы маршрутов
- Инструмент диагностики `rnprobe` для проверки связности с адресатами
- Простая программа передачи файлов `rncp`, упрощающая передачу файлов между системами
- Утилита управления идентификацией и шифрования `rnid` позволяет управлять идентификаторами и шифровать/дешифровать файлы
- Программа `rnsh` позволяет устанавливать полностью интерактивные сеансы оболочки с удалёнными системами
- Программа удалённого выполнения команд `rnx` позволяет запускать простые команды и программы и получать вывод с удалённых систем
- Программа `rngit` предоставляет полноценный узел Git с несколькими репозиториями для обслуживания репозиториев через Reticulum
- Включённый помощник `git-remote-rns` позволяет взаимодействовать с репозиториями Git через Reticulum
Все инструменты, включая `rnx` и `rncp`, работают надёжно и хорошо даже по каналам с очень низкой пропускной способностью, таким как LoRa или пакетное радио. Для полнофункциональных удалённых оболочек через Reticulum также ознакомьтесь с программой [rnsh](https://github.com/acehoss/rnsh).
## Поддерживаемые типы интерфейсов и устройства
Reticulum реализует ряд обобщённых типов интерфейсов, которые охватывают большую часть коммуникационного оборудования, с которым Reticulum может работать. Если ваше оборудование не поддерживается, [просто реализовать собственный модуль интерфейса](https://markqvist.github.io/Reticulum/manual/interfaces.html#custom-interfaces).
Запросы на добавление пользовательских интерфейсов с благодарностью принимаются, при условии, что они общественно полезны и хорошо протестированы в реальных условиях.
В настоящее время поддерживаются следующие встроенные интерфейсы:
- Любое Ethernet-устройство
- LoRa с использованием [RNode](https://unsigned.io/rnode/)
- TNC для пакетного радио (с AX.25 или без)
- KISS-совместимые аппаратные и программные модемы
- Любое устройство с последовательным портом
- TCP через IP-сети
- UDP через IP-сети
- Внешние программы через stdio или каналы
- Пользовательское оборудование через stdio или каналы
## Производительность
Reticulum нацелен на *очень* широкий рабочий диапазон производительности, но уделяет приоритет функциональности и производительности на низкоскоростных средах. Цель состоит в том, чтобы обеспечить динамический диапазон производительности от 250 бит в секунду до 1 гигабита в секунду на обычном оборудовании.
В настоящее время рабочий диапазон производительности составляет примерно от 150 бит в секунду до 500 мегабит в секунду, при этом более быстрые физические среды не насыщаются. Производительность выше текущего уровня предназначена для будущих обновлений, но в данный момент не имеет высокого приоритета.
## Текущее состояние
Все основные функции протокола реализованы и работают, но, вероятно, будут добавлены новые по мере изучения и понимания реального использования. API и формат передачи данных можно считать стабильными.
## Зависимости
Установка пакета `rns` по умолчанию требует только двух внешних зависимостей, перечисленных ниже. Почти все системы и дистрибутивы имеют готовые пакеты для этих зависимостей, и при установке пакета `rns` с помощью `pip` они также будут загружены и установлены.
- [PyCA/cryptography](https://github.com/pyca/cryptography)
- [pyserial](https://github.com/pyserial/pyserial)
В более необычных системах и в некоторых редких случаях может быть невозможно установить или даже скомпилировать один или несколько из вышеуказанных модулей. В таких ситуациях вы можете использовать пакет `rnspure`, который не требует внешних зависимостей для установки. Обратите внимание, что содержимое пакетов `rns` и `rnspure` *идентично*. Единственное отличие состоит в том, что пакет `rnspure` не указывает зависимостей, необходимых для установки.
Независимо от того, как установлен и запущен Reticulum, он будет загружать внешние зависимости только в том случае, если они *нужны* и *доступны*. Например, если вы хотите использовать Reticulum в системе, которая не поддерживает [pyserial](https://github.com/pyserial/pyserial), это вполне возможно сделать с помощью пакета `rnspure`, но Reticulum не сможет использовать интерфейсы на основе последовательного порта. Все остальные доступные модули по-прежнему будут загружаться при необходимости.
**Пожалуйста, обратите внимание!** Если вы используете пакет `rnspure` для запуска Reticulum в системах, которые не поддерживают [PyCA/cryptography](https://github.com/pyca/cryptography), важно, чтобы вы прочитали и поняли раздел [Криптографические примитивы](#cryptographic-primitives) этого документа.
## Начальное подключение
Reticulum — это не услуга, на которую вы подписываетесь, и не единая глобальная сеть, к которой вы «присоединяетесь». Reticulum предоставляет функциональность для обнаружения доступных публичных интерфейсов через саму сеть, а более широкое сообщество предоставило различные каталоги общедоступных точек входа для начального подключения.
Чтобы узнать, как установить начальное подключение через Reticulum, прочитайте раздел [Начальное подключение](https://reticulum.network/manual/gettingstartedfast.html#bootstrapping-connectivity) руководства.
Если вы уже имеете общее представление о том, как это работает, вы можете использовать сайты, управляемые сообществом, такие как [directory.rns.recipes](https://directory.rns.recipes/) и [rmap.world](https://rmap.world), чтобы найти определения интерфейсов для начального подключения к глобальной распределённой магистрали Reticulum.
## Публичная тестовая сеть
***Важно!** Исторически сложилось так, что тестовая сеть, ориентированная на разработчиков, была предоставлена самим проектом Reticulum. Поскольку количество глобальных узлов и точек входа Reticulum достигло значительного числа, эта публичная тестовая сеть, включая точку входа Amsterdam Testnet, была выведена из эксплуатации. Если у вас всё ещё есть экземпляры, которые полагались на эту точку входа для подключения, переходите на использование распределённой магистрали. Reticulum теперь включает полную систему обнаружения интерфейсов и начального подключения в сети. Прочитайте раздел [Начальное подключение](https://reticulum.network/manual/gettingstartedfast.html#bootstrapping-connectivity) руководства для получения указаний.*
## Поддержка Reticulum
Чтобы это стало возможным, мне нужна ваша помощь. Пожалуйста, поддержите дальнейшее развитие открытых, свободных и приватных систем связи, сделав пожертвование через один из следующих каналов:
- Monero: ```
84FpY1QbxHcgdseePYNmhTHcrgMX4nFfBYtz2GKYToqHVVhJp8Eaw1Z1EedRnKD19b3B8NiLCGVxzKV17UMmmeEsCrPyA5w
- Биткоин ```
bc1pgqgu8h8xvj4jtafslq396v7ju7hkgymyrzyqft4llfslz5vp99psqfk3a6
- Ethereum ```
0x91C421DdfB8a30a49A71d63447ddb54cEBe3465E
Liberapay: https://liberapay.com/Reticulum/
- Ko-Fi: https://ko-fi.com/markqvist
Криптографические примитивы
Ретикулюм использует простой набор эффективных, надёжных и проверенных криптографических примитивов с широкодоступными реализациями, которые могут быть использованы как на универсальных процессорах, так и на микроконтроллерах.
Одной из главных причин выбора этого конкретного набора примитивов является то, что они могут быть реализованы безопасно с относительно небольшим количеством подводных камней практически на всех современных вычислительных платформах.
Перечисленные здесь примитивы являются авторитетными. Всё, что заявляет о себе как о Ретикулюме, но не использует эти точные примитивы, не является Ретикулюмом и, возможно, является преднамеренно скомпрометированным или ослабленным клоном. Используемые примитивы:
- Ключи идентификации Ретикулюма — это 512-битные наборы ключей Curve25519
- 256-битный ключ Ed25519 для подписей
- 256-битный ключ X25519 для обмена ключами ECDH
- HKDF для вывода ключей
- Зашифрованные токены основаны на спецификации Fernet
- Эфемерные ключи, полученные из обмена ключами ECDH на Curve25519
- HMAC с использованием SHA256 для аутентификации сообщений
- Векторы инициализации должны генерироваться с помощью
os.urandom()или лучше - AES-256 в режиме CBC с заполнением PKCS7
- Поля версии Fernet и метки времени отсутствуют
- SHA-256
- SHA-512
В конфигурации установки по умолчанию примитивы X25519, Ed25519
и AES-256-CBC предоставляются библиотекой OpenSSL
(через пакет PyCA/cryptography).
Хеш-функции SHA-256 и SHA-512 предоставляются стандартным Python
модулем hashlib. Примитивы HKDF,
HMAC, Token и функция заполнения PKCS7 всегда
предоставляются следующими внутренними реализациями:
Ретикулюм также включает полную реализацию всех необходимых примитивов на чистом Python. Если OpenSSL и PyCA недоступны в системе при запуске Ретикулюма, Ретикулюм вместо этого будет использовать внутренние чисто-питоновские примитивы. Тривиальным следствием этого является производительность: бэкенд OpenSSL работает гораздо быстрее. Однако наиболее важным следствием является потенциальная потеря безопасности при использовании примитивов, которые не прошли такого же объёма проверок, тестирования и рецензирования, как примитивы из OpenSSL.
Обратите внимание, что по умолчанию при установке Ретикулюма требуется, чтобы OpenSSL и
PyCA были также автоматически установлены, если они ещё не доступны. Использовать чисто-питоновские
примитивы можно только в том случае, если это требование было специально
переопределено пользователем, например, установкой пакета rnspure вместо
обычного пакета rns, или запуском напрямую из локального исходного кода.
Если вы хотите использовать внутренние чисто-питоновские примитивы, настоятельно рекомендуется хорошо понимать риски, которые это несёт, и принять обоснованное решение о том, приемлемы ли эти риски для вас.
Ретикулюм — относительно молодое программное обеспечение, и к нему следует относиться соответственно. Хотя он был создан с учётом передовых практик криптографии в первую очередь, он не проходил внешний аудит безопасности, и в нём вполне могут быть ошибки, нарушающие конфиденциальность или безопасность. Если вы хотите помочь или спонсировать аудит, пожалуйста, свяжитесь с нами.
Благодарности и признательность
Ретикулюм может существовать только благодаря горе открытого исходного кода, на которой он был построен, вкладу всех участников и всех, кто поддерживал проект на протяжении многих лет. Всем, кто помог, огромное спасибо.
Ряд других модулей и проектов либо являются частью Ретикулюма, либо используются им. Искренняя благодарность авторам и участникам следующих проектов:
- PyCA/cryptography, Лицензия BSD
- Pure-25519 от Brian Warner, Лицензия MIT
- Pysha2 от Thom Dixon, Лицензия MIT
- Python AES-128 от Or Gur Arie, Лицензия MIT
- Python AES-256 от BoppreH, Лицензия MIT
- Curve25519.py от Nicko van Someren, Общественное достояние
- I2Plib от Viktor Villainov
- PySerial от Chris Liechti, Лицензия BSD
- Configobj от Michael Foord, Nicola Larosa, Rob Dennis & Eli Courtwright, Лицензия BSD
- ifaddr от Stefan C. Mueller, Лицензия MIT
- Umsgpack.py от Ivan A. Sergeev
- rnsh от Aaron Heise
- Python