Анонимный обмен файлами. BitTorrent over I2P

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

BitTorrent является самым распространенным протоколом для обмена файлами пир-ту-пир, то есть напрямую между пользователями без зависимости от центрального сервера.

0174b8459132e0c282d514d00373b083.jpg

BitTorrent

BitTorrent поддерживает несколько режимов работы, которые в большинстве случаев сочетаются вместе: работа через трекер, PEX (Peer EXchange) и DHT (Distributed Hash Table). Обо всем по порядку.

Для начала нужно пояснить базовую терминлогию, относящуюся к участникам торрент-раздачи:

  • Пир (peer) — общее обозначение для участника процесса;

  • Сид, сидер (seed) — пир, у которого есть весь файл. Сидером однозначно называется пользователь, создающий раздачу, так как на начальном этапе весь файл есть только у него. Именно поэтому в новой раздаче обычно только один сидер. Если вы скачали файл целиком и не ушли с раздачи, то также становитесь сидером.

  • Личер (leech) — пир, качающий файл, но пока не скачавший его до конца. Он также может раздавать другим пирам фрагменты, которые уже скачал;

  • Суперсид (SuperSeed) — сид в особом режиме раздачи, когда он отдает каждому качающему только уникальные фрагменты файлов, тем самым заставляя остальных участников быть активнее (обмениваться недостающими частями между собой).

Трекером называется сервер, к которому участники раздачи обращаются для публикации информации о себе и получения информации о других участниках обмена. Пользователь, еще не скачавший файл, после получения списка пиров стучится к ним с просьбой выдать часть файла. Чтобы реализовать возможность фрагментированной загрузки файла (а не последовательной от первого до последнего байта подряд), торрент-раздача содержит хеши фрагментов конечного файла. Это позволяет загружать файл разрозненными частями от разных пользователей и проверять их целостность. Миссия трекера заключается в аккумулировании информации об участниках раздачи и предоставление этой информации самим же участникам. Торрент-трекер никаким образом не прикасается к конечному файлу, обмен которого обеспечивает, лишь сводит между собой раздающих и скачивающих.

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

PEX (Peer EXchange) — расширение BitTorrent-протокола для обмена списками участников. Реализация незамысловатая: помимо фрагментов файлов, пользователи обмениваются дополнительными сообщениями, которые несут в себе списки подключившихся и отключившихся от раздачи участников. Это помогает новым пользователям быстрее интегрироваться в процесс загрузки файла, так как не нужно ожидать обращение раздающего узла к трекеру, где он получит список новичков. Также и для скачивающего участника появляется новый источник пиров помимо торрент-трекера.

Несмотря на простоту замысла, некоторые BitTorrent-клиенты имеют собственную реализацию PEX, не совместимую с другими. Кроме этого, PEX не является панацеей, так как способен помочь только тем пользователям, которые уже подключены к раздаче (потому что сообщения PEX идут по обычному протоколу BitTorrent в виде дополнительных пакетов).

DHT (Distributed Hash Table) — протокол, позволяющий BitTorrent-клиентам находить друг друга без использования трекера. DHT принципиально похож на PEX с тем главным отличием, что работает отдельно от основного протокола BitTorrent.

Каждый подключенный BitTorrent-клиент является в DHT-сети отдельным узлом. У него есть свой уникальный ID (идентификатор), случайно выбираемый из того же 160-битного пространства, что и infohash«ы торрентов. Каждый узел хранит таблицу маршрутизации, содержащую контактную информацию о многих «ближайших» к нему узлах, и о нескольких более далеких. «Близость» двух узлов вычисляется из «сходства» их ID, и не имеет никакого отношения к их географической близости.

