Содержание статьи
Наша задачка на сегодня — анонимно разместить сайт в интернете. Есть не так много технологий, которые нам в этом деле смогут помочь. Но одним из самых технологичных решений, которое предоставляет возможность анонимного хостинга, практически исключая возможность определения, где на самом деле находится сервер с файлами, является I2P.
I2P vs Tor
Итак, что такое I2P? Технологию лучше всего воспринимать как дополнительный сетевой уровень, который работает поверх привычного протокола IP и предоставляет возможности для анонимной передачи данных. В I2P используются различные виды криптографии для безопасной передачи сообщений и многочисленные pear-to-pear туннели, на основе которых обеспечивается анонимность и отказоустойчивость системы. Мы уже не раз упоминали I2P на страницах журнала, но никогда не останавливались на ее работе подробно. Да и мало кто имел с ней дело. Куда большую известность в области анонимизации получила разработка Tor. Поэтому, рассказывая про то, как работает I2P, мы будем проводить некоторые сравнения этих двух технологий.
Обе системы, I2P и Tor, используют многоуровневую криптографию, чтобы посредники не могли дешифровать содержание передаваемых через них пакетов. Единственное, что известно для каждого узла — это следующее звено в цепочке передачи данных. В то время как Tor больше сфокусирован на сохранении инкогнито клиента во время серфинга в интернете, задача I2P заключается в создании анонимной сети, объединяющей подключившихся пользователей. И хотя возможность анонимного серфинга все-таки есть (с использованием специальных шлюзов, которые имеют доступ "наружу", о чем ты можешь прочитать во врезке), главное ее назначение — это анонимный хостинг сервисов.
Речь идет в первую очередь о размещении в сети веб-сайтов, которые в терминологии I2P называются eepsites. Это чем-то напоминает концепцию Hidden Services, доступную пользователям Tor, но анонимный хостинг в I2P работает значительно быстрее. Это уже не жалкая попытка, а действительно работающая технология для размещения сайтов, надежная и устойчивая.
В I2P нет никаких центральных серверов и нет привычных DNS-серверов, но зато используется распределенная хеш-таблица DHT (Distributed Hash Table), построенная на базе Kademlia. Такой подход позволяет устранить серьезную точку отказа системы. Мы все помним историю, когда в 2007 году в Китае файрволом был перекрыт доступ к главной директории сервисов Tor. То, что I2P опирается на пиринговую технологию для обмена информацией о роутинге, позволяет избежать подобных проблем. Система, с помощью которой пользователи I2P получают информацию друг о друге, называется NetDB. Каждый участник сети является роутером, через который передается транзитный трафик, поэтому, вообще говоря, в системе нет какой-либо заметной разницы между сервером и обычным клиентом.
Адресация в I2P
Для обращения к другим роутерам и сервисам не используются IP’шники, адресация осуществляется с помощью специального криптографического идентификатора, посредством которого обозначаются как роутеры, так и конечные сервисы. К примеру, идентификатор www.i2p2.i2p (главного сайта проекта внутри сети I2P) выглядит так:
-KR6qyfPWXoN~F3UzzYSMIsaRy4udcRkHu2Dx9syXSz
[... вырезано ...]
e9NYkIqvrKvUAt1i55we0Nkt6xlEdhBqg6xXOyIAAAA
Таким образом, для точки назначения используется 516 байт в Base64. Очевидно, что подобный идентификатор едва ли можно назвать удобным. К тому же он не будет работать с некоторыми протоколами (в том числе HTTP). Поэтому I2P предлагает еще один путь для именования идентификаторов — он называется "Base 32 Names" и довольно схож с правилами составления имен .onion в сети Tor. Изначальный 516-байтовый идентификатор декодируется (с заменой некоторых символов) в исходный raw-вид. Полученное значение хешируется с помощью SHA256 и после этого кодируется в Base32. В конце концов к результату прибавляется .b32.i2p. Что получается в итоге? Вполне пригодная к использованию последовательность символов. Если проделать операцию для оригинального идентификатора www.i2p2.i2p, то получится следующее:
rjxwbsw4zjhv4zsplma6jmf5nr24e4ymvvbycd3swgiinbvg7oga.b32.i2p
С такой формой работать уже гораздо проще. В I2P нет какого-то официального аналога DNS-сервера, который выполнял бы резолвинг имен (то есть устанавливал соответствие между доменом <somename>.i2p и идентификатором), так как это была бы серьезная точка отказа всей системы. Каждая нода I2P имеет собственный набор текстовых файлов, в которых выполнен маппинг для сервисов. Эти файлы очень похожи на привычный нам конфиг HOSTS. Тем не менее, пользователь может синхронизировать свою базу "привязок" через специальный сервер подписки внутри I2P. При этом он исключительно доверяет владельцу такого сервиса, полагая, что тот предоставляет ему "правильные" идентификаторы.
Построение цепочки для передачи данных
Защитные механизмы
В I2P реализовано несколько интересных технологий для устранения возможности перехвата и подмены трафика. В то время как в Tor используется одна цепочка для выполнения коммуникаций, I2P опирается на концепции входящих ("in") и исходящих ("out") туннелей. Таким образом, запросы и ответы далеко не всегда идут по одному и тому же пути. Во время передачи сообщение подвергается многоуровневому шифрованию (сквозное, туннельное и транспортного уровня), а конечные узлы обозначаются криптованными идентификаторами. Более того, сами туннели перестраиваются каждые десять минут.
Помимо этого в I2P используется "чесночная маршрутизация" (Garlic routing). По сути, это многослойное шифрование, которое позволяет единственному сообщению (так называемому "чесноку") содержать в себе множество "зубчиков" — полностью сформированных сообщений с инструкциями для их доставки. В один "чеснок" в момент его формирования перед отправкой закладывается множество "зубчиков", являющихся зашифрованными сообщениями как нашего узла, так и чужих — транзитных. Является ли тот или иной "зубчик" в "чесноке" нашим сообщением или это чужое транзитное сообщение, которое проходит через нас, знает только тот, кто создал "чеснок". Никто иной получить эту информацию не может.
Такой сложный подход обеспечивает высокий уровень защиты данных, но при этом не ограничивает возможности использования I2P. В сети могут быть размещены самые разные сервисы: IRC, BitTorrent, eDonkey, Email. К тому же разработчики I2P предоставляют API для создания новых приложений, которые работают через защищенную сеть, но не требуют от пользователя дополнительно устанавливать и настраивать I2P-клиент.
Интересные внутренние ресурсы I2P
- inproxy.tino.i2p/status.php — постоянно обновляемый индекс eepsite, отображающий информацию о доступности того или иного сервиса;
- tracker2.postman.i2p и exotrack.i2p — крупнейшие BitTorrent-трекеры;
- hashparty.i2p — сервис для взлома хешей (LM, MD5, MYSQLSHA1, NTLM, SHA1 и так далее);
- redzara.i2p
Установка клиента
Раз уж речь зашла про установку клиента, то перейдем к практической части нашего материала. I2P написан на Java, а потому запустить приложение можно практически на любой ОС — лишь бы в системе была установлена Java-машина. Дистрибутив клиента снабжен удобным инсталлятором, который все сделает за тебя. После окончания установки перейди в каталог с приложением и запусти его демон. Все управление осуществляется через веб-оболочку, которая доступна по адресу 127.0.0.1:7657/index.jsp. С ней мы и будем работать дальше. Чтобы иметь возможность посещать ресурсы I2P и внешние ресурсы интернета (на анонимных условиях), лучше сразу прописать в браузере HTTP-прокси: 127.0.0.1:4444. Вот и вся установка. Добавить нечего.
Анонимный хостинг веб-сайта
Итак, поскольку одно из главных предназначений I2P — создание условий для полностью анонимного хостинга, то разумно начать нашу практику именно с этого момента. Сайт, размещенный внутри I2P, называется eepsite. Да, он не будет доступен широкой общественности через интернет, но к нему всегда смогут обратиться пользователи I2P и при желании сделать зеркало ресурса в глобальной Сети. При этом теоретически (и это вопрос для отдельного обсуждения, к которому мы вернемся в конце статьи) выявить твой настоящий IP-адрес будет чрезвычайно сложно. Предлагаю тебе ниже step-by-step инструкцию по размещению сайта через I2P.
- Если ты зайдешь на страницу 127.0.0.1:7658, то увидишь сайт-заглушку. Это заготовка для eepsite, которую мы и будем использовать. Все, что нужно — это отредактировать или заменить файлы в ~/.i2p/eepsite/docroot/ (Linux) и %APPDATA%I2Peepsitedocroot (Windows). Это стандартная папка для веб-демона Jetty, который был установлен вместе с I2P: именно он сейчас принимает подключения на 7658 порту. Тут надо понимать, что на данный момент это просто локальный сайт. Чтобы он стал доступен пользователям, в сети I2P для него необходимо создать соответствующий туннель.
-
К счастью, у нас есть и заготовка для туннеля. Если зайти в админку для управления туннелями (127.0.0.1:7657/i2ptunnel), то в разделе "Серверные I2P-туннели" ты увидишь запись "I2P webserver" — это как раз то, что нужно. Сейчас туннель выключен. Заходим в его настройки. Первое, на что стоит обратить внимание, это параметр "Локальный адрес назначения" (local destination) и его значение, представляющее собой что-то вроде "F94tTd-vSO7C0v~4wudVsaYV[.. вырезано...]AAAA". Эта длиннющая строка в Base64 и есть ключ, который используется для адресации внутри I2P-сети. Что-то вроде IP-адреса. Для удобства его можно куда-нибудь скопировать — он нам еще понадобится. К тому же самое время перевести его в читаемый Base32-вид (смысл этой операции мы описали выше) с помощью несложного Python-скрипта (ищи его на диске). Указав оригинальный идентификатор в качестве ключа, на выходе из скрипта мы получим ключ вроде "zeky7b4hp3hscdwovgb2vtdbvltsvpf24ushype5uoigu42p3v5q.b32.i2p". Если бы туннель сейчас был запущен, то другие пользователи могли бы к нему подключиться, используя этот адрес. Но активировать туннель рано, нужно еще позаботиться о том, чтобы к нашему сайту была возможность обращаться по доменному имени.
-
Системы DNS в I2P как таковой нет, однако есть ее заменители. Поэтому мы можем зарегистрировать для нашего eepsite доменное имя (something.i2p). Проверка, не используется ли оно кем-то еще, легко осуществляется через специальный сервис: 127.0.0.1:7657/susidns/addressbook.jsp?book=router&filter=none. Убедившись в уникальности, переходим в настройки нашего туннеля и заменим в нем стандартное значение "mysite.i2p" выбранным именем (например, xa31337xa.i2p). Не лишним здесь будет включить опцию "Автозапуск", чтобы наш сервис автоматически стартовал вместе с I2P.
-
Минимальная настройка завершена! Вот теперь можно включить наш туннель. Для этого переходим в админку и для нашего eepsite нажимаем кнопку "Старт". В столбце "Состояние" звездочка, отражающая текущий статус, сначала станет желтой, а потом зеленой. Если перейти на главную страницу админки, то в левой панели в категории "Локальные туннели" появится новая запись с нашим eepsite. С этого момента анонимный хостинг запущен! Можно поделиться с кем-нибудь идентификатором в Base32- формате, и у человека без проблем откроется наш сайт в браузере.
-
Теперь надо доделать дела, связанные с доменным именем. Первым делом запись о выбранном домене надо добавить в свою собственную адресную книгу, используя веб-интерфейс 127.0.0.1:7657/susidns/addressbook.jsp?book=master. После этого можно попробовать обратиться к сайту с локальной машины, используя домен, и убедиться, что все работает.
-
Информацию о нашем eepsite необходимо внести в распределенные адресные хранилища вроде stats.i2p. Если зайти на этот ресурс, то ты быстро найдешь форму для добавления новой записи. Здесь опять же необходимо указать доменное имя и локальный адрес назначения (516 байт в Base64). Не забудь нажать на кнопку "Submit". В чем смысл этой затеи? Многие клиенты периодически обновляют свои локальные адресные книги, получая свежие записи с этого сайта. Поэтому через некоторое время (от нескольких часов до нескольких дней) у каждого из таких пользователей появится запись о нашем xa31337xa.i2p. Получается пусть и тормозной, но аналог DNS-сервера. Юзеры, впрочем, могут сразу обратиться к нему через Base32-адрес или по ссылке следующего формата: stats.i2p/cgi-bin/jump.cgi?a=xa31337xa.i2p. Если сайт представляет какой-то общественный интерес, то его можно добавить в wiki ugha.i2p/eepsiteIndex и сделать объявление на официальном форуме forum.i2p.
-
Вот так просто мы подняли сервер, где крутится сайт, который крайне сложно отследить. Практически невозможно и ограничить к нему доступ. В завершение надо сказать, что ресурс даже необязательно должен физически находиться на локальном компе, он может быть где угодно: в локальной сети или даже в инете. Ничто не мешает нам пробросить туннель не на 127.0.0.1:80, а, скажем, на 92.241.175.142:80 (это ip-шник xakep.ru).
Анонимный серфинг
Пускай возможность анонимного серфинга и не является основной для I2P, но она все-таки реализована. Все, что нужно — прописать в браузере прокси: 127.0.0.1:4444. Но вопрос, насколько такой серфинг безопасен, ты должен решить сам. Для доступа к ресурсам интернета используются специальные шлюзы (так называемые outproxy). Соответственно, есть потенциальный риск, что кто-то установил там снифер и мониторит весь трафик. Короче говоря, I2P не для этого. Если хочешь выходить в инет через анонимный и шифрованный канал, то используй VPN/Tor/SSH-туннель. I2P — это, прежде всего, анонимный хостинг.
Размещение SSH-сервера
Помимо непосредственно хостинга веб-серверов через I2P вполне себе работают и многие другие сервисы. В качестве примера приведу настройки для создания SSH-туннеля, что может быть полезно по меньшей мере для того, чтобы администрировать свой eepsite. Тут есть свои нюансы.
- Начнем с того, что через уже знакомую админку I2P создадим новый туннель. Указываем адрес и порт нашего SSH-сервера. Пусть это будет демон, запущенный где-то в нашей локальной сети: например, на роутере или точке доступа (для большей конкретики — 192.168.1.1:22). Далее нам потребуется адрес локального назначения, который сгенерировала админка. Переводим длинный идентификатор в сокращенную (Base32) форму — он нам потребуется для подключения.
-
Может показаться, что теперь все, что остается клиенту, это указать идентификатор сервиса в своем SSH-клиенте (например, PuTTY). Но нет. Другие пользователи I2P не смогут обратиться к такому сервису напрямую. Придется использовать SOCKS, а для этого, в свою очередь, создавать специальный туннель. Итак, на машине, с которой будет осуществляться подключение, необходимо открыть админку I2P, зайти в раздел для администрирования туннелей, найти раздел "Клиентские I2P-туннели" и создать туннель "SOCKS 4/4a/5". По сути, единственная опция, которую нужно указать — это порт (для конкретики возьмем 5454).
-
Теперь проверяем, как все работает. Открываем PuTTY, указываем в качестве сервера идентификатор, полученный в пункте один. Переходим в настройки "Connection.. Proxy" и в поле "Proxy proxyname" прописываем адрес, на котором мы только что создали SOCKS-туннель — 127.0.0.1:5454. Опции "DNS name lookup" должно быть выставлено значение "Yes" или "Auto".
-
Вот и все. Остается только присоединиться к серверу и убедиться, что поверх защищенного I2P отлично работает SSH. Таким образом, можно хостить не только веб-серверы, но и многие другие демоны.
Информация о пирах — лучшая иллюстрация P2P-природы сети I2P
Безопасно ли?
Осторожный читатель может задать вопрос: "А действительно ли I2P может обеспечить 100% анонимность владельцу eepsite?". Короткий ответ: нет. Несмотря на то, что сама система продумана очень здорово, сдать владельца сервиса могут сами сервисы, которые хостятся в I2P. Простой пример — уязвимость в веб-приложении. Если суметь ее проэскплуатировать до возможности выполнения команд, то есть большая вероятность выявить настоящий IP-адрес компьютера. Это не единственная опасность. Если тебе интересна эта тема, рекомендую доклад Irongeek’а об обнаружении скрытых сервисов в подобных сетях, который он недавно представил на хакерской конференции BlackHat 2011 DC.
Info
Как обратиться к I2P-сайту из инета? Можно использовать специальный прокси: https://www.awxcnx.de/cgi-bin/proxy2/nphproxy.cgi/000000A/http/<адрес сервера>