Веб-технологии

Анонимность в сети. Часть 3. Сети I2P (теория)

i2p 1

I2P - это как Tor, только лучше. Хотя обе сети во многом схожи, они используют абсолютно разные подходы и служат разным целям. У обеих сетей, помимо возможности доступа в Интернет есть внутренняя сеть, но в Tor акцент сделан именно на работу с внешней сетью, это эдакий "продвинутый прокси", а в I2P - с внутренней. Хотя в I2P тоже есть возможность выхода в "большую" сеть через шлюзы, их число ограничено, поддерживаемые протоколы ограничены и выходной шлюз по-прежнему видит незашифрованные данные. Зато в своей сети I2P не выдаст вас ни под какими пытками, являясь почти идеальным примером работающей анонимной сети, гарантирующей конфиденциальность пользователя и передаваемых данных. "Почти идеальной", потому что I2P жутко тормозной, половина сервисов лежит месяцами, а в том, как сама сеть работает, сам чёрт ногу сломит. Ну а мы попытаемся объяснить.

Вновь представим, что мы состоим в тайном клубе, в котором все участники знают адреса друг друга. Когда вам понадобилось связаться со второй бабушкой из, например, Новосибирска, вы взяли список с адресами участников, выбрали десяток и послали им ключи от будущих чемоданов. Затем вы написали своё письмо на трёх клочках бумаги и сложили их в три разных чемодана, на которых налепили адрес бабушки и закрыли их на замок. Затем ещё по чемодану, и ещё по адресу трёх участников клуба. И ещё пару раз, после чего выслали три чемодана по адресам трех участников, которые откроют их своими ключами и отправят по адресу следующего узла. Даже когда чемоданы дойдут к бабушке, никто не узнает, очередной это узел или точка назначения. Когда цепочка дойдет до получателя, бабушка откроет три чемодана своими ключами, прочтет, напишет ответ и вышлет тем же способом, но не тем же путём. У неё тоже есть список адресов и пара сотен чемоданов в чулане. Так, грубо говоря, работает маршрутизация I2P.

Как и в Tor, в I2P нет серверов, отвечающих за работоспособность сети, и любых других централизованных точек входа. Сеть работает за счет клиентов, а ПО с открытыми исходниками отвечает за шифрование и пересылку. Сеть работает на UDP (с возможностью переключения на TCP) с видимыми IP, но это не страшно - адресами выступают хэши, а вместо DNS - DHT, из-за чего сторонний наблюдатель может, максимум, узнать, что данный IP использует I2P. В сети происходит постоянный обмен адресами (256-битными хэшами) всех участников сети. Кроме того, важным элементом сети является транзит данных. Проще говоря, большинство участников в фоновом режиме выступают "посыльными", передавая блоки зашифрованных данных и обеспечивая бесперебойную работу сети. Так как зашифрованные данные передаются через множество узлов в нескольких тоннелях, цепочки обновляются каждые 10 минут, а расшифровать и узнать адрес отправителя может только получатель. Таким образом получаем безопасность и анонимность I2P в разы выше, чем в Tor.

Как работают адреса в I2P

Если в Интернете вы заходите на сайт по его доменному имени или IP, то в I2P адресами выступают:

  1. B32/B64 адреса (о них мы расскажем немного позднее).
  2. Читаемое название сайта, привязанное к хэшу и анонимно зарегистрированное у одного из хостинг-провайдеров сети.

B64/B32-адреса по умолчанию хранятся в общей базе данных, но в реальности - повсюду. Ваш клиент постоянно синхронизируется либо с одним из адресных серверов, которые хранят в себе хэши всех ресурсов сети, либо с другими пользователями, копируя его адресную книгу. Если хэша нужного вам ресурса нет в вашей адресной книге - вы попросту не сможете на него зайти. В крайнем случае, есть jump-сервисы и функция автоматического поиска, но они работают крайне медленно.

Адреса серверов в терминологии I2P называются "подписками". В сети их много, и они публичны. По умолчанию подпиской выступает официальный "http://www.i2p2.i2p/hosts.txt", но он обновляется крайне редко, поэтому разработчики советует добавить ещё пару адресов в список подписок. К примеру:

  1. http://i2host.i2p/cgi-bin/i2hostetag
  2. http://stats.i2p/cgi-bin/newhosts.txt
  3. http://no.i2p/export/alive-hosts.txt

После их добавления ваш I2P-клиент периодически будет проверять файл с адресами на сайтах и добавлять новые адреса в собственную адресную книгу.

i2p 2

Пополнять адресную книгу можно самостоятельно. Всего их несколько типов:

  1. Маршрутизаторная - в неё добавляются адреса, полученные из подписок.
  2. Публикуемая - видна всем пользователям сети. Если публикация включена, то к вам будут подключатся другие пользователи и получать новые адреса.
  3. Приватная - её видите только вы.
  4. Основная - сюда вы сами добавляете 64-битные хэши сайтов.

i2p 3

Если вам известно имя сайта, но вы не знаете адрес Base64, то поищите его в списках inr.i2p, одного из крупнейших "доменных регистраторов" I2P.

Base64 и Base32

При использовании I2P у вас гарантированно возникнет вопрос: "Что такое и зачем нужны Base64 и Base32 адреса, и в чем их отличие?".

Base64 и Base32 - математические кодировки с 64-ю и 32-мя поддерживаемыми символами. Аналогом IP-адреса и полным сетевым именем ресурса в I2P является именно Base64-адрес длиной 516 символов, которые включают в себя:

  1. Полный открытый ключ ресурса для доступа извне.
  2. Ключ подписи.
  3. Сертификат.
  4. B64-адрес в I2P всегда заканчивается на "АААА".

