GNUnet

来自 ArchWiki

GNUnet 是一个安全和匿名的点对点网络框架,不使用任何中心化或其他受信任的服务。目前,该框架提供抗审查的文件共享、消息传递、VPN、GNS (去中心化版本的 DNS) 以及更多功能。

另请参阅 https://gnunet.org/en/use.htmlWikipedia:GNUnet

安装

安装 以下软件包之一

配置

默认的 GNUnet 配置是多用户配置。这意味着系统服务由 gnunet 系统用户运行,而属于 gnunet 组的用户可以与守护进程交互 - 例如搜索和下载文件。

在使用 GNUnet 之前,您必须确保将您的用户添加到 gnunet 组以获得必要的权限。

默认配置在大多数情况下应该可以开箱即用。要更改系统配置,请参阅 /etc/gnunet.conf,而要更改当前用户配置,请参阅 ~/.config/gnunet.conf

有关更多见解,请参阅手册中的 配置手册。另请参阅 #在多用户设置中以当前用户身份启动守护进程

用法

进入 GNUnet 网络

启动 并且可能需要 启用 gnunet 系统服务。某些操作还需要启动 gnunet 用户服务。

检查网络

您可以以普通用户身份启动 gnunet-peerinfo 命令来检查网络的当前状态。

$ gnunet-peerinfo

要了解您的对等身份,请启动

$ gnunet-peerinfo -s

要列出您直接连接的对等节点(这些节点称为“邻居”),请启动

$ gnunet-core

文件共享

默认情况下,文件共享服务每个用户运行,这意味着系统和用户 gnunet 服务都需要启动。如果您想更改此选项并每台机器运行文件共享,请相应地编辑 /etc/gnunet.conf

[fs]
...
RUN_PER_USER = NO
...
UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-fs.sock
...

搜索文件

使用 gnunet-search 通过关键字搜索文件(这些关键字不一定与文件名相关)。例如,要搜索已在 “commons” 关键字下索引的文件,请启动

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

如果不指定超时时间(在上面的示例中为 10 秒),gnunet-search 将永远运行,等待用户按下 CTRL-C。

gnunet-search 命令具有 --printf 选项,用于操作打印输出,这有点类似于 find 实用程序的 -printf 选项。请键入 man gnunet-search 以获取更多详细信息。

将搜索结果保存为 “GNUnet 目录”

使用 gnunet-search-o 选项将搜索结果保存为 “GNUnet 目录”(.gnd 文件)– 在这种情况下,您可能还希望禁止打印输出(-s 选项)。

例如,要搜索三秒钟并将 “commons” 关键字产生的结果保存到名为 three-seconds-commons.gnd 的文件中,请启动

$ gnunet-search -s -t 3s -o three-seconds-commons.gnd 'commons'

如果稍后您想检查 three-seconds-commons.gnd 的内容,您可以启动

$ gnunet-directory three-seconds-commons.gnd

下载

默认情况下,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/Y1FD7D123CEGWDW544YDEP15YA5E7ZD2XRSJBNP0847A5JXMMZEZ0XACGRG42BBBTGKZ0ZCBW0A9T6196Z5N26HA6SP1T8GDAT5H5SG.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
Publishing `/srv/filesharing/gnunet/ostrom.pdf' done.
URI is `gnunet://fs/chk/M57S...

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')。

一旦文件发布,就无法检索文件被索引的关键字(即反向搜索)。但是,始终可以向其添加更多关键字。

请注意,您的对等节点可能需要一段时间(最多几个小时)才能看到您新上传的文件。