Когда узел хочет найти пиров для какой-то раздачи, он сравнивает infohash этой раздачи с ID известных ему узлов, и затем посылает запрос тому узлу, чей ID наиболее похож на этот infohash. Следующий узел, в свою очередь, возвращает адрес узла, чей ID ещё ближе к infohash’у торрента. Таким образом, запросы от клиентов, участвующих в раздаче торрента с определенным infohash, постепенно стекаются к узлам, чьи ID наиболее похожи на infohash раздачи. Эти узлы помнят предыдущие запросы участников по конкретному торренту и всем следующим запросившим узлам вернут адреса предыдущих пиров с той же раздачи.

База DHT хранится торрент-клиентом независимо от активных раздач и сохраняется вплоть до выключения или перезапуска, регулярно принимая запросы других участников и проверяя на активность узлы из своего списка. База DHT пополняется при любом удобном случае: при получении списка участников от торрент-трекеров, либо от других пиров через PEX или DHT.

Через DHT реализуется альтернативный способ публикации торрента без указания трекера. Как правило, такие раздачи распространяются в виде текстовой ссылки вместо торрент-файла. Строка называется magnet-ссылкой и обязательно содержит infohash раздачи, которая позволяет найти участников раздачи через DHT. Однако, в magnet-ссылке может присутствовать адрес торрент-трекера, что в большинстве случаев ускоряет поиск пиров. Надо заметить, что magnet-ссылка и torrent-файл без указания трекера являются бесполезными, если у конечного пользователя нет активных DHT-подключений через которые он сможет найти пир, участвующий в раздаче с искомым infohash.

О базовых принципах BitTorrent создано много пояснительного материала, поэтому, уяснив суть, переходим к главной теме статьи.

BitTorrent в I2P

Идея файлшеринга через скрытые сети вроде I2P не нова. Для обычного пользователя I2P-торрент примечателен практической невозможностью блокировки раздач и трекеров со стороны провайдеров, так как I2P — это скрытая сеть, где цель всего — анонимность и невозможность отследить источник трафика. Общая парадигма BitTorrent, как и любого peer-to-peer обмена подразумевает прямое соединение между пользователями. Именно эта особенность делает привычные торренты непригодными для раздачи файлов, раздатчиков которой хочет отловить и покарать Большой брат. Например, в некоторых европейских странах уделяется большое внимание борьбе с бытовым пиратством: игры, фильмы, сериалы. Правоохранители, подключившись к раздаче, отслеживают по IP-адресу того, кто участвует в раздаче крякнутой игры, а затем пользователю приходит либо письмо счастья, либо наряд полиции в зависимости от уровня капирастической истерии в регионе.

Обсуждать публично тему анонимного обмена файлами считается не этично, так как нашему обывателю известен круг людей, грезящих об анонимности: педофилы, наркоманы, экстремисты, сектанты, сектанты-наркоманы и так далее, за свежим списком следите в эфире федеральных телеканалов. Однако, вольномыслящему и здоровому человеку область применения анонимных торрентов рисуется легко и без угрызения совести. Вспомните WikiLeaks и другие разоблачения нечеловечности, которые для здорового человека являются преступлением, но по порой абсурдным законам распространение информации о таких преступлениях уже является преступлением вроде разглашения государственной тайны. Возможность секретной передачи файлов в таких случаях равна сохранению собственной жизни, здоровья и свободы. Потребность в анонимности — широкая тема, место в которой найдется и чиновнику-коррупционеру, и любителю аниме средней руки, и разоблачителям беззакония, и — по телевизору говорят правду! — преступникам. Что касается преступников: эта статья им не нужна, они и так уже давно и успешно пользуются технологиями, которые в принципе невозможно эффективно блокировать, следовательно, и запретить. Этот материал адресован широкой аудитории и носит образовательный характер, чтобы свободные технологии принадлежали народу, а не узкой группе лиц.

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

Существуют несколько BitTorrent-клиентов, которые умеют работать через I2P. Периодически появляются новые решения или старые перестают поддерживаться разработчиками. Как бы то ни было, все приложения этой категории делятся на два вида: те, которые могут работать как через обычный интернет, так и через I2P, и те, которые созданы исключительно для работы через скрытую сеть.