Base32-адрес - более короткий и используется для немного других целей. Он имеет форму "[52 символа].b32.i2p" в которой 52 символа - хэш-сумма полного Base64-адреса. Именно поэтому в адресную книгу можно добавить только полный Base64-адрес.

Не вдаваясь в подробности, использование Base32-адресов обусловлено тем, что они короче, а так как Base64-адреса нужны не всегда, быстрее орудовать именно Base32-адресом. Одновременно, его относительно удобно использовать людям (всего-то 52 символа), и роутер может распознать его и найти по нему полный Base64-адрес.

Как работают криптосистемы с открытым ключом

"Трое могут сохранить секрет, если двое из них мертвы."

Чуть выше мы говорили об "Открытом ключе", расположенном в Base64-адресе. В I2P используется уйма различных алгоритмов шифрования и протоколов, управляющих их слаженной работой. Рассматривать их подробно мы не будем, но раз уж речь пошла о криптографии, уместно будет вкратце объяснить, как работают криптосистемы с открытым ключом (помимо I2P, они используются повсеместно).

К примеру, существует два узла "А" и "B", и им необходимо передать друг другу зашифрованное сообщение. Для этого оба узла формируют некий "Открытый ключ", а на его основе "Закрытый ключ" - оба ключа математически связаны друг с другом. Закрытый ни в коем случае нельзя передавать, а открытый - можно даже лично отправить недоброжелателям, жаждущим увидеть вашу скрытую информацию. Когда узлам нужно связаться, узел "А" просит у узла "B" его открытый ключ, и на его основе шифрует своё сообщение. Важный момент - данные можно только зашифровать по открытому ключу, но не расшифровать.

Далее зашифрованный пакет данных передается узлу "B". Если его украдут по пути, расшифровать его без закрытого ключа будет невероятно сложно. Если же данные дойдут до узла "В", он запросто расшифрует их своим закрытым ключом.

NetDB, туннели и маршрутизация

Помимо базы с Base32/64-адресами ресурсов, есть NetDB - ещё одна база с данными о всех устройствах в сети, необходимая для обеспечения связи между роутерами и построения туннелей.

NetDB хранится распределенно. То есть, когда вы в первый раз запустили I2P-клиент, он посылает запрос на получение базы данных от случайно выбранного активного пира. База данных сохраняется на локальном компьютере, вы получаете больше активных пиров, ещё несколько запросов и вуаля! У вас есть полная база данных по всей сети.

Откуда клиент знает адрес первого пира? Часть базы данных с Base64-адресами пиров выложена в Интернете, и несколько доверенных адресов "вшиты" в I2P-клиент. Именно на них роутер посылает свой первый запрос для интеграции в I2P-сеть.

i2p 4

RouterInfo и LeaseSet

NetDB хранит в себе две разновидности данных: RouterInfo и LeaseSet. В сети I2P существует жесткое распределение между абстрактным "роутером" и конкретной "точкой назначения", а потому и информация для работы с ними нужна разная. Грубо говоря, RouterInfo содержит информацию о том, как связаться с роутерами, чтобы построить через них туннель, а LeaseSet - информацию для налаживания связи и шифрования для конечной точки туннеля, например, I2P-сайт.

Все роутеры, участвующие в передаче данных, отправляют в NetDB свой RouterInfo, где содержится их адрес, транспортные данные, состояние, пропускная способность и прочее. Также есть "Точки Назначения" со своими входящими тоннелями для доступа к ним - они формируют и предоставляют по запросу свой LeaseSet, где виден их Base64-адрес вместе с хэшем, открытый ключ, а также информация о состоянии текущего входящего туннеля, время его жизни, и ещё туча различных меток и хэшей.

Высокая степень анонимности сети достигается за счет того, что тоннели всегда однонаправленные и бывают 2-х видов - входящий на приём данных и исходящий для отправления.

Чесночная маршрутизация

Итак, мы рассмотрели ключевые элементы структуры сети I2P. Так как же происходит обмен сообщениями и что за пресловутая "Чесночная маршрутизация"?

i2p 5

Когда пользователь, к примеру, Алиса хочет зайти на I2P-сайт или написать другому пользователю сообщение через почтовый сервис, происходит следующее:

  1. Сперва пользователь (Алиса) посылает запрос в NetDB и получает несколько RouterInfo с адресами подходящих для передачи пиров и формирования "Исходящего Туннеля Алисы".
  2. Аналогичным образом создается "Входящий Туннель Алисы", на который любой участник сети сможет прислать данные, зная адрес.
  3. Затем Алиса посылает запрос в NetDB, получает LeaseSet нужного сайта.
  4. Начинается передача. Алиса упаковывает данные в пакет - своеобразный "чеснок" с несколькими "чесночинами" внутри: зашифрованные данные, инструкции по доставке со всеми адресами, необязательная дополнительная информация. "Чеснок" последовательно упаковывается в слои шифрования по открытым ключам всех участников туннеля так, чтобы раскрывая очередной слой, транзитный узел знал только адрес следующего получателя. "Транзитный Узел" знает только то, что он передает какие-то зашифрованные данные, не зная от кого, не зная конечного получателя, не зная количество "Чесночин" в "чесноке" и не зная даже, что он является частью туннеля.
  5. "Чеснок" доходит до "Входящего Туннеля Сайта", затем – до конечного получателя. Тот расшифровывает его своим закрытым ключом. Как правило, в блоке данных содержится LeaseSet отправителя, на основе которого "Сайт" сможет сформировать туннель до Алисы и прислать ответ.
  6. Время существования туннеля - 10 минут, после чего отправитель и получатель вновь обмениваются LeaseSet, меняют цепочку транзитных узлов и продолжают сессию.

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