- PVSM.RU - https://www.pvsm.ru -

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

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


image

Ранее [2] мною были рассмотрены компоненты, необходимые для построения такой системы. Вкратце, для работы в сети I2P необходим маршрутизатор, реализующий следующие функции:

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

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

  1. HTTP прокси
  2. I2P тоннели, представляющие собой отображения адресов на TCP порты локальной машины
  3. SAM — командный интерфейс. Рассмотрим его более подробно.

Протокол SAM

SAM [4](Simple Anonymous Messaging) в течении долгого времени был фактически единственным протоколом, пригодным для полноценного взаимодействия с I2P из C++ приложений. Точнее говоря, есть еще BOB [5], фактически реализующий ту же самую концепцию, но распространённый гораздо меньше чем 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/ [6]~i2p.packages/+archive/ubuntu/i2p

для Debian
deb.i2p2.no/ [7]

Для все остальных платформ компилировать из исходников отсюда [8].
Требуются библиотеки crypto++ и boost.

Автор: orignal

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-3/72110

Ссылки в тексте:

[1] i2pd: https://github.com/PrivacySolutions/i2pd

[2] Ранее: http://habrahabr.ru/post/205320/

[3] здесь: http://habrahabr.ru/post/206160/

[4] SAM: https://geti2p.net/en/docs/api/samv3

[5] BOB: https://geti2p.net/en/docs/api/bob

[6] launchpad.net/: https://launchpad.net/

[7] deb.i2p2.no/: http://deb.i2p2.no/

[8] отсюда: https://github.com/PrivacySolutions/i2pd/releases/tag/0.1.0

[9] Источник: http://habrahabr.ru/post/240815/