2009-03-30

GNUnet: свободный и анонимный обмен файлами

Общий обзор проекта.

Автор: Vladimir Rusinov, Murano Software
Для конкурса статей проекта opennet.

Введение



GNUnet - это программный пакет для безопасного peer-to-peer соединения, не нуждающегося в серверах. Проект GNUnet возник в 2001 году и был вдохновлён целым рядом технических идей, призванных обеспечить безопасный файлообмен в пиринговых (P2P) сетях.

GNUnet является не просто файлообменной сетью. Основная цель проекта - создание надежной, открытой, равноправной и анонимной (т.е. недоступной цензуре и контролю) системы обмена информацией. Планируется предоставление множества интернет-услуг, а GNUnet стремится стать платформой для разработки децентрализованных сервисов следующего поколения.

Основные технические вопросы работы GNUnet подробно описаны в ряде научных публикаций. Среди этих идей — улучшенное кодирование содержимого (ECRS) и новый протокол анонимной маршрутизации (gap). Вы можете найти все материалы на сайте gnunet. Когда началась работа над GNUnet, были изучены существующие системы (в частности, Freenet и Mnet) на основе которых можно было бы начать новую работу. Однако задуманная система слишком отличалась от существовавших реализаций, чтобы строить GNUnet на основе одной из существовавших систем.

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

GNUnet продолжает развиваться: появляются новые идеи и улучшается программный код. Часто улучшения GNUnet являются результатом дискуссий с разработчиками других проектов. Наверное, один из наиболее известных таких проектов — это Tor — децентрализованная сеть, действующая как анонимный прокси для TCP трафика с низкой латентностью. Tor спроектирован как универсальное решение, и в нем отсутствуют некоторые возможности специфичные для анонимного файлообмена, например поиск, дублирование данных, параллельная загрузка с нескольких узлов.

Кроме всего прочего, впечатляет список протоколов, которые может использовать GNUnet для передачи. Это стандартные tcp и udp, и необычные для p2p http (причем может работать и через прокси) и smtp. Ко всему прочему GNUnet вполне хорошо работает за NAT.

GNUnet является частью проекта GNU. Страница проекта на сайте gnu имеет адрес http://www.gnu.org/software/gnunet/. Кроме того, существует отдельный сайт gnunet: http://gnunet.org/.

Текущая версия 0.8.0c написана на С (однако существует проект реализации GNUnet на Java), работает под ОС GNU/Linux, *BSD, Mac OS X, Solaris, Windows и распространяется под лицензией GNU GPL. В данный момент в проект входит демон gnunetd, несколько библиотек и два фронтенда: gnunet-gtk и gnunet-qt (соответственно написанные с использованием GTK и Qt).



Сервисы и модули GNUnet


Для идентификации объектов и сервисов GNUnet использует URI (Uniform Resource Identifiers). Любой объект в сети GNUnet идентефицируется с помощью URI, который в текущей версии выглядит как gnunet://module/identifier, где module - имя модуля сети, а identifier - уникальный хеш, идентефецирующий сам объект.

File Sharing и ECRS


Самый популярным и наиболее стабильным сервисом является File Sharing (fs), и, как следует из названия, он предназначен для анонимного децентрализованного обмена файлами. Он позволяет искать, выкладывать (publish) и скачивать (download) как отдельные файлы, так и целые директории. С точки зрения пользователя, все это осуществляется аналогично тому, как это происходит например в dc++, однако, благодаря сложному механизму роутинга запросов и ответов, вы понятия не имеете от кого вы на самом деле принимаете или кому передаете файл.

Интересный момент - можно настраивать степень анонимности: от 0 (не анонимно) до бесконечности. По умолчанию используется 1 и этого в большинстве случаев достаточно (вы же не собираетесь передавать таким образом сверхсекретные данные). Передаваемые файлы закодированы с помощью ECRS (An Encoding for Censorship-Resistant Sharing) и обрабатываются модулем с соответствующем названием.

Другие сервисы


Существует также чат (очень простой, с минимумом функций), планируется еще несколько сервисов (например, анонимная p2p почта).

Установка и Настройка


Я пользуюсь дистрибутивом на основе Gentoo, и в моем случае ebuild для gnunet 0.8.0 уже был в официальном дереве портов (в ветке ~). Для работы gnunet требует sql-бд. В настоящий момент поддерживаются mysql и sqlite. Поскольку я не использую mysql, я выбрал sqlite (USE="sqlite" emerge -v1 gnunet), после чего все собралось без каких-либо проблем.

Также, без проблем нашлись rpm для RHEL/CentOS 5 (в репозитории rpmforge), пакеты для Debian, Ubuntu и Arch Linux. Думаю, готовый пакет легко найдется и для других дистрибутивов.

GNUnet работает в клиент-серверном режиме. Т.е. основной рабочий процесс - gnunetd работает в качестве демона, работает без какого-либо интерфейса и управляется фронтендами gnunet (которые не обязательно должны быть запущены на той же машине).
Это отлично вписывается в мою домашнюю сеть: у меня есть headless сервер, подключеный к интернету, который я использую в качестве интернет-шлюза, NAS, proxy, dns и svn сервера, а моим основным рабочим компьютером является ноутбук.

Сервер


Итак, сначала я установил gnunet на сервер. После установки portage подсказала мне что для настойки нужно запустить gnunet-setup -d с правами пользователя root, что я и сделал. gnunet-setup в диалоговом режиме спросил меня о настройках, после чего создал конфигурационный файл /etc/gnunet.conf для демона. Все опции достаточно понятны, и обладают подробной стправкой.
Однако оказалось что диалоговый режим генерирует не совсем корректный конфигурационный файл, поэтом я собрал на ноутбуке GNUnet с поддержкой gtk, вместо диалогового увидел вот такое окно конфигурации:



А получившийся gnunetd.conf скопировал на сервер.

Клиент


Итак, затем я настроил клиента на моем ноутбук. К сожалению, ebuild'а для gnunet-qt я не нашел (я использую KDE), а написать по-быстрому его не удалось. Поэтому я оставил это до лучших времен и установил gnunet-gtk.
После выполнения gnunet-setup я смог подключиться к серверу и успешно запустить несколько поисков и закачек.

Итак, вот несколько скриншотов:







Недостатки


К сожалению не все так безоблачно в GNUnet как хотелось бы.

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

Вторая проблема - малая популярность сети, и, как следствие, недостаточное количества контента. Отчасти в этом виновата малая раскручености протокола, отчасти - нетривиальность использование, да и проблема высокой задержки тоже играет немаловажную роль.
Эту проблему можно решить, и я надеюсь что данная статья приведет новых пользователей в сеть GNUnet.

Ссылки




  • TOR
  • Freenet
  • Winny