GNUnet (Русский)

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

См. также https://gnunet.org/en/use.html и Wikipedia:GNUnet.

Установка

GNUnet можно установить с помощью пакета gnunetAUR. Последняя экспериментальная версия доступна как gnunet-gitAUR.

Начало работы

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

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

Конфигурация

Конфигурация по умолчанию должна работать из коробки в большинстве случаев. Для изменения конфигурации системы обратитесь к /etc/gnunet.conf, а для изменения конфигурации текущего пользователя - к ~/.config/gnunet.conf.

Для более подробной информации смотрите Configuration Handbook в руководстве. Смотрите также #Запуск демона от имени текущего пользователя в многопользовательской установке.

Использование

Вхождение в сеть GNUnet

Start и, возможно, enable службы gnunet.

Проверка сети

Вы можете проверить текущее состояние сети, запустив команду gnunet-peerinfo от имени обычного пользователя.

$ gnunet-peerinfo

Чтобы узнать идентификатор вашего пэра, запустите команду:

$ gnunet-peerinfo -s

Чтобы получить список пиров, с которыми вы непосредственно связаны (они называются "соседями"), запустите команду:

$ gnunet-core

Поиск файла

Используйте gnunet-search для поиска файла по ключевым словам (они не обязательно связаны с именем файла). Например, для поиска файлов, которые были проиндексированы по ключевому слову "commons", запустите:

$ gnunet-search --timeout='10 s' 'commons'.

Без указания таймаута (10 секунд в примере выше) gnunet-search работает вечно, ожидая, пока пользователь нажмет CTRL-C.

Команда gnunet-search имеет опцию --printf для работы с печатным выводом, несколько похожую на опцию -printf утилиты find. Пожалуйста, введите man gnunet-search для получения более подробной информации.

Загрузка

Вывод gnunet-search по умолчанию представляет собой список команд gnunet-download, которые вы можете напрямую скопировать и запустить как обычный пользователь.

Например, используя вывод, сгенерированный gnunet-search 'commons',

$ gnunet-search 'commons'
#1:
gnunet-download -o "Liotard (2017)_ Fablab - a new space for commons based peer production.pdf" gnunet://fs/chk/C6369DRQ3S8RYK1FD5VDE666W2HVEJ5G5GJRX29BH6ZM08CBRWS7FY9326RBJ4G0N8V1RJ2N802KBYZT7RJT2EDK1J9JR2DXK5MTVM0.4SXJCK9NT5XGCZ0YAJ0ETXJJGY3P2SMNZ0Q94N775YEX9SXS2RW5FWRFK4GMBTP668Z3R8QZZ4WSHW1KG1AVQ5VFC1VF5T3WF57GT58.336423

#2:
gnunet-download -o "Rose, Carol (1986)_ The Comedy of the Commons_ Commerce, Custom, and inherently Public Property.pdf" gnunet://fs/chk/TQK3A2C279EJQ50B1TQWFNTPMGQZJJ4JXYTF2D88D03H038TB7SVVSRBT74FMYPNZ47YZSV096PVVZH0TQ3B8KBVBV2H8GN9VAASTJR.CQ7M7843MGPZCV8M26NKH6EB5MBGZAXRWCF39YS668WM6F22D214GSXNTJ4RYGE7XF68VPZM4C19XR48TT4J8WH8S2E00C96Q8K6790.1593230

#3:
gnunet-download -o "Hardin, Garett (1968)_ Tragedy of the Commons.pdf" gnunet://fs/chk/Y1FD7D123CEGWDW544YDEP15YA5E7ZD2XRSJBNP0847A5JXMMZEZ0XACGRG42BBBTGKZ0ZCBW0A9T6196Z5N26HA6SP1T8GDAT5H5SG.RN38G25DMYG3TBQJEGWDZT2B84N1JYYJZ8VRJ8HG2G1A4EFD4GH5TZXB0RXV7QEMZBSKWCCEF736FXNH6C5BYKG9DSTV99ETFGC93R0.1520328

...

вы можете запустить,

$ gnunet-download -o "Hardin, Garett (1968)_ Tragedy of the Commons.pdf" gnunet://fs/chk/Y1FD7D123CEGWDW544YDEP15YA5E7ZD2XRSJBNP0847A5JXMMZEZ0XACGRG42BBTGKZ0ZCBW0A9T6196Z5N26HA6SP1T8GDAT5H5SG. RN38G25DMYG3TBQJEGWDZT2B84N1JYYJZ8VRJ8HG2G1A4EFD4GH5TZXB0RXV7QEMZBSKWCCEF736FXNH6C5BYKG9DSTV99ETFGC93R0.1520328

