I2P is a project to build, deploy, and maintain a network supporting secure and anonymous communication. People using I2P are in control of the tradeoffs between anonymity, reliability, bandwidth usage, and latency. There is no central point in the network on which pressure can be exerted to compromise the integrity, security, or anonymity of the system. The network supports dynamic reconfiguration in response to various attacks, and has been designed to make use of additional resources as they become available. Of course, all aspects of the network are open and freely available.

В отличие от многих других анонимизирующих сетей, I2P не пытается обеспечить анонимность, скрывая отправителя некоторого сообщения, но не получателя, или наоборот. I2P разработана для того, чтобы позволить равным пользователям I2P общаться друг с другом анонимно — и отправитель, и получатель не идентифицируемы ни друг для друга, ни для третьих лиц. Например, сегодня существуют как веб-сайты внутри I2P (позволяющие анонимно публиковать / размещать информацию), так и HTTP-прокси для обычного Интернета (позволяющие анонимно просматривать веб-страницы). Возможность запуска серверов внутри I2P очень важна, так как вполне вероятно, что любые исходящие прокси в обычный Интернет будут отслеживаться, отключаться или даже захватываться для попыток более злонамеренных атак.

Сама сеть ориентирована на сообщения - по сути, это безопасный и анонимный IP-уровень, где сообщения адресуются криптографическим ключам (Destinations) и могут быть значительно больше IP-пакетов. Некоторые примеры использования сети включают "I2P Sites" (веб-серверы, размещающие обычные веб-приложения в I2P), BitTorrent-клиент ("I2PSnark") или распределенное хранилище данных. С помощью приложения I2PTunnel мы можем передавать через I2P традиционные TCP/IP-приложения, такие как SSH, IRC, squid-прокси и даже потоковое аудио. Большинство людей не будут использовать I2P напрямую, и им даже не нужно будет знать, что они его используют. Вместо этого они будут пользоваться одним из приложений, поддерживающих I2P, или, возможно, небольшим приложением-контроллером для включения и выключения различных прокси-серверов, чтобы включить функцию анонимизации.

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

Почему?

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

Как?

На первый взгляд сеть состоит из набора узлов ("маршрутизаторов") с несколькими однонаправленными входящими и исходящими виртуальными путями ("туннелями", как описано на странице tunnel routing). Каждый маршрутизатор идентифицируется криптографическим RouterIdentity, который, как правило, является долгоживущим. Эти маршрутизаторы взаимодействуют друг с другом посредством существующих транспортных механизмов (TCP, UDP и т.д.), передавая различные сообщения. Клиентские приложения имеют свой собственный криптографический идентификатор ("Destination"), который позволяет им отправлять и получать сообщения. Эти клиенты могут подключиться к любому маршрутизатору и санкционировать временное выделение ("аренду") некоторых туннелей, которые будут использоваться для отправки и получения сообщений через сеть. I2P имеет свою собственную внутреннюю сетевую базу данных (использующая модификацию алгоритма Kademlia) для безопасного распределения маршрутизации и контактной информации.

Пример сетевой топологии

In the above, Alice, Bob, Charlie, and Dave are all running routers with a single Destination on their local router. They each have a pair of 2-hop inbound tunnels per destination (labeled 1, 2, 3, 4, 5 and 6), and a small subset of each of those router's outbound tunnel pool is shown with 2-hop outbound tunnels. For simplicity, Charlie's inbound tunnels and Dave's outbound tunnels are not shown, nor are the rest of each router's outbound tunnel pool (typically stocked with a few tunnels at a time). When Alice and Bob talk to each other, Alice sends a message out one of her (pink) outbound tunnels targeting one of Bob's (green) inbound tunnels (tunnel 3 or 4). She knows to send to those tunnels on the correct router by querying the network database, which is constantly updated as new leases are authorized and old ones expire.

If Bob wants to reply to Alice, he simply goes through the same process - send a message out one of his outbound tunnels targeting one of Alice's inbound tunnels (tunnel 1 or 2). To make things easier, most messages sent between Alice and Bob are garlic wrapped, bundling the sender's own current lease information so that the recipient can reply immediately without having to look in the network database for the current data.