Использование мультисетевого торрент-клиента может быть опасно при неумелом использовании, так как возможна утечка IP-адреса. Например, пользователь начал скачивать что-то через I2P, но у него есть активные DHT-соединения из обычного интернета, а также его клиент периодически обращается на торрент-трекеры, находящиеся вне скрытых сетей. Если поступит запрос из неанонимной сети, который будет содержать infohash сомнительной раздачи из I2P, торрент-приложение ответит положительно и начнет ретранслировать раздачу из даркнета куда-то там, возможно, Большому брату. Вытекающие последствия при утечке IP-адреса в сомнительной раздаче сложно предсказать, но ничего приятного из этого наверняка не выйдет.

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

Средняя скорость сети I2P на момент написания статьи составляет 40Кб/сек. Случаются заскоки за 100Кб/сек, дело случая, но в целом при стандартной длине туннелей (входящие и исходящие туннели по умолчанию имеют длину в три транзитных узла), скорость колеблется в диапазоне 20–50Кб/сек. Получается, что реальная пропускная способность сида не имеет решающего значения, он отдает файл конкретному пользователю со скоростью до 100Кб/сек. Это скорость конкретно взятого пир-ту-пир соединения, которая упирается в массу факторов, присущих I2P, например, качество транзитных узлов и их количество между пользователями. Скорость будет определяться наихудшим участником цепи.

Личеры в I2P-торрент-раздаче играют существенную роль в ускорении всего роя (совокупность всех участников раздачи называют роем). Несмотря на низкую среднюю скорость для одного соединения, при загрузке и раздаче востребованных торрентов в I2P скорость достигает 2Мб/сек. Это возможно благодаря фактору коллективности: участники раздают друг другу скаченные фрагменты, образуя между собой новые пир-ту-пир соединения. Множество медленных подключений обеспечивает хорошую итоговую скорость, как ручьи, собираясь, образуют полноводные реки. Фактически, протокол BitTorrent был создан специально для распределения нагрузки при раздаче файлов и его архитектура идеально сочетается с I2P.

Торрент-клиент I2PSnark

Список существующих торрент-клиентов, поддерживающих работу через I2P, можно увидеть в документации i2pd. Если список по-вашему является неполным, вы можете его дополнить. В рамках данного материала будет освещен только I2PSnark, так как он долгие годы является наилучшим решением для I2P-торрентов. Помимо достойной функциональности, он является I2P-only клиентом, то есть умеет работать исключительно через сеть I2P, что избавляет неопытных пользователей от угрозы утечки IP-адреса.

I2PSnark появился практически одновременно с самой сетью I2P (~2003 год). По сей день он является частью Java-роутера I2P, который включает в себя ряд приложений помимо основной функции подключения пользователя к скрытой сети. I2PSnark взаимодействует с I2P-роутером по протоколу I2CP, который поддерживается в альтернативном более легковесном и скоростном роутере i2pd, исполненном на C++. Для использования I2PSnark отдельно от Java-роутера, необходимо использовать I2PSnark standalone. Бинарный файл можно собрать самостоятельно из исходного кода, либо воспользоваться сборкой от проекта I2P+, который является мягким форком основного I2P-роутера с незначительными изменениями. Прямая ссылка на загрузку бинарника I2PSnark standalone приведена на упомянутой выше странице документации i2pd.

Java-приложения для запуска требуют наличие специальной среды исполнения на вашем устройстве (Java Virtual Machine). Установить Java можно практически на любую современную операционную систему. Скачайте последний релиз для Linux, Mac или Windows на официальной странице.

Перед использованием I2PSnark standalone необходимо включить интерфейс I2CP, который в i2pd по умолчанию отключен. Это делается через конфигурационный файл i2pd.conf: раскомментируйте строку enabled = true в секции [i2cp] и перезапустите i2pd.

image-loader.svg

