Reticulum Network
Джерело матеріалу: Персональний блог UT3USW
Reticulum - відкритий мережевий стек, заснован ий на криптографічних алгоритмах, для побудови локальних і глобальних мереж на доступному обладнанні. Reticulum може працювати навіть в умовах великої затримки та низьких пропускних здатностей. Так нам каже офіційний сайт.

Отже, це набір інструментів для побудови приватних мереж. Ретікулюм якісно відрізняє кількість підтримуваних інтерфейсів, включаючи i2p та низку радіомодемів. В той час як VPN сервіси, на кшталт wireguard, потребують наявного підключення до інтернету - reticulum створений працювати по радіо на швидкості від 5біт/сек. Звісно така гнучкість має свою ціну - поріг входу в reticulum достатньо крутий, ком'юніті менше і велика кількість аспектів відверто сира та потребує від користувача навичок та розуміння. Розглянемо коротко протоколи, які роблять можливим це все. Якщо вас цікавить суто використання - сміливо пропускайте наступний розділ
Автор: UT3UMS
Основи протоколу Reticulum
Замість концепції адрес та портів із стеку TCP/IP, ретікулюм використовує поняття призначення (destination). Він вираховується як SHA-256 хеш з деяких параметрів призначення та обрізається до 16 байт (128біт), наприклад e28abb8404ff41936bff8ecee0ab3234. Призначення існують чотирьох типів:
- Single: пакети від одного відправника одному отримувачу. Шифруються ефемерними похідними ключами від ECDH. Такі повідомлення можуть читати лише автора та адресат
- Plain: дешифровані повідомлення, призначені декільком отримувачам. Оскільки адресація мережі базується на шифруванні пакетів. Тому пакети з plain призначенням ніколи не транспортуються і доступні лише безпосереднім сусідам. Використовується для широкого мовлення публічної інформації, як ото маяки, публічна телеметрія, анонси, тощо.
- Group: дані, що надсилаються на це
призначенняшифруються симетричним ключем. Тому вони доступні для читання всім, хто володіє цим ключем. На даний момент такіпризначеннятеж не транспортуються, проте розробники плануються змінити це в майбутньому - Link: створює віртуальний канал типу
Singleчерез декілька стрибків. По суті VPN в рамках reticulum, але може працювати і без стрибків. З'єднання типуLinkдає ширше апі, надійнішу доставку великих об'ємів данних, forward secrecy, initiator anonymity та багато іншого.
Окрім цього призначення можуть мати зручне ім'я full name, традиційно воно записується у точечному форматі, як домени в мережі інтернет. Проте ці імена не унікальні, різні ноди з однаковим іменем матимуть різний хеш та призначення.
В reticulum мережі не передбачено центрального ядра чи одного джерела істини. Для того щоб бути доступними, ноди періодично відправляють спеціальний пакет announce на всі доступні інтерфейси. Цей пакет містить:
- Хеш призначення оголошувача
- Публічний ключ оголошувача
- Дані що залежать від конкретного застосування, так, ви можете додати, наприклад, поле статусу або опису своєї ноди
- Випадковий бінарний блоб, що робить кожний новий анонс унікальним
- Підпис Ed25519 на вищезазначену інформа цію, що підтверджує автентичність
Детальніше про механізм анонсу можна почитати тут
З використання асиметричного шифрування випливає наявність ідентичностей - Identities. Кожне призначення прив'язане до ідентичності, проте одна ідентичність може мати декілька адрес призначень. Ідентичність не обов'язково визначає людину чи акаунт, це абстракція сутності, яка може виконувати дії, або дії можуть бути виконані відносно неї.
Для більш стабільної роботи системи передбачено особливий два типи роботи нод - reticulum instance та transport node. До першої категорії відноситься переважна більшість всіх нод в мережі. Ноди транспортного типу схожі на floodfill роутери мережі i2p - вони допомагають адресації та, інколи, транспортуванню пакеті по мережі.
Ретікулюм підтримує велику кількість інтерфейсів:
- TCP: клієнт та сервер
- UDP: з можливістю broadcast
- I2P: за умови запущеного роутеру, ретікулюм згенерує собі нову i2p адресу і в подальшому буде слухати вхдіний трафік на цій адресі
- Послідовний інтерфейс: ретікулюм працюватиме по UART, що може бути корисно для специфічного обладнання, на кшталт IrDA.
- KISS: ретікулюм може працювати з будь-якими радіомодемами та TNC що підтримуються протокол KISS.
- AX.25 KISS: те саме, але кожен пакет ретікулюму додатково інкапсулюється у AX.25, корисно для великої кількості радіолюбительского пакетного обладнання та мереж
- PIPE: ретікулюм відправлятиме всі пакети на stdin вказаної програми та очікуватиме в stdout вхідний трафік
- RNode: спеціальний тип інтерфейсу для роботи через LoRa пристрої. Розробка пристроїв, які називаються RNode, підтримується спільнотою reticulum. Наразі існують як інструкції по DIY збірці, так і прошивки для популярних плат на базі esp32.
- Auto: автоінтерфейс, використовує UDP, потребує мінімально комутованої мережі (достатньо ethernet свіча або wifi ap) та link-local IPv6. Не потребує IP інфраструктури, типу DHCP.
Досвідченим поціновувачам p2p та overlay мереж, ймовірно, reticulum нагадав дві класичні ініціативи - i2p та gnunet.
Структура пакету
| HEADER 2 bytes | ADDRESSES 16/32 bytes | CONTEXT 1 byte | DATA 0-465 bytes |
-
[HEADER 2 байти]
- Байт 1: [Флаг IFAC], [Тип заголовка], [Тип передачі], [Тип призначення], [Тип пакету]
- Байт 2: Кількість хопів
-
[АДРЕСИ 16/32 байти]
- Кожна адреса: 16 байт
- Поле HEADER визначає, чи містить поле АДРЕСИ 1 або 2 адреси
- Адреси є хешами SHA-256, обрізаними до 16 байт
-
[КОНТЕКСТ 1 байт]
- Використовується Reticulum для визначення контексту пакета
-
[ДАНІ 0-465 байт]
- Містить корисне навантаження пакету
Детальніше дивіться в офіційній документації
RNS - Reticulum Network Stack
На даний момент, основна реалізація reticulum написана мовою python. Встановити його можна через pip або pipx останній самостійно створить віртуальне середовище під кожну установку і не зламає системі залежності пітона - pip install rns або pipx install rns. Звісно ви можете встановити його самостійно - Releases · markqvist/Reticulum.
Набір утиліт чимось подібний до того, чим ми звикли користуватися в TCP/IP до Layer3.
rnsd: Головний службовий демон стеку. Має корисного ключаrnsd --exampleconfigдля бутстрпаінгу конфігураційних файлівrnstatus: Статистика по інтерфейсам, аналогip aзі світу TCP/IP. Приймає фільтр імені інтерфейса в якості необов'язкового параметра:rnstatus -A RNodernid: Менеджмент ідентичностей і дотичний до цього криптографічний функціонал: розрахунок хешів призначень, шифрування/дешифрування файлів та повідомлень.rnpath: Перевірка маршруту до заданого призначення, аналогtraceroute. Приклад:rnpath 81c987e99b3cf649c3957942355085barnprobe: Аналог утилітиping, з тою від мінністю що призначення не відповідають на пробу, це конфігурується параметромrespond_to_probesв основному конфізі. Якщо доступно, проба також відображає SNR та RSSIrncp: Як зрозуміло з назви, це утиліта для передачі файлів між нодами. Для роботи, на приймаючій стороніrncpмає бути запущений з ключем--listenrnx: Віддалене виконання команд, можливе під'єднання в режимі псевдо-шеллуrnodeconf: Утиліта для прошивки і налаштування LoRa-терміналів RNode.rnodeconf --autoinstallзапустить конфігуратор і прошиє під'єднану плату у режимі майстра.
Як цим користуватися?
Загалом, reticulum створений для побудови окремих приватних мереж. Втім, для того щоб спробувати і відчути ентузіасти підтримують так званий test net - публічна мережа RNS. Щоб приєднатися до неї, необхідно створити відповідні інт ерфейси в файлі .reticulum/config:
[interfaces]
...
# TCP/IP interface to the RNS Amsterdam Hub
[[RNS Testnet Amsterdam]]
type = TCPClientInterface
enabled = yes
target_host = amsterdam.connect.reticulum.network
target_port = 4965
# TCP/IP interface to the BetweenTheBorders Hub (community-provided)
[[RNS Testnet BetweenTheBorders]]
type = TCPClientInterface
enabled = yes
target_host = betweentheborders.com
target_port = 4242
# Interface to Testnet I2P Hub
[[RNS Testnet I2P Hub]]
type = I2PInterface
enabled = yes
peers = g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq.b32.i2p
Детальніше про налаштування інших інтерфейсів можна прочитати тут
Запустіть rnsd в консолі і ви побачите
[2024-08-03 00:00:04] [Debug] Started shared instance interface: Shared Instance[37428]
[2024-08-03 00:00:04] [Verbose] Bringing up system interfaces...
[2024-08-03 00:00:05] [Debug] Establishing TCP connection for TCPInterface[RNS Testnet Dublin/dublin.connect.reticulum.network:4965]...
[2024-08-03 00:00:05] [Info] Bringing up I2P tunnel to I2PInterfacePeer[RNS Testnet I2P Hub A to g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq.b32.i2p], this may take a while...
[2024-08-03 00:00:10] [Error] Initial connection for TCPInterface[RNS Testnet Dublin/dublin.connect.reticulum.network:4965] could not be established: timed out
[2024-08-03 00:00:10] [Error] Leaving unconnected and retrying connection in 5 seconds.
[2024-08-03 00:00:10] [Debug] Establishing TCP connection for TCPInterface[RNS Testnet BetweenTheBorders/betweentheborders.com:4242]...
[2024-08-03 00:00:10] [Debug] TCP connection for TCPInterface[RNS Testnet BetweenTheBorders/betweentheborders.com:4242] established
...