которая загрузит Hardin, Garett (1968)_ Tragedy of the Commons.pdf в текущий каталог.

Монтирование удаленного каталога GNUnet без его загрузки

Был разработан модуль gnunet-fuseAUR для монтирования удаленных каталогов из сети GNUnet. С помощью gnunet-fuse каталоги, опубликованные в сети GNUnet, могут быть смонтированы как файловые системы только для чтения, и доступ к ним осуществляется с помощью обычных файловых операций. В отличие от рекурсивной загрузки каталога через gnunet-download, преимущество этого метода в том, что файлы загружаются по требованию. Будут загружены только те файлы (или каталоги), к которым вы обращаетесь. Для получения дополнительной информации установите модуль и введите man gnunet-fuse.

Выгрузка

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

Ключевые слова не являются строго обязательными, но они рекомендуются. Это связано с тем, что в GNUnet разрешен поиск не по имени файла, а по ключевым словам. Библиотека libextractor, которая является зависимой частью GNUnet, может автоматически извлекать ключевые слова из файла, но вы можете захотеть ввести свои собственные ключевые слова.

В следующем примере мы используем ключевые слова "commons" и "state" для публикации файла с именем ostrom.pdf.

$ gnunet-publish -k 'commons' -k 'state' ostrom.pdf

Теперь пользователи GNUnet могут найти этот файл с помощью команды gnunet-search.

$ gnunet-search 'commons'
.
#1:
gnunet-download -o "ostrom.pdf" gnunet://fs/chk/M57S...

Чтобы получить список всех файлов, которые в настоящее время опубликованы, запустите gnunet-fs -i. Если позже вы захотите прекратить совместное использование файла, вы можете использовать gnunet-unindex filename (в нашем примере gnunet-unindex 'ostrom.pdf').

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

Обратите внимание, что может пройти некоторое время (до нескольких часов), пока ваши коллеги смогут увидеть ваши свежезагруженные файлы.

Warning Отмена публикации файла остановит только текущую машину от обмена файлом, но не удалит файл из сети GNUnet - что по замыслу невозможно - так как другие люди могли скачать файл и поделиться им самостоятельно. В любом случае gnunet-publish следует считать необратимым действием

Команда gnunet-publish предлагает опцию - -n или эквивалентно --noindex - для публикации файла без его индексирования. При ее использовании GNUnet выполнит полную вставку и сохранит весь файл в зашифрованном виде в базе данных GNUnet.

Эта опция была создана с целью избежать того, чтобы тот, кто имеет физический доступ к компьютеру, на котором работает GNUnet, узнал, какие файлы в настоящее время публикуются, в случае цензурированных файлов в странах с сильной цензурой. Файлы, опубликованные с опцией --noindex, будут отображаться как куски, загруженные из сети, и как таковые не могут быть неопубликованы/неиндексированы (они никогда не были проиндексированы в первую очередь); однако всегда можно указать низкий приоритет содержимого при публикации (--prio) и сказать GNUnet, что содержимое, которое будет опубликовано, может быть легко потеряно, когда база данных станет полной.

Для получения дополнительной информации, пожалуйста, прочитайте главу о совместном использовании файлов в справочнике. См. также https://gnunet.org/en/use.html#filesharing.

Изменение и удаление индексированных файлов

  • Когда вы изменяете файл, URI файла изменяется. Поэтому GNUnet считает, что это совершенно другой файл, и индексированный файл будет считаться отсутствующим. Поэтому сначала убедитесь, что исходный файл не проиндексирован (с помощью команды gnunet-unindex), измените файл, а затем проиндексируйте новый файл, чтобы сделать его доступным через сеть.
  • Если вы хотите удалить файл из файловой системы, то сначала нужно снять с него индексацию.
  • Если вы заранее знаете, что опубликованный файл, скорее всего, будет нуждаться в обновлении чаще или реже, смотрите #Публикация обновляемых файлов.

Загрузка + обмен

Файлообменная сеть GNUnet представляет собой DHT (см. Wikipedia:Distributed hash table). В качестве пиров в DHT пользователи хранят на своем диске фрагменты различных файлов, даже из файлов, которые они не скачивают или уже скачали. Какие файлы хранятся, зависит от метрики/алгоритма расстояния DHT.