Узнать где найти конфигурационный файл в вашей системе можно на главной странице веб-интерфейса i2pd, который по умолчанию доступен по адресу http://127.0.0.1:7070. Смотрите на строку Data path.

image-loader.svg

В скаченном архиве I2PSnark standalone присутствуют файлы launch-i2psnark и launch-i2psnark.bat. Воспользуйтесь bat-файлом для запуска на Windows и файлом без расширения в имени в любом другом случае. При использовании на unix-подобных операционных системах не забудьте перед запуском сделать файл исполняемым (chmod +x launch-i2psnark).

Взаимодействовать с запущенным I2PSnark надо через веб-интерфейс, доступный по умолчанию по адресу http://127.0.0.1:8002. Он интуитивно понятен и прост в освоении. Для смены языка на русский перейдите в настройки (самая нижняя кнопка, пиктограмма с шестеренкой), в разделе «User interface» смените «Language» и нажмите на кнопку «Save Configuration» ниже.

image-loader.svg

Обратите внимание на секцию «Tunnel Configuration», которая отвечает за входящие и исходящие туннели.

image-loader.svg

Хопы — это длина туннелей в транзитных узлах. Чем больше длина, тем анонимнее и медленнее туннели. По умолчанию используются туннели в три хопа, но для бытового использования вполне нормально поставить два или даже один хоп.

Существует возможность запустить несколько экземпляров I2PSnark на одном устройстве: короткие туннели для раздачи и загрузки обычного контента и длинные туннели для работы с более чувствительным материалом. Для этого скопируйте всю папку I2PSnark и измените в скопированной директории файл jetty-i2psnark.xml: найдите значение "port" и смените номер порта, на котором будет доступен веб-интерфейс.

image-loader.svg

Например, один экземпляр I2PSnark может использовать порт 8002, а второй 8003. Чтобы было сложнее спутать какой именно экземпляр у вас открыт в браузере (с длинными или короткими туннелями), используйте разные темы оформления.

На заметку: I2PSnark при каждом запуске меняет свой I2P-идентификатор, который видят другие участники файлообмена.

Загрузка файлов и создание своей раздачи

Чтобы присоединиться к раздаче, откройте меню добавления (верхняя кнопка с пиктограммой плюса).

image-loader.svg

В поле «From URL» можно вставить magnet-ссылку (которую в I2P иногда называют maggot), либо прямой путь до файла .torrent в вашей файловой системе. В поле «Data dir» указывается путь, куда будут сохранены скачиваемые файлы. Чтобы запустить загрузку, нажмите «Add torrent».

Второй и более изящный в некоторых случаях вариант позволяет добавить торрент без использования веб-интерфейса: добавьте torrent-файл нужной раздачи в основную директорию хранения файлов I2PSnark. По умолчанию I2PSnark хранит торрент-файлы и загрузки во вложенной одноименной директории i2psnark/i2psnark. При добавлении нового торрент-файла в эту директорию приложение подхватит его и начнет процесс загрузки автоматически в течение нескольких секунд.

