Pull to refresh

«Пурпурный» I2P — окно в мир C++ приложений

Reading time 3 min
Views 37K
Известно, что официальный I2P написан на Java, что само по себе отталкивает потенциальных пользователей, тем самым снижая полулярность сети, чем могла бы быть. Кроме того Java приложения достаточно требовательны к ресурсам, потому запуск I2P на слабых устройствах сопряжен с трудностями, а порой и невозможен. Также выяснилось что Java в Африке не та же самая Java, и поддержка стойкой криптографии зависит от страны, из-за чего пришлось отложить массовый переход на ECDSA.
Поэтому реализация I2P на C++ всегда была актуальной задачей. Из множества попыток «пурпурный I2P» (Purple I2P) на настоящий момент является наиболее успешной и пригодной для практического использования. Название обусловлено цветом рубашки на иконке I2P, чтобы отличать от официального I2P, где цвет — красный и обозначает семейство приложений, использующих данную реализацию I2P. i2pd же представляет собой I2P маршрутизатор общего назначения.


image

Ранее мною были рассмотрены компоненты, необходимые для построения такой системы. Вкратце, для работы в сети I2P необходим маршрутизатор, реализующий следующие функции:
  • Транспорт, отвечающий за прямые соединения с другими узлами. Как правило через Интернет, но может быть и через другие сети, например, Тор
  • Построение и пересылка данных через тоннели
  • Поиск и поддержка списка других узлов в актуальном состоянии
  • Передача транзитного трафика других участников

Если есть необходимость обмениваться собственными данными, то на маршрутизаторе необходимо размещать адреса, для работы которых нужны дополнительные протоколы, рассмотренные здесь. Однако для взаимодействия с клиентами одной передачи данных недостаточно — необходимо иметь возможность управлять локальным адресами и уметь обращаться к удаленным. В официальном I2P это реализовано в виде набора отдельных внешних приложений, в i2pd же эти службы встроенные. На данный момент реализованы:
  1. HTTP прокси
  2. I2P тоннели, представляющие собой отображения адресов на TCP порты локальной машины
  3. SAM — командный интерфейс. Рассмотрим его более подробно.


Протокол SAM


SAM(Simple Anonymous Messaging) в течении долгого времени был фактически единственным протоколом, пригодным для полноценного взаимодействия с I2P из C++ приложений. Точнее говоря, есть еще BOB, фактически реализующий ту же самую концепцию, но распространённый гораздо меньше чем SAM.
Рекомендуемый официальным I2P протокол I2CP для этих целей малопригоден, поскольку является протоколом более низкого уровня, и использует внешнюю реализацию потоков, написанную тоже на Java. C++ -ой версии на данный момент нет. В дальнейшем планируется оформить реализацию потоков из i2pd в виде отдельной библиотеки, работающей через I2CP.
Для SAM же существует готовая для использования C++-ая библиотека i2psam, активно используемая криптовалютами для сокрытия своего трафика.
Несмотря на недостатки и критику, SAM является важнейшим протоколом в «пурпурном» I2P, поскольку связка существующего C++ приложения с использованием SAM и i2pd позволяет немедленно отказаться от использования Java без дополнительных переделок.
Наиболее популярные из них:
  1. I2P-Messenger
  2. iMule
  3. Bitcoin-I2P

В целом протокол вполне оправдывая свое названия, с точки зрения клиента представляя собой сокеты, работающие либо в командном режиме, либо в режиме передачи данных. Если клиент удаляет сокет, то соответствующая ему I2P конструкция удаляется. Работа начинается с создания локального адреса с заданными клиентом ключами, либо временного со сгенерированными случайным образом ключами. Затем либо может, используя этот адрес, установить соединение с удаленным адресом, либо ждать следующего входящего соединения от удаленного адреса. После этого сокет переходит в режим передачи данных.
Подобный интерфейс может быть выполнен в виде API и использован прямо из приложения, без необходимости использовать внешний маршрутизатор, и распространяться в виде готового решения, не заставляя конечного пользователя в детали настроек I2P.

Что планируется реализовать


  1. I2CP, чтобы Java приложения могли работать через i2pd
  2. Профилировщик узлов, чтобы строить более быстрые и надежные тоннели
  3. Обновляемую адресную книгу
  4. Дейтаграммы
  5. Режим floodfill-а


Релиз 0.1.0


Собственно основная мысль данной статьи в том, что выпущен первый стабильный релиз i2pd, содержащий вышеописанную функциональность.

Бинарники для Ubuntu:
launchpad.net/~i2p.packages/+archive/ubuntu/i2p

для Debian
deb.i2p2.no

Для все остальных платформ компилировать из исходников отсюда.
Требуются библиотеки crypto++ и boost.
Tags:
Hubs:
+33
Comments 25
Comments Comments 25

Articles