Введение

Фреймворк для децентрализованных, одноранговых сетей, являющийся частью проекта GNU.

GNUnet — это программная структура для децентрализованных, одноранговых сетей и официальный пакет GNU. Фреймворк предоставляет шифрование каналов связи, обнаружение одноранговых узлов, распределение ресурсов, связь по различным транспортным протоколам (таким как TCP, UDP, HTTP, HTTPS, WLAN и Bluetooth), а также различные базовые алгоритмы для одноранговых сетей, предназначенные для маршрутизации, многоадресной рассылки и оценки размера сети. Основная топология сети GNUnet — это mesh-сеть. GNUnet включает в себя распределенную хеш-таблицу (DHT), являющуюся рандомизированным вариантом Kademlia, способным эффективно осуществлять маршрутизацию в сетях малого мира. GNUnet предлагает опцию "топологии F2F" для ограничения соединений только доверенными друзьями пользователей. Друзья друзей пользователей (и так далее) могут затем косвенно обмениваться файлами с компьютером пользователя, не используя его IP-адрес напрямую. GNUnet использует универсальные идентификаторы ресурсов (не утвержденные IANA, хотя заявка подана). URI GNUnet состоят из двух основных частей: модуля и идентификатора, специфичного для модуля. URI GNUnet имеет формат gnunet://module/identifier, где module — это имя модуля, а identifier — строка, специфичная для модуля. Основная кодовая база написана на C, но существуют привязки к другим языкам для создания API для разработки расширений на этих языках. GNUnet является частью проекта GNU и вызвал интерес в хакерском сообществе после разоблачений PRISM. GNUnet состоит из нескольких подсистем, основными из которых являются подсистемы Transport и Core. Подсистема Transport обеспечивает небезопасную связь на канальном уровне, в то время как Core обеспечивает обнаружение одноранговых узлов и шифрование. На основе Core-подсистемы создаются различные приложения. GNUnet включает в себя различные P2P-приложения в основном дистрибутиве фреймворка, включая файлообмен, чат и VPN; кроме того, несколько внешних проектов (таких как secushare) также расширяют инфраструктуру GNUnet. GNUnet не имеет отношения к более старому протоколу Gnutella P2P. Gnutella не является официальным проектом GNU, в отличие от GNUnet.

Транспорт

Первоначально GNUnet использовал UDP для передачи данных на нижнем уровне. Сейчас подсистема передачи данных GNUnet предоставляет несколько вариантов, включая TCP и SMTP. Порт связи, официально зарегистрированный в IANA, – 2086 (tcp + udp).

Система доверия

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

Обмен файлами

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

Кодирование файлов

Файлы, передаваемые через GNUnet, кодируются с использованием ECRS (An Encoding for Censorship Resistant Sharing). Все содержимое представлено в виде GBlocks. Каждый GBlock содержит 1024 байта. Существуют различные типы GBlocks, каждый из которых выполняет определенную функцию. Любой GBlock однозначно идентифицируется его RIPEMD 160 хэшем. DBlocks хранят фактическое содержимое файла и ничего, кроме него. Файл разбивается на части по границе в 1024 байта, и полученные фрагменты сохраняются в DBlocks. DBlocks связываются друг с другом в дерево Меркла посредством IBlocks, которые содержат идентификаторы DBlocks. Блоки шифруются симметричным ключом, производным от, при хранении в сети.

Вопросы и ответы

Протокол анонимности GNUnet состоит из запросов и ответов. В зависимости от нагрузки пересылающего узла, сообщения пересылаются на ноль или более узлов. Запросы используются для поиска контента и запроса блоков данных. Запрос содержит идентификатор ресурса, адрес для ответа, приоритет и TTL (Time to Live). Идентификатор ресурса данных – это тройной хэш. Узел, отвечающий на запрос, предоставляет его, чтобы доказать, что у него действительно есть запрошенный ресурс, не раскрывая его промежуточным узлам, поэтому промежуточные узлы не могут его расшифровать. Адрес для ответа – это основное отличие от протокола Freenet. В то время как в Freenet ответ всегда распространяется обратно по тому же пути, что и запрос, в GNUnet путь может быть короче. Узел, получивший запрос, может отбросить его, переслать без изменения адреса для ответа или перенаправить, заменив адрес для ответа своим собственным адресом. Перенаправляя запросы, узел обеспечивает маскировочный трафик для своих собственных запросов, а пересылая их, избегает быть звеном в распространении ответов и сохраняет свою пропускную способность. Эта функция позволяет пользователю обменивать анонимность на эффективность. Пользователь может указать уровень анонимности для каждой операции публикации, поиска и загрузки. Уровень анонимности, равный нулю, может быть использован для выбора неанонимного обмена файлами. Инфраструктура DHT GNUnet используется только в случае указания неанонимного обмена файлами. Уровень анонимности определяет, какой объем маскировочного трафика должен иметь узел, чтобы скрыть действия пользователя. Приоритет указывает, какую часть доверия пользователь готов потратить в случае нехватки ресурсов. TTL используется для предотвращения слишком длительного нахождения запросов в сети.

Система имен GNU

GNUnet включает в себя реализацию GNU Name System (GNS) — децентрализованную и устойчивую к цензуре замену DNS. В GNS каждый пользователь управляет собственными зонами и может делегировать поддомены зонам, управляемым другими пользователями. Поиск записей, определенных другими пользователями, осуществляется с помощью DHT GNUnet. GNS был стандартизирован, а реестр GANA управляет доменной зоной верхнего уровня ".alt" в GNS.

Перевод протокола

GNUnet может туннелировать IP-трафик по одноранговой сети. При необходимости GNUnet может выполнять трансляцию протоколов IPv4 и IPv6 в процессе. GNUnet предоставляет DNS-шлюз на уровне приложений для проксирования DNS-запросов и сопоставления адресов с требуемым адресным семейством. Таким образом, GNUnet предлагает возможную технологию для облегчения перехода на IPv6. Более того, в сочетании с GNS система трансляции протоколов GNUnet может использоваться для доступа к скрытым сервисам — сервисам на основе IP, работающим локально на одном из узлов сети и доступным только через разрешение имени GNS.

Социальные API

Габор X Тот опубликовал в начале сентября 2013 года диссертацию, представляющую дизайн сервиса обмена социальными сообщениями для peer-to-peer фреймворка GNUnet, обеспечивающего масштабируемость, расширяемость и сквозное шифрование. Масштабируемость достигается за счет доставки сообщений по технологии многоадресной рассылки (multicast), а расширяемость – благодаря использованию PSYC (Протокол синхронной конференции), который предоставляет расширяемый синтаксис RPC (Remote Procedure Call), способный развиваться со временем без необходимости обновления программного обеспечения на всех узлах сети. Еще одной ключевой особенностью уровня PSYC являются каналы с сохранением состояния, используемые, например, для хранения профилей пользователей. Сквозное шифрование обеспечивается сетчатым сервисом GNUnet, на основе которого построены каналы многоадресной рассылки. Псевдонимные пользователи и социальные пространства в системе имеют криптографические идентификаторы – определяемые их открытым ключом – которые сопоставляются с удобными для запоминания именами с помощью GNS (GNU Name System), где у каждого псевдонима есть зона, указывающая на его пространства. Это необходимый элемент для превращения фреймворка GNUnet в полноценную одноранговую платформу для социальных сетей.

Чат

В модуле CADET реализован чат, для которого существует GTK-интерфейс для GNOME, специально разработанный для перспективных Linux-смартфонов (таких как Librem 5 или PinePhone).