使用 Debian Apt-get 通过 Freenet
Freenet 因被称为“Napster 之子”或某些同样有损声誉的报道而备受炒作。 为了 Freenet 能够生存下去,它需要摆脱仅仅是另一种获取非法 MP3 的方式的形象。 用法律术语来说,Freenet 需要“大规模的非侵权使用”。 抱歉,但获取最新版本的Quake不算作非侵权。
本文介绍了一种 Freenet 的用途,很少有人会对此感到不满(除非你使用基于 RPM 的发行版,对此我说“换一个真正的软件包管理器!”)。 它也再次说明了小型、灵活的工具的力量,这些工具专注于做好一件事。
作为一名 Debian 用户,我经常在生产环境中使用我选择的发行版,我在选择从中下载新软件包的镜像 FTP 站点时遇到了问题。 有时镜像站点已经用户超载,有时它没有我需要的软件包,还有时它完全失败。 我可以求助于使用官方的 ftp.debian.org,但这很不礼貌。 如果我不必考虑这些就好了。
幸运的是,Freenet 的创建者给了我一个答案,他们起初甚至没有意识到。 虽然 Freenet 与匿名性有很大关系,但它也提供了一个高效的镜像系统,任何中心化系统都无法企及。
本文中描述的系统不需要为 Freenet 或 Apt-get 编写新代码。 它采用了 Freenet 的标准用户界面插件,称为 FProxy,最初旨在供用户通过 Web 浏览器访问 Freenet。 由于它通过 HTTP 与浏览器通信,而 Apt-get 已经知道如何通过 HTTP 通信,因此此过程仅需要运行一些简单的命令并修改 /etc/apt/sources.list。
在继续之前,请务必从 www.freenetproject.org 下载最新版本的 Freenet(截至本文撰写时为 0.3.9.1,尽管在您阅读本文时可能会有所更改)。 在您的本地机器上设置一个节点,并使用一些测试文件进行插入和请求。 打开您最喜欢的浏览器,并将其指向 https://:8081。 如果它弹出一个用于请求和插入文件的页面,则一切都应设置正确。 请注意,FProxy 可能需要一段时间才能启动,具体取决于您机器的速度以及您正在运行的 Java 虚拟机。
顺便说一句,您可以获得一个 Debian 软件包,它可以为您安装 Freenet。 它可以在上面的网站或 Debian unstable 中找到。 不幸的是,由于大数字类的错误实现,Freenet 无法在当前版本的 Kaffe (1.0.6) 上运行,因此它只能在非自由虚拟机上运行;您可以在“contrib”中找到它。 如果您对此有问题,您可以选择使用 Kaffe 的修补版本、最新的 CVS 版本的 Kaffe,或者等到下一个稳定版本发布。 当前的计划是使未来版本的 Freenet 能够在 GCJ 下编译,GCJ 将 Java 代码转换为本机机器代码,完全绕过非自由虚拟机的问题。
如果您想知道,Freenet 大量使用了强大的密码学,因此您也会在非美国地区找到它。 根据需要编辑您的 sources.list。
FProxy 旨在成为 Freenet 的默认用户界面。 虽然它不是一个完整的代理服务器,但它通过 HTTP 与浏览器通信(这就是您之前将浏览器打开到 https://:8081 时显示的内容)。 在意识到 Apt-get 已经可以理解 HTTP 之后,人们意识到从 Freenet 获取软件包将非常简单。
在继续之前,请备份您当前的 /etc/apt/sources.list。 我第一次没有这样做,并且花了几个令人恼火的小时才使该系统再次正确下载软件包。
现在,将此行添加到真正的 sources.list
deb https://:8081/debian-test/dists stable
有关更多信息,请参阅 sources.list(5) 手册页。 您需要修改 https://:8081 以反映 FProxy 正在运行的端口。 此端口在配置文件 .freenetrc 中设置,该文件位于 Freenet tarball 解压缩的顶层目录中。 如果您使用了 Debian 软件包,它将位于 /etc/freenet/freenetrc 中。
您还需要将 application/x-debian-package 添加到 FProxy 的 passthroughMimeTypes 中。 这将在 fproxyrc 中(在 0.3.8.1 之前),或者您可以在 freenetrc 的 services.fproxy.passthroughMimeTypes 下找到它。
接下来,转到 Debian 镜像并下载(从目录 /debian/dists/stable/main/binary-<your-arch>/,根据需要替换 <your-arch>)Packages、Packages.gz 和 Release。 插入所有这些(见下文)。 现在从 Debian 镜像上的 devel 目录下载“hello”软件包,并将其也插入,确保将其放在完全相同的名称下。 现在您应该能够运行 apt-get update (这将从您的节点下载 Packages 文件),然后运行 apt-get install hello,这将下载并安装 GNU Hello 程序。 如果它工作了,恭喜! 您现在可以从 Freenet 获取软件包了。
要插入这些软件包,您首先需要创建一个 SVK 密钥对。 这允许您插入到一个只有拥有私钥的人才能访问的子空间。 要做到这一点,输入
freenet_insert -makeKeypair &> keypair.svk
现在,在您最喜欢的文本编辑器中打开 keypair.svk,删除除私钥值之外的所有内容,并将结果保存到 prv.svk 中。 您现在可以使用以下命令插入:
freenet_insert -serverAddress 127.0.0.1:<port> SSK@`cat prv.svk`/<dir>/<filename> <filename>将 <port> 替换为您 Freenet 节点正在运行的端口号,将 <dir> 替换为您想要插入的“目录”(Freenet 实际上没有目录,但我们可以假装它有),将 <filename> 替换为文件名。 您可以通过返回 keypair.svk,删除除公钥值之外的所有内容并将其保存为 pub.svk 来检索文档。 然后输入
freenet_insert -serverAddress 127.0.0.1:<port> SSK@`cat pub.svk`/<dir><filename> <filename>按照上述说明替换内容。 您可以通过将公钥发送给其他人来允许他们访问这些文件。
此方法避免了一个问题,该问题出现在一种更简单的、可猜测的密钥类型 KSK 中,KSK 实际上是一个子空间,私钥是公开已知的。 问题是,无法知道 KSK 是否真的拥有它应该拥有的数据。 因此,攻击者可以通过以 hops-to-live 值为 1 插入不同的文档并在传输到下一个节点之前切断链接来替换它。 这样做足够多次将完全替换大多数 Freenet 的文档。 这意味着很容易用病毒替换例如 libc6 软件包。 想想软件包通常必须从 root 安装,您就会明白这可能会造成什么样的损害。 即使使用子空间,也强烈建议您检查您正在下载的软件包的 MD5 校验和。
一切通过 Freenet (EOF) 项目维护着当前维护的发行版列表,这些发行版位于子空间下,在不知道关联的私钥的情况下无法接管。 子空间使用起来稍微复杂一些,但安全性要高得多。 请参阅 eof.sourceforge.net/APT 以获取有关此方面的说明。
所以你可以从 Freenet 获取 Debian 软件包。 没什么大不了的。 您可以使用您一直使用的 FTP 或 HTTP 服务器来完成此操作。 不仅如此,现在您还必须担心软件包会因为不够流行而从商店中掉出来。
嗯,这可是件大事。 维护起来很麻烦的庞大镜像列表现在在很大程度上是不必要的了,取而代之的是 Freenet 内的自动更新。 这减轻了大量的带宽拥塞。
尽管如此,我们如何防止软件包掉出来呢? 在一个健康的 Freenet 上,一个文件必须非常不受欢迎才会掉出来。 不用说,当前的 Freenet 不是很健康(尽管拥有数千个über-稳定的 Debian boxen 可能会有所帮助)。 但是,我们需要一种方法来确保那些鲜为人知但又非常需要的软件包仍然可用。
一个建议是在 Apt-get 周围创建一个包装脚本。 这将首先通过 Freenet 请求调用 apt-get install <package>。 如果软件包不可用,它将自动从 FTP 或 HTTP 镜像下载它,向您的特定 Debian 发行版的 Freenet 维护者发送电子邮件(前提是您在您的机器上正确设置了邮件),并警告他们软件包已从 Freenet 中掉出。 然后它实际上会安装它下载的软件包。
但这行不通。 您必须知道子空间的私钥,它才能对除您之外的任何人有用。 另一方面,子空间中的文档几乎总是重定向到 CHK(密钥名称是数据哈希值的密钥,因此相同的数据将产生相同的 CHK 名称)。 如果重定向仍然存在,但 CHK 下的数据已掉出,您可以重新插入 CHK。 但是,如果重定向文档掉出来,我们能期望的最佳结果是向维护者发送电子邮件,要求他们重新插入。
继续其他想法,我们遇到了不稳定的发行版问题,这给 Freenet 带来了独特的挑战。 当前版本没有提供更新内容的真正方法。 这对于快速发展的 Debian unstable 来说效果不佳。 实际上,在 Freenet 中加入了一种使用基于日期和版本的重定向的 hack,以响应保持 Debian unstable 在 Freenet 和 FTP 服务器中相同的问题。 即使如此,这仍然需要大量的带宽才能完成。
基于日期的更新概念(将日期放在密钥名称中并每天重新插入)被提出,特别是由于如何更新 Debian 软件包的问题。 我个人的感觉是,基于日期的更新对于相对较小的网站来说是好的,但对于要放入整个 Debian 发行版中的文件数量来说太多了。 其他人可能不同意。
无论如何,在某种程度上仍然需要那些 FTP 或 HTTP 镜像。 但是,大多数镜像现在都是不必要的,因为大多数带宽可以由 Freenet 有效地分配。
另请注意,许多使 Freenet 更高效的新方法正在放入即将推出的 0.4 版本 Freenet 中。 0.3 版本在某些基本方面存在缺陷,使得只有最流行的文件容易获得。 如果运气好的话,我们应该在网络 0.4 版本中看到更多文件存活下来,在您阅读本文时,该版本很可能已经可用。
帮助 Freenet 和 Debian 项目的一个好方法是帮助我们在 Freenet 中镜像 Debian 软件包。 有脚本可以帮助完成此操作;我们只需要拥有大量带宽的人来帮助。
帮助镜像工作所需的基本要求是您运行了 Freenet 节点,并且愿意一次性使用大量带宽。 这些是首选的,这样您的 ISP 就不会因为您炸毁了 T3 试图插入所有这些东西而上门拜访。 这不是随便做的事情;当前的 Debian 2.2r2 i386 主存档大约有 2GB。 非美国版本要小得多,因此如果您不住在美国并且没有太多带宽,这可能是您的一个不错的选择。
有关帮助镜像 Debian 软件包的完整信息,请访问 eof.sourceforge.net/APT。 在那里您将找到用于镜像的脚本以及需要镜像的发行版列表。