Чтобы создать новый торрент, нужно воспользоваться кнопкой с пиктограммой волшебной палочки. Все, что от нас потребуется, это указать полный путь до раздаваемого файла или папки в нашей файловой системе и выбрать трекеры, которые будут сразу добавлены в раздачу. Если создать раздачу без использования трекеров, поиск пиров будет исключительно по DHT. Если не уверены как быть, проставьте галочку напротив каждого предлагаемого трекера и выберите какой-либо в качестве основного. Как правило, основным является Postman, так как это старейший классический торрент-трекер с форумом (http://tracker2.postman.i2p).

image-loader.svg

После нажатия кнопки «Создать торрент» будет создана раздача, которая появится в общем списке. Для удобства рекомендуется добавлять раздаваемые файлы в дефолтную папку I2PSnark, чтобы все было в одном месте.

Готовый torrent-файл появится рядом с остальными торрент-файлами, откуда его можно взять для размещения на форуме или прямой передачи кому-либо. Если кликнуть по названию раздачи в веб-интерфейсе I2PSnark, откроется окно с информацией.

image-loader.svg

В правом верхнем углу можно найти infohash раздачи, magnet-ссылку (пиктограмма с магнитом) и ссылку для загрузки торрент-файла (самая правая). При клике на иконку торрент-файла будет предложено скачать файл, который лежит в уже обозначенном месте. Чтобы передать magnet-ссылку, кликните на соответствующую иконку правой кнопкой мыши и скопируйте ссылку, на которую она ведет. Это и есть magnet-ссылка, готовая для публикации.

image-loader.svg

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

Знакомство с I2P-торрент-трекерами выходит за рамки этой статьи и всецело ложится на ваши плечи. Впрочем, ничего сложного нет: оформляйте раздачи внятно, информативно и красиво.

Сидбокс

Сидбокс (seedbox) — устройство, служащее для постоянной раздачи файлов. Как правило, собирается из одноплатных компьютеров и внешних HDD. Однако, подойдет любое устройство, способное одновременно запускать I2P-роутер и торрент-клиент с максимально возможным аптаймом и дисковым пространством. Сидбоксинг включает в себя не только постоянную раздачу ваших файлов, но и поддержку чужих раздач хотя бы на протяжении релизной недели. Это своего рода субкультура, повернутая на свободном обмене информацией, пропитанная альтруизмом и ценниками на жесткие диски.

Когда-нибудь мы, энтузиасты, доберемся до детального обзора удачной сборки сидбокса из палок и изоленты, а пока ограничимся советами:

  1. Минимальный объем оперативной памяти устройства для запуска i2pd и I2PSnark равен 512МБ, комфортный с запасом — 1ГБ.

  2. Активная раздача торрентов в перспективе плохо сказывается на времени жизни жестких дисков, так как при торрентинге идет активная работа с диском с постоянным изменением мест чтения. Особенно, если происходит одновременная раздача множеству участников. В силу этого следует предпочитать несколько дисков меньшего объема, чем, например, один диск на несколько терабайт. Это увеличит общую производительность системы, а выход одного диска из строя не приведет к полной потере информации. Если, конечно, вы не доберетесь до использования RAID — систем зеркалирования накопителей между собой для предотвращения потери информации при поломке одного из них.

  3. По причине вероятного выхода дисков из строя желательно, чтобы операционная система стояла на отдельном физическом диске, нежели там, где хранится торрент-контент. Особенно остро это касается одноплатных компьютеров, где операционная система работает на SD-накопителе, который сам по себе не славится долговечностью.

Тема сидбоксов на базе бюджетных одноплатников становится особенно актуальной в свете новостей о релизе ядра Linux 5.15 с поддержкой SMB и NTFS, что открывает новые горизонты для слабого железа, но это тема для отдельного разговора…

Постскриптум

Децентрализация и развитие свободных технологий невозможны без участия обычных людей. Если мы не хотим зависеть от политики файлообменников и ограничений со стороны провайдера, каждому нужно внести посильный вклад. На начальном этапе популяризации I2P-торрентов сидбоксинг является критически важным элементом, который способствует развитию технологии. Уже сегодня торренты в скрытых сетях распространены в странах, где к этому вынуждает обстановка. Постепенно практика запретов и штрафов распространяется на другие регионы. Подумайте, в ваших ли силах выделить несколько тысяч рублей на покупку одноплатного компьютера и пары жестких дисков для организации своего сидбокса? Даже если вы не имели дел с линуксами и не понимаете что такое подключение через SSH, поверьте, вход в увлекатльную игру свободных технологий и гласности окупит все затраченные часы и нервы на освоение этих азов. На мой взгляд, культура свободного программного обеспечения и скрытых сетей позволяет каждому пользователю быть равноправным участником, хранителем технологий и информации, что захватывает не хуже топовой онлайн игры, но с одним большим отличием: вы не деградируете, а развиваетесь.

© Habrahabr.ru