Технически, если файл не был полностью скачан, хранятся только его части. Они хранятся в кэше (обычно в /var/lib/gnunet/.local/share/gnunet). Если DHT-запрос обращается к пиру для получения одной из кэшированных частей, пир предоставит ее. База данных, используемая для хранения блоков совместного использования файлов, поддерживается в ограниченном объеме (ниже настраиваемой квоты), и все кэшированные части могут истечь, чтобы освободить место для новых файлов.

Если кто-то поделится файлом в сети GNUnet, распределенные части этого файла останутся в кэше сети на некоторое время, и файл останется доступным, даже если тот, кто поделился им, уйдет в офлайн. Но если первоначальный издатель пропал, и никто больше не поделился файлом явно (с помощью gnunet-publish), файл в конце концов станет недоступным, поскольку кэш пиров истечет или пиры уйдут в оффлайн.

Единственный способ гарантировать, что файл сохраняется в сети GNUnet, - это повторно опубликовать его явно после загрузки (с помощью gnunet-publish) и позволить машине, которая публикует файл, регулярно посещать сеть.

Публикация файла после загрузки всегда будет генерировать тот же URI, по которому файл был загружен (gnunet://fs/chk/Y1FD... в примере ниже), независимо от ключевых слов, выбранных для повторной публикации:

$ gnunet-download -o 'Hardin, Garett (1968)_ Tragedy of the Commons.pdf' gnunet://fs/chk/Y1FD...
100% [============================================================]
Загрузка `Hardin, Garett (1968)_ Tragedy of the Commons.pdf' выполнена (160 b/s).
$ gnunet-publish -k 'tragedy' 'Hardin, Garett (1968)_ Tragedy of the Commons.pdf'
Публикация `/srv/filesharing/gnunet/Hardin, Garett (1968)_ Tragedy of the Commons.pdf' выполнена.
URI - `gnunet://fs/chk/Y1FD...

Общение с другими пользователями GNUnet

Для общения с пользователями GNUnet доступна утилита gnunet-messenger, для которой gnunet.service user unit должен быть start" (возможно, вместе с системным блоком gnunet.service - см. #Запуск демона от имени текущего пользователя в многопользовательской установке). Например, чтобы войти в комнату "miscellanea", используя "alice" в качестве псевдонима, запустите

$ gnunet-messenger -e alice -r miscellanea
* Добро пожаловать в мессенджер, 'alice'!
* Вы пытаетесь открыть комнату...
* Вы присоединились к комнате.
[EHDA8T] * 'anonymous' открыл комнату: 2ABN944E16FTWFMOKTMQ5JMPQ233YSPBKC47XR2DHSPQCQ8GYK80
[EHDA8T] * 'anonymous' переименован в 'alice'

VPN

GNUnet предоставляет VPN, которая может быть использована для совместного использования вашего интернет-соединения (да, это может быть опасно, как и запуск узла выхода Tor), или для предоставления доступа к службам на вашем хосте (это должно быть менее опасно, при условии, что эти службы безопасны).

Информацию о том, как настроить VPN с помощью GNUnet, см. на сайте https://gnunet.org/en/use.html#vpn.

Служба имен GNU (GNS)

Служба имен GNU (GNS) - это полностью децентрализованная альтернатива Domain Name System (DNS), которая не должна страдать теми же серьезными недостатками безопасности, что и последняя (см. Wikipedia:Domain Name System#Security issues).

Информацию о том, как использовать GNS, см. на сайтах https://gnunet.org/en/use.html#gns_cli и https://gnunet.org/en/use.html#gns_browser.

Экосистема приложений

GNUnet GTK

GNUnet GTK - это набор графических интерфейсов для фреймворка GNUnet. Он поставляет следующие GTK приложения:

  • gnunet-conversation-gtk
  • gnunet-fs-gtk
  • gnunet-namestore-gtk
  • gnunet-peerinfo-gtk
  • gnunet-setup
  • gnunet-statistics-gtk

Для установки GNUnet GTK загрузите пакет gnunet-gtkAUR.

Messenger GTK

В настоящее время разрабатывается несколько графических пользовательских интерфейсов для общения в сети GNUnet. Один из них - Messenger GTK (messenger-gtkAUR, или messenger-gtk-gitAUR для версии разработки), удобный для мобильных устройств GTK графический пользовательский интерфейс для общения с пользователями GNUnet. См. также Cadet GTK (cadet-gtkAUR), предыдущее приложение для чата, написанное теми же авторами.

Веб-интерфейс пользователя

Веб-интерфейс для GNUnet существует и доступен как gnunet-webui-gitAUR.

re:claimID

re:claimID - это децентрализованный сервис Identity Provider (IdP), построенный на базе системы имен GNU. Он позволяет пользователям безопасно обмениваться личной информацией с веб-сайтами, используя стандартизированные протоколы (OpenID Connect).

Для пользователей re:claimID предлагает расширение для Firefox и расширение для Chromium для управления идентификацией re:claimID в браузере (необходимо установить пакет gnunetAUR).

После установки расширения можно будет добавить новую личность в локальный экземпляр re:claimID и добавить к ней некоторые атрибуты, посетив сайт https://ui.reclaim/ (ссылка не будет работать без установленного расширения).

За дополнительной информацией обращайтесь к руководству.

GNU Taler

GNU Taler - это система микротранзакций и электронных платежей, построенная поверх GNUnet. В отличие от других распределенных платежных систем Taler основана не на блокчейне, а на слепых подписях.

Для получения дополнительной информации обратитесь к официальной документации. См. также пакеты syncAUR, taler-exchangeAUR, taler-mdbAUR, taler-merchantAUR и taler-twisterAUR.

GNU Anastasis

GNU Anastasis - это протокол и реализация, позволяющие пользователям надежно хранить основные секреты в открытом наборе провайдеров условного депонирования и восстанавливать эти секреты в случае потери их оригинальных копий. Anastasis доступен на AUR (anastasisAUR и anastasis-gtkAUR). За дополнительной информацией обращайтесь к сайтам https://www.gnu.org/software/anastasis/ и https://anastasis.lu/.

Устранение неполадок

GNUnet не удается опубликовать файлы

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

Простым решением является создание общего каталога, где права на запись имеют только пользователи, входящие в группу gnunet, и использование его для размещения файлов, которые будут опубликованы. Например, /srv/filesharing/gnunet может быть хорошим выбором:

# install -dm775 -g gnunet -o gnunet /srv/filesharing/gnunet

Каждый пользователь, входящий в группу gnunet, может затем создать ссылку на него в своем домашнем каталоге,

$ ln -s /srv/filesharing/gnunet ~/Publishing

которая может быть разыменована gnunet-publish:

$ (cd ~/Publishing && gnunet-publish -k commons ostrom.pdf) && gnunet-fs -i
/srv/filesharing/gnunet/ostrom.pdf

Низкая пропускная способность

Для совместного использования файлов рекомендуется увеличить ограничения пропускной способности GNUnet по сравнению с довольно низкими значениями по умолчанию. Приведенный ниже пример устанавливает ограничения WAN и LAN на unlimited.

$ gnunet-config -s ats -o WAN_QUOTA_IN -V unlimited
$ gnunet-config -s ats -o WAN_QUOTA_OUT -V unlimited
$ gnunet-config -s ats -o LAN_QUOTA_IN -V неограниченно
$ gnunet-config -s ats -o LAN_QUOTA_OUT -V unlimited

/var/lib/gnunet/ становится слишком большим

Кэш GNUnet ограничен и не может расти бесконечно. Однако квота, зарезервированная для него по умолчанию, не маленькая (в настоящее время 5 ГБ). Чтобы уменьшить это число, вы должны присвоить желаемое значение ключу QUOTA в секции datastore раздела /etc/gnunet.conf.

/etc/gnunet.conf
...

[datastore]
...
КВОТА = 2 ГБ
...

/var/lib/gnunet/ остается после деинсталляции

Каталог /var/lib/gnunet/ - это домашний каталог системного пользователя gnunet, который остается после деинсталляции GNUnet. Если вы уверены, что больше никогда не будете использовать GNUnet, запустите:

# userdel -r gnunet
# groupdel gnunetdns
Warning Идентификатор и вся информация о сети, хранящаяся в совокупности у текущего пира, будет уничтожена - это не повлияет на файлы, явно загруженные по другим путям.

Сеть слишком статична

По умолчанию GNUnet загружает себя, используя файл hostlist, загруженный из интернета (обычный https) каждый раз, когда подключается к сети. Если вы хотите указать ему изучать и запоминать списки хостов, предоставленные другими пользователями, вам нужно добавить опцию -e к ключу OPTIONS в разделе hostlist в /etc/gnunet.conf. Также доступны дополнительные опции.

/etc/gnunet.conf
...

[hostlist]
...
# Опции:
# -p : предоставить список хостов в качестве серверов списка хостов.
# -b : загрузка с использованием настроенных серверов списка хостов
# -e : включить обучение рекламируемых хостлистов
# -a : рекламировать список хостов другим серверам
OPTIONS = -b -e -a -p
...

Советы и рекомендации

Запуск демона от имени текущего пользователя в многопользовательской установке

После свежей установки отсутствует файл конфигурации пользователя. В многопользовательской установке он используется практически только (при необходимости) для start и stop gnunet.service user unit во время работы системного демона, поэтому обычно достаточно создать минимальный конфигурационный файл, содержащий только:

~/.config/gnunet.conf
[arm]
START_SYSTEM_SERVICES = NO
START_USER_SERVICES = YES

Если не установить START_SYSTEM_SERVICES в NO, запуск демона от имени текущего пользователя при запущенном системном демоне приведет к дублированию процессов.

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

Кнопка для включения и выключения GNUnet

Если вы используете GNOME, вы можете установить расширение оболочки Systemd Manager (gnome-shell-extension-systemd-managerAUR) и добавить в него GNUnet:

$ dconf write /org/gnome/shell/extensions/systemd-manager/systemd \
	''['\''{'name''':'GNUnet system service'','service'':'gnunet.service'','type''':'system'}'\'','\''{'name'':'GNUnet user service'','service'':'gnunet.service'','type''':'user'}'\'']'.

(После установки расширения вам может потребоваться перезапустить сессию).

Однопользовательская установка

Пир GNUnet может быть запущен и от текущего пользователя без запуска системной службы gnunet. Для однопользовательской установки убедитесь, что START_SYSTEM_SERVICES и START_USER_SERVICES установлены в YES в ~/.config/gnunet.conf:

~/.config/gnunet.conf
[arm]
START_SYSTEM_SERVICES = YES
START_USER_SERVICES = YES

Чтобы запустить пир от имени текущего пользователя, запустите gnunet.service user unit. Чтобы остановить пир, запущенный от имени текущего пользователя, stop блок пользователя gnunet.service.

За дополнительной информацией обращайтесь к главе об однопользовательской настройке в руководстве.

Публикация обновляемых файлов

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

Для создания ego доступна утилита gnunet-identity, для которой gnunet.service user unit должна быть start" (возможно, вместе с системной единицей gnunet.service - см. #Запуск демона от имени текущего пользователя в многопользовательской установке). Например, чтобы создать эго с именем "caroline", запустите пользовательский блок gnunet и запустите:

$ gnunet-identity -C caroline
Примечание Если позже вы решите стереть это эго, вы можете запустить gnunet-identity -D caroline.

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

$ gnunet-publish -P caroline -t 'diary version 1' -N 'diary version 2' -k 'diary' until-2020/my_diary.md
Публикация `/srv/filesharing/gnunet/until-2020/my_diary.md' выполнена.
URI - `gnunet://fs/chk/AF26...'.

URI пространства имен - `gnunet://fs/sks/V3TK.../diary version 1'.

Когда обновление будет готово, вам придется использовать ту же строку, которую вы выбрали для него ранее ("дневник версии 2" в нашем примере), возможно, сопроводив ее другим именем для следующего обновления (если это применимо):

$ gnunet-publish -P caroline -t 'diary version 2' -N 'diary version 3' -k 'diary' until-2021/my_diary.md
Публикация `/srv/filesharing/gnunet/until-2021/my_diary.md' выполнена.
URI - `gnunet://fs/chk/5Y7V...'.

URI пространства имен - `gnunet://fs/sks/V3TK.../diary version 2'.

Если вы решили, что обновление будет последним, опустите опцию -N (не позволит никаких последующих обновлений).

Обратите внимание, что обновление с помощью GNUnet не сделает старое содержимое недоступным, GNUnet просто позволяет издателю указать пользователям на более свежие версии.

Запуск и остановка GNUnet без systemd

GNUnet поставляется с собственной системой управления демонами, Automatic Restart Manager (ограничен службами GNUnet).

Для запуска системных служб вручную без systemd запустите утилиту gnunet-arm от имени пользователя gnunet:

$ sudo -u gnunet gnunet-arm -c /etc/gnunet.conf -s

Чтобы завершить работу системных служб вручную без systemd, запустите:

$ sudo -u gnunet gnunet-arm -c /etc/gnunet.conf -e

Чтобы запустить пользовательские службы вручную без systemd, запустите утилиту gnunet-arm от имени текущего пользователя:

$ gnunet-arm -c ~/.config/gnunet.conf -s

Чтобы завершить пользовательские службы вручную без systemd, запустите:

$ gnunet-arm -c ~/.config/gnunet.conf -e