Файлообменные сети P2P: основные принципы, протоколы, безопасность
Ю. Н. Гуркин, Ю. А. Семенов
Впервые термин peer-to-peer (P2P) был использован в 1984 г. компанией IBM при разработке сетевой архитектуры для динамической маршрутизации трафика через компьютерные сети с произвольной топологией (Advanced Peer to Peer Networking). Сегодня на технологии P2P основано огромное число популярных сетевых сервисов — от простого обмена файлами до речевой и видеосвязи.
В основе технологии лежит принцип децентрализации: все узлы в сети P2P равноправны, что обеспечивает такие преимущества технологии P2P перед клиент-серверным подходом, как отказоустойчивость при потере связи с несколькими узлами сети, увеличение скорости получения данных за счет копирования одновременно из нескольких источников (рис. 2), возможность разделения ресурсов без “привязки” к конкретным IP-адресам, огромная мощность сети в целом и др.
По некоторым данным, в настоящее время в Интернете более половины всего трафика приходится на трафик файлообменных P2P-сетей, а размеры самых крупных из них перевалили за отметку в миллион одновременно работающих узлов, разделяющих петабайты (1015 байт) информации. Общее количество зарегистрированных участников файлообменных сетей P2P во всем мире составляет порядка 100 млн.
Хотя P2P-сети используются сейчас в основном для разделения файлов, существует еще много других областей, где данная технология тоже успешно применяется, — это телевидение и аудиотрансляции, параллельное программирование, распределенное кэширование ресурсов для разгрузки серверов, рассылка уведомлений и статей, поддержка системы доменных имен, индексирование распределенных ресурсов и их поиск, резервное копирование и создание устойчивых распределенных хранилищ данных, обмен сообщениями, создание систем, устойчивых к атакам типа “отказ в обслуживании”, распространение программных модулей. Имеется огромное число клиентских программ для работы с P2P-сетями, как коммерческих, так и с открытым кодом. Постоянно идет работа по усовершенствованию протоколов и увеличению функциональности систем, и, судя по всему, недалек тот момент, когда клиентское ПО для P2P будет интегрировано с операционными системами. Так, уже сейчас крупные компании проявляют интерес к Р2Р — например, компания Sun разрабатывает протокол для доступа к основным P2P-сетям с карманных компьютеров и смартфонов, а компания Microsoft создала свои реализации P2P-протоколов Scribe и Pastry.
В данной статье представлен обзор наиболее распространенных P2P-систем — так называемых файлообменных сетей, рассмотрены принципы их работы и протоколы. В конце статьи затронут вопрос, связанный с безопасностью, являющейся основным минусом P2P-подхода.
Определения
Итак, технология P2P предполагает построение сети распределенных равноправных узлов по принципу децентрализации. Эта идея является альтернативой принципу клиент—сервер.
В существующих сегодня файлообменных P2P-сетях изначально был использован смешанный подход — с наличием выделенных узлов и/или серверов. Но в последние несколько лет во всех крупных сетях реализована поддержка протоколов, обеспечивающих полностью автономное функционирование сети без серверов, т. е. в чистом виде P2P-подход.
Сеть P2P — это множество узлов (компьютеров, смартфонов и пр.), объединенных в единую систему и взаимодействующих посредством протокола P2P, который обеспечивает возможность создания и функционирования сети равноправных узлов.
Протоколом или набором протоколов определяется логическая топология сети, механизм подключения к ней и отключения от нее узлов, а также алгоритм взаимодействия последних. Решение таких задач, как коррекция ошибок, регламентирование форматов сообщений, служебных запросов и откликов, маршрутизация в условиях постоянного подключения и отключения узлов, тоже определяется протоколом P2P.
В модели стека сетевых протоколов TCP/IP протоколы P2P относятся к прикладному уровню. Таким образом, P2P-сеть является наложенной (overlay), функционирующей поверх Интернета и использующей существующие транспортные протоколы TCP или UDP.
Клиентская программа P2P, или просто “клиент”, — программа, обеспечивающая функциональность узла, она сама является реализацией лежащего в основе сети P2P-протокола. Клиент может запрашивать сервер или выделенные узлы, получать ответ с информацией о запрошенных файлах, узлах, на которых эти файлы находятся, и далее уже работать напрямую с указанными узлами. Последние реализации клиентов наделены возможностями обмена служебной информацией, построения запросов и поиска ресурсов во всей сети без участия серверов.
ID узла — уникальный идентификатор узла, вычисляется он с помощью хеш-функции из IP-адреса и дополнительной информации (имени компьютера, MAC-адреса сетевой карты и пр.) и присваивается при регистрации узла в сети P2P.
ID, или ключ, ресурса — уникальный идентификатор файла или любого другого ресурса — вычисляется с помощью хеш-функции из имени файла и его содержимого.
Протоколами обеспечивается равномерное распределение ключей ресурсов вместе с идентификаторами узлов, опубликовавшими данный ресурс, по всем зарегистрированным в сети узлам (или по некоторым выделенным узлам и/или серверам). Задача поиска (lookup) ресурса сводится к нахождению ID узла, на котором хранится ключ ресурса.
На рис. 3 приведен пример P2P-сети, работающей по протоколу DHT Kademlia. К сети, способной поддерживать максимум 16 узлов и 16 ресурсов, подсоединились 7 узлов (красные кружки), разделяющих 12 ресурсов. Узлам присвоены соответствующие ID, а ресурсам — ключи. Последние вместе с адресами опубликовавших их узлов (адреса на рисунке не показаны) равномерно распределены между узлами сети.
Предположим, узел с ID 0 “хочет” найти ресурс, соответствующий ключу 14, для этого он посылает запрос на поиск. Запрос проходит определенную процедуру маршрутизации и достигает узла, на котором находится ключ 14. Далее узел ID 14 пересылает узлу ID 0 адреса всех узлов, обладающих ресурсом, соответствующим ключу 14.
Большой рост популярности сетей P2P обусловлен привлекательностью характеристик данной технологии — это децентрализация, распределенность, самоорганизуемость сети. Обозначенные принципы обеспечивают такие преимущества, как простота и дешевизна реализации и поддержания работы сети, ее отказоустойчивость и масштабируемость, увеличение скорости копирования и колоссальная мощность сети в целом.
Среди файлообменных сетей по количеству узлов лидируют такие сети, как Bittorrent, eDonkey2000, Gnutella2, Gnutella.
BitTorrent
С целью инициализации узла в сети Bittorrent (www.bittorrent.com) клиентская программа обращается к серверу (tracker), предоставляющему информацию о файлах, доступных для копирования, а также статистическую и маршрутную информацию об узлах сети. Сервер и после инициализации “помогает” узлам взаимодействовать друг с другом, хотя последние версии клиентских программ требуют наличия сервера только на стадии инициализации.
Если узел “хочет” опубликовать файл, то программа разделяет этот файл на части и создает файл метаданных (torrent file) с информацией о частях файла, местонахождении их и — опционально — сервера, который будет поддерживать распространение этого файла. Первый узел, опубликовавший файл, называется распространителем (seedеr). Узел, “желающий” скопировать файл, при копировании сам становится распространителем по принципу: “сколько копирую я, столько разрешаю скопировать с меня”. Узлы, скопировавшие весь файл, становятся распространителями этого файла и вместе с узлами, скопировавшими файл не полностью, дают возможность другим узлам получать части файла из нескольких источников, что ускоряет копирование (см. рис. 2).
В сети, о которой идет речь, используются протоколы Bittorrent и BitTorrent Azureus DHT. Последний основан на модифицированном протоколе Kademlia и используется для обеспечения работы с файлами метаданных, не привязанными к серверам, для децентрализованного поиска ресурса по ID и присваивания ресурсам комментариев и рейтинга. Вместо BitTorrent Azureus DHT некоторые клиенты поддерживают аналогичный ему по функциональности протокол BitTorrent Mainline DHT.
Приведем наиболее распространенные клиентские программы. Это Azureus, BitTorrent_client, µTorrent, BitSpirit, BitComet, BitTornado, MLDonkey.
Gnutella, Gnutella2
Gnutella (www.gnutella.com) — одна из первых пиринговых сетей, создана в 2000 г. Она функционирует до сих пор, хотя из-за серьезных недостатков алгоритма пользователи в настоящее время предпочитают сеть Gnutella2 (www.gnutella2.com).
При подключении клиент получает от узла, с которым ему удалось соединиться, список из пяти активных узлов; им отсылается запрос на поиск ресурса по ключевому слову. Узлы ищут у себя соответствующие запросу ресурсы и, если не находят их, пересылают запрос активным узлам вверх по “дереву” (топология сети имеет структуру графа типа “дерево”), пока не найдется ресурс или не будет превышено максимальное число шагов. Такой поиск называется размножением запросов (query flooding).
Понятно, что подобная реализация ведет к экспоненциальному росту числа запросов и соответственно на верхних уровнях “дерева” может привести к отказу в обслуживании, что и наблюдалось неоднократно на практике. Разработчики усовершенствовали алгоритм, ввели правила, в соответствии с которыми запросы могут пересылать вверх по “дереву” только определенные узлы — так называемые выделенные (ultrapeers), остальные узлы (leaves) могут лишь запрашивать последние. Введена также система кеширующих узлов.
В таком виде сеть функционирует и сейчас, хотя недостатки алгоритма и слабые возможности расширяемости ведут к уменьшению ее популярности.
Недостатки протокола Gnutella инициировали разработку принципиально новых алгоритмов поиска маршрутов и ресурсов и привели к созданию группы протоколов DHT (Distributed Hash Tables) — в частности, протокола Kademlia, который сейчас широко используется в наиболее крупных сетях.
Запросы в сети Gnutella пересылаются по TCP или UDP, копирование файлов осуществляется через протокол HTTP. В последнее время появились расширения для клиентских программ, позволяющие копировать файлы по UDP, делать XML-запросы метаинформации о файлах.
В 2003 г. был создан принципиально новый протокол Gnutella2 и первые поддерживающие его клиенты, которые были обратносовместимы с клиентами Gnutella. В соответствии с ним некоторые узлы становятся концентраторами, остальные же являются обычными узлами (leaves). Каждый обычный узел имеет соединение с одним-двумя концентраторами. А концентратор связан с сотнями обычных узлов и десятками других концентраторов. Каждый узел периодически пересылает концентратору список идентификаторов ключевых слов, по которым можно найти публикуемые данным узлом ресурсы. Идентификаторы сохраняются в общей таблице на концентраторе. Когда узел “хочет” найти ресурс, он посылает запрос по ключевому слову своему концентратору, последний либо находит ресурс в своей таблице и возвращает ID узла, обладающего ресурсом, либо возвращает список других концентраторов, которые узел вновь запрашивает по очереди случайным образом. Такой поиск называется поиском с помощью метода блужданий (random walk).
Примечательной особенностью сети Gnutella2 является возможность размножения информации о файле в сети без копирования самого файла, что очень полезно с точки зрения отслеживания вирусов. Для передаваемых пакетов в сети разработан собственный формат, похожий на XML, гибко реализующий возможность наращивания функциональности сети путем добавления дополнительной служебной информации. Запросы и списки ID ключевых слов пересылаются на концентраторы по UDP.
Вот перечень наиболее распространенных клиентских программ для Gnutella и Gnutella2: Shareaza, Kiwi, Alpha, Morpheus, Gnucleus, Adagio Pocket G2 (Windows Pocket PC), FileScope, iMesh, MLDonkey
EDonkey2000
Сеть EDonkey2000 (www.edonkey.com) появилась в 2000 г. Информация о наличии файлов в ней публикуется клиентом на многочисленных серверах в виде ed2k-ссылок, использующих уникальный ID ресурса. Серверное ПО доступно для установки любым пользователем. Сервер обеспечивает поиск узлов и информации. Сейчас в сети имеется до 200 серверов, обслуживающих одновременно около миллиона клиентов, совместно использующих порядка миллиарда различных файлов. Общее число зарегистрированных пользователей данной сети составляет порядка 10 млн.
Когда клиент сети EDonkey2000 копирует желаемый ресурс, он делает это одновременно из нескольких источников с помощью протокола MFTP (Multisource File Transfer Protocol).
Сейчас информацию о доступных файлах можно получать не только с серверов EDonkey. С 2004 г. в состав сети EDonkey2000 интегрирована сеть Overnet (www.overnet.com) — полностью децентрализованная сеть, позволяющая осуществлять взаимодействие между узлами без “привязки” к серверам, для чего используется DHT-протокол Kademlia.
Самой распространенной для сети EDonkey2000 клиентской программой с закрытым кодом (версия Pro — платная) является программа eDonkey, однако существует и клиент с открытым программным кодом — eMule, который, помимо сети EDonkey2000, может задействовать еще одну сеть P2P — Kad Network (Kademlia). Клиент eDonkey имеет очень интересное расширение, позволяющее копировать метафайлы .torrent, которые пользуются большим доверием пользователей, а также применять верификационную информацию из этих метафайлов для работы с файлами собственной сети. При этом, если инициализировалась загрузка файла, соответствующего метафайлу, части файла, доступные в собственной сети EDonkey2000, тоже включаются в список источников для загрузки.
Такая интеграция возможностей разных сетей и дополнительная верификация способствовали развитию сети EDonkey2000. В нее стали переходить пользователи других сетей — например, сети FastTreсk, базирующейся на протоколе FastTreсk, который реализуется, в частности, таким популярным клиентом, как Kazaa (www.kazaa.com/us/index.htm).
Direct Connect
Рассмотрим еще одну сеть — Direct Connect (dcplusplus.sourceforge.net), поскольку в России она очень популярна. Дело в том, что поставщики сетевых услуг — например, операторы домовых сетей в Москве, а также сетевые администраторы компаний до недавнего времени старались блокировать на своих межсетевых экранах порты, через которые общаются клиенты сетей Bittorrent, EDonkey2000, Gnutella, Fasttreck, а в тех же случаях, когда экран не помогал, боролись административными методами. Преградами на пути широкого использования сетей P2P также являлись большая стоимость трафика и/или дефицит полосы пропускания каналов.
В связи с этим пользователям осталась только возможность строить локальные пиринговые сети. Наиболее удобной для этого оказалась технология Direct Connect. В данной сети клиенты подключаются к одному или нескольким серверам для поиска файлов, причем серверы не связаны между собой. Информация о файлах, доступ к которым узел “хочет” открыть, отсылается на сервер. Копирование файлов происходит напрямую между узлами, как и в классической P2P-сети.
В клиент встроены возможности для общения участников сети друг с другом; список файлов каждого пользователя можно получать в виде древовидной структуры папок; существует простой механизм поиска информации и возможность копирования целых каталогов. Перечисленное сделало технологию Direct Connect отличным решением для локальной файлообменной сети P2P.
Основные уязвимые стороны P2P
Реализация и использование распределенных систем имеют не только плюсы, но и минусы, связанные с особенностями обеспечения безопасности. Получить контроль над столь разветвленной и большой структурой, какой является сеть P2P, или использовать пробелы в реализации протоколов для собственных нужд — желанная цель для хакеров. К тому же защитить распределенную структуру сложнее, чем централизованный сервер.
Столь огромное количество ресурсов, которое имеется в сетях P2P, тяжело шифровать/дешифровать, поэтому большая часть информации об IP-адресах и ресурсах участников хранится и пересылается в незашифрованном виде, что делает ее доступной для перехвата. При перехвате злоумышленник не только получает собственно информацию, но также узнает и об узлах, на которых она хранится, что тоже опасно.
Только в последнее время в клиентах большинства крупных сетей эта проблема стала решаться путем шифрования заголовков пакетов и идентификационной информации. Появляются клиенты с поддержкой технологии SSL, внедряются специальные средства защиты информации о местонахождении ресурсов и пр.
Серьезная проблема — распространение “червей” и подделка ID ресурсов с целью их фальсификации. Например, в клиенте Kazaa используется хеш-функция UUHash, которая позволяет быстро находить ID для больших файлов даже на слабых компьютерах, но при этом остается возможность для подделки файлов и записи испорченного файла, имеющего тот же ID.
Чтобы справиться с описанной проблемой, клиенты должны пользоваться надежными хеш-функциями (“деревьями” хеш-функций, если файл копируется по частям), такими, как SHA-1, Whirlpool, Tiger, и только для решения малоответственных задач — контрольными суммами CRC. Для уменьшения объемов пересылаемых данных и облегчения их шифрования можно применить компрессию. Для защиты от вирусов нужно иметь возможность хранить идентифицирующую метаинформацию о “червях”, как это, в частности, сделано в сети Gnutella2.
Другая проблема — возможность подделки ID серверов и узлов. При отсутствии механизма проверки подлинности пересылаемых служебных сообщений, например с помощью сертификатов, существует возможность фальсификации сервера или узла (многих узлов). Так как узлы обмениваются информацией, подделка некоторых из них приведет к компрометации всей сети или ее части. Закрытое ПО клиентов и серверов не является решением проблемы, так как есть возможность для реинжиниринга протоколов и программ (reverse engineering).
В настоящее время выделенные серверы и узлы периодически обмениваются между собой верифицирующей информацией и при необходимости добавляют поддельные серверы/узлы в черный список блокировки доступа.
Часть клиентов только копируют чужие файлы, но не предлагают ничего для копирования другим (leechers).
В московских домовых сетях на нескольких активистов, делающих доступными более 100 Гбайт информации, приходится около сотни, выкладывающих менее 1 Гбайт. Для борьбы с этим используются разные методы. В eMule применен метод кредитов: скопировал файл — кредит уменьшил-ся, позволил скопировать свой файл — кредит увеличился (xMule — кредитная система с поощрением распространения редких файлов). В сети eDonkey стимулируется размножение источников, в Bittorrent реализована схема “сколько блоков файла получил, столько отдал” и т. п.
Об авторах Гуркин Юрий Николаевич, аспирант ФРТК МФТИ, Семенов Юрий Алексеевич, канд. физ.-мат. наук, зам. зав. кафедры телекоммуникационных сетей и систем ФРТК МФТИ Телефон: (495) 129-9785 E-mail: audit@gleg.net