To deal with a wide range of attacks, I2P is fully distributed with no centralized resources - and hence there are no directory servers keeping statistics regarding the performance and reliability of routers within the network. As such, each router must keep and maintain profiles of various routers and is responsible for selecting appropriate peers to meet the anonymity, performance, and reliability needs of the users, as described in the peer selection page.

The network itself makes use of a significant number of cryptographic techniques and algorithms - a full laundry list includes 2048bit ElGamal encryption, 256bit AES in CBC mode with PKCS#5 padding, 1024bit DSA signatures, SHA256 hashes, 2048bit Diffie-Hellman negotiated connections with station to station authentication, and ElGamal / AES+SessionTag.

Content sent over I2P is encrypted through three layers garlic encryption (used to verify the delivery of the message to the recipient), tunnel encryption (all messages passing through a tunnel is encrypted by the tunnel gateway to the tunnel endpoint), and inter router transport layer encryption (e.g. the TCP transport uses AES256 with ephemeral keys).

Сквозное (I2CP) шифрование (клиентское приложение к серверному приложению) было отключено в релизе I2P 0.6; сквозное (чесночное) шифрование (маршрутизатор клиента I2P к маршрутизатору сервера I2P) от маршрутизатора Алисы "a" к маршрутизатору Боба "h" осталось. Обратите внимание на разное использование терминов! Все данные от a до h шифруются из конца в конец, но I2CP-соединение между маршрутизатором I2P и приложениями не шифруется из конца в конец! A и h - это маршрутизаторы Алисы и Боба, а Алиса и Боб на следующей схеме - это приложения, работающие на I2P.

Многоуровневое шифрование от конца до конца

Конкретное использование этих алгоритмов описано в другом месте.

Два основных механизма, позволяющих людям, которым нужна сильная анонимность, использовать сеть, - это явно отложенные чесночные маршрутизируемые сообщения и более полные туннели, включающие поддержку объединения и смешивания сообщений. В настоящее время эти механизмы запланированы на релиз 3.0, но уже существуют чесночные маршрутизируемые сообщения без задержек и туннели FIFO. Кроме того, релиз 2.0 позволит людям устанавливать и работать за ограниченными маршрутами (возможно, с доверенными пирами), а также развертывать более гибкие и анонимные транспорты.

Были подняты некоторые вопросы относительно масштабируемости I2P, и это вполне обоснованно. Конечно, со временем будет проводиться больше анализа, но поиск и интеграция пиров должны быть ограничены O(log(N)) благодаря алгоритму базы данных сети, а сообщения из конца в конец должны быть O(1) (без масштабирования), поскольку сообщения проходят K хопов через исходящий туннель и еще K хопов через входящий туннель, причем K не больше 3. Размер сети (N) не оказывает никакого влияния.

Когда?

I2P зародился в феврале 2003 года как предложенная модификацияFreenet, чтобы позволить ему использовать альтернативные транспорты, такие как JMS, затем вырос в самостоятельный 'anonCommFramework' в апреле 2003 года, превратившись в I2P в июле, а серьезное написание кода началось в августе '03. В настоящее время I2P находится в стадии разработки, следуя дорожной карте.

Кто?

У нас маленькая команда из разных уголков мира, которая развивает проект с различных сторон. Мы очень открыты для разработчиков, которые хотят поучаствовать в проекте, а также для всех тех, кто желает помочь другими способами, такими как критика, рецензирование, тестирование, документирование, написание приложений для I2P. Вся система — это открытое программное обеспечение: маршрутизатор и большая часть SDK полностью находятся в общественном достоянии с частью кода под лицензиями BSD и Cryptix, некоторые приложения, такие как I2PTunnel и I2PSnark, имеют лицензию GPL. Почти весь код написан на Java (1.5+), хотя некоторые сторонние приложения написаны на Python и других языках. Код работает на Sun Java SE и других виртуальных машинах Java.

Где?

Всем заинтересованным следует присоединиться к нам на IRC-канале #i2p-dev (размещенному параллельно на irc.freenode.net, irc.postman.i2p, irc.echelon.i2p, irc.dg.i2p и irc.oftc.net). В настоящее время нет никаких запланированных встреч разработчиков, однако доступны архивы.

The current source is available in git.

Дополнительная информация

См. указатель для технической документации.