警告: 取消发布文件只会阻止当前计算机共享该文件,但不会从 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% [============================================================]
Downloading `Hardin, Garett (1968)_ Tragedy of the Commons.pdf' done (160 b/s).
$ gnunet-publish -k 'tragedy' 'Hardin, Garett (1968)_ Tragedy of the Commons.pdf'
Publishing `/srv/filesharing/gnunet/Hardin, Garett (1968)_ Tragedy of the Commons.pdf' done.
URI is `gnunet://fs/chk/Y1FD...

VPN

GNUnet 提供了一个 VPN,可用于共享您的 Internet 连接(是的,这可能很危险,就像运行 Tor 出口节点一样),或者提供对主机上服务的访问权限(只要这些服务是安全的,这应该不那么危险)。

有关如何使用 GNUnet 设置 VPN 的信息,请参阅 https://gnunet.org/en/use.html#vpn

GNU 命名服务 (GNS)

GNU 命名服务 (GNS) 是 域名系统 (DNS) 的完全去中心化替代方案,它不应遭受与后者相同的主要安全缺陷(请参阅 Wikipedia:Domain Name System#安全问题)。

有关如何使用 GNS 的信息,请参阅 https://gnunet.org/en/use.html#gns_clihttps://gnunet.org/en/use.html#gns_browser

与其他 GNUnet 用户聊天

要与 GNUnet 用户聊天,可以使用 gnunet-messenger 实用程序,为此需要启动 gnunet.service 用户单元(可能还需要启动 gnunet.service 系统单元 – 请参阅 #在多用户设置中以当前用户身份启动守护进程)。例如,要使用 “alice” 作为昵称进入 “miscellanea” 房间,请启动

$ gnunet-messenger -e alice -r miscellanea
* Welcome to the messenger, 'alice'!
* You try to open a room...
* You joined the room.
[EHDA8T] * 'anonymous' opened the room on: 2ABN944E16FTWFMOKTMQ5JMPQ233YSPBKC47XR2DHSPQCQ8GYK80
[EHDA8T] * 'anonymous' gets renamed to 'alice'
█

应用生态系统

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 用户聊天。对于通过命令行聊天,请参阅 Messenger CLI (messenger-cliAURmessenger-cli-gitAUR 用于开发版本)。

Web 用户界面

GNUnet 的 Web 界面存在,可作为 gnunet-webui-gitAUR 获得。

re:claimID

re:claimID 是一个建立在 GNU 命名系统之上的去中心化身份提供商 (IdP) 服务。它允许用户使用标准化协议 (OpenID Connect) 与网站安全地共享个人信息。

对于用户,re:claimID 提供 Firefox 扩展Chromium 扩展,用于在 Web 浏览器中管理 re:claimID 身份(需要安装 gnunetAUR 软件包)。

安装扩展程序后,将可以访问 https://ui.reclaim/,从而向本地 re:claimID 实例添加新身份并向其添加一些属性(如果未安装扩展程序,则该链接将不起作用)。

有关更多信息,请参阅 手册

GNU Taler

GNU Taler 是一个建立在 GNUnet 之上的微交易和电子支付系统。与其他分布式支付系统不同,Taler 不是基于区块链,而是基于盲签名。

有关更多信息,请查阅 官方文档。另请参阅软件包 syncAURtaler-exchangeAURtaler-mdbAURtaler-merchantAURtaler-twisterAUR

GNU Anastasis

GNU Anastasis 是一种协议和实现,允许用户将核心密钥安全地存放在一组开放的托管提供商处,并在原始副本丢失时恢复这些密钥。Anastasis 在 AUR 上可用 (anastasisAURanastasis-gtkAUR)。有关更多信息,请查阅 https://gnu.ac.cn/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

如果您希望以当前用户身份运行文件共享服务,请相应地编辑 /etc/gnunet.conf

[fs]
...
RUN_PER_USER = YES
...
UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-fs.sock
...

低带宽

对于文件共享,建议您从实际相当低的默认值开始增加 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 unlimited
$ gnunet-config -s ats -o LAN_QUOTA_OUT -V unlimited

/var/lib/gnunet/ 增长过大

GNUnet 的缓存保持有限,不会永远增长。但是,默认情况下为其保留的配额并不小(目前为 5 GB)。要减少此数量,您必须在 /etc/gnunet.confdatastore 部分中为 QUOTA 键分配您首选的值。

/etc/gnunet.conf
...

[datastore]
...
QUOTA = 2 GB
...

卸载后遗留 /var/lib/gnunet/

/var/lib/gnunet/ 目录是 gnunet 系统用户的主目录,在卸载 GNUnet 后会保留下来。如果您确定您永远不会再使用 GNUnet,请启动

# userdel -r gnunet
# groupdel gnunetdns
警告: 身份以及当前对等节点累积存储的所有网络信息都将被销毁 – 这不会影响在其他路径中显式下载的文件。

网络过于静态

默认情况下,GNUnet 每次连接到网络时都会使用从 Internet 下载的 hostlist 文件(纯 https)进行自引导。如果您想指示它学习并记住其他对等节点提供的hostlist,您需要在 /etc/gnunet.confhostlist 下的 OPTIONS 键中添加 -e 选项。还有其他选项可用。

/etc/gnunet.conf
...

[hostlist]
...
# Options:
# -p : provide a hostlist as a hostlist servers
# -b : bootstrap using configured hostlist servers
# -e : enable learning advertised hostlists
# -a : advertise hostlist to other servers
OPTIONS = -b -e -a -p
...

技巧与窍门

在多用户设置中以当前用户身份启动守护进程

全新安装后,用户配置文件丢失。在多用户设置中,这几乎仅用于(如果需要)启动停止 gnunet.service 用户单元,而系统守护程序正在运行,因此通常只需创建一个最少的配置文件,其中仅包含

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

如果不将 START_SYSTEM_SERVICES 设置为 NO,则在系统守护程序运行时以当前用户身份启动守护程序将导致重复进程。

有关更多见解,请参阅手册中的 多用户设置

用于切换 GNUnet 开关的按钮

如果您使用 GNOME,您可能需要安装 Systemd Manager shell 扩展 (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 系统服务。对于单用户设置,请确保在 ~/.config/gnunet.conf 中将 START_SYSTEM_SERVICESSTART_USER_SERVICES 设置为 YES

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

要以当前用户身份启动对等节点,请启动 gnunet.service 用户单元。要停止以当前用户身份运行的对等节点,请停止 gnunet.service 用户单元。

有关更多信息,请参阅 手册中关于单用户设置的章节

发布可更新文件

可以发布 “可更新” 文件(即,您可能希望在将来发布不同版本的文件,声明它是同一文件 – 只是更新了 – 而不是不同的文件)。要发布可更新文件,您需要创建一个 ego 并使用它来签名文件。这是确保恶意方无法提供伪造更新的唯一方法。

要创建 ego,可以使用 gnunet-identity 实用程序,为此需要启动 gnunet.service 用户单元(可能还需要启动 gnunet.service 系统单元 – 请参阅 #在多用户设置中以当前用户身份启动守护进程)。例如,要创建名为 “caroline” 的 ego,启动 gnunet 用户单元并启动

$ gnunet-identity -C caroline
注意: 如果稍后您决定删除此 ego,您可以启动 gnunet-identity -D caroline

现在您已经创建了一个 ego,您需要指定一个字符串来标识文件的当前版本(-t 选项),以及现在已经指定了将标识您计划的下一个版本的字符串-N 选项)– 您将必须记住后者。两个字符串都可以包含任何内容。

$ gnunet-publish -P caroline -t 'diary version 1' -N 'diary version 2' -k 'diary' until-2020/my_diary.md
Publishing `/srv/filesharing/gnunet/until-2020/my_diary.md' done.
URI is `gnunet://fs/chk/AF26...'.

Namespace URI is `gnunet://fs/sks/V3TK.../diary version 1'.

当更新准备就绪时,您将必须使用您之前为其选择的同一字符串(在我们的示例中为 “diary version 2”),并且可能还会附带另一个名称用于进一步更新(如果适用)

$ gnunet-publish -P caroline -t 'diary version 2' -N 'diary version 3' -k 'diary' until-2021/my_diary.md
Publishing `/srv/filesharing/gnunet/until-2021/my_diary.md' done.
URI is `gnunet://fs/chk/5Y7V...'.

Namespace URI is `gnunet://fs/sks/V3TK.../diary version 2'.

如果您决定更新将是最后一个更新,请省略 -N 选项(将不允许任何未来的更新)。

请注意,使用 GNUnet 进行更新不会使旧内容不可用,GNUnet 仅允许发布者将用户指向更新的版本。

在没有 systemd 的情况下启动和停止 GNUnet

GNUnet 带有自己的守护程序管理系统,即自动重启管理器(仅限于 GNUnet 服务)。

要在没有 systemd 的情况下手动启动系统服务,请gnunet 用户身份启动 gnunet-arm 实用程序

[gnunet]$ gnunet-arm -c /etc/gnunet.conf -s

要在没有 systemd 的情况下手动结束系统服务,请启动

[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