Tor 隐藏服务

作者:Kyle Rankin

为什么只有客户端才能获得隐私?也给你的服务器一些隐私吧!

当人们编写隐私指南时,大多数情况下都是从客户端的角度编写的。无论您是使用 HTTPS、阻止跟踪 Cookie,还是更进一步通过 Tor 浏览互联网,这些隐私指南都侧重于帮助最终用户保护自己免受潜在的恶意和间谍网络的侵害。由于许多阅读《Linux Journal》的人都处于等式的另一边——他们运行着托管这些破坏隐私的服务的服务器——系统管理员也应该站出来,为帮助用户隐私尽一份力量。虽然其中一部分只是意味着确保您的服务支持 TLS,但在本文中,我将描述如何更进一步,使您的用户可以通过 Tor 隐藏服务完全匿名地使用您的服务。

工作原理

我不会深入探讨 Tor 本身如何工作的细节,以便您可以匿名使用网络——有关这些详细信息,请查看 https://tor.eff.org。Tor 隐藏服务在 Tor 网络内工作,并允许您注册一个内部的、仅 Tor 可访问的服务,该服务拥有自己的 .onion 主机名。当访问者连接到 Tor 网络时,Tor 会解析这些 .onion 地址,并将您定向到位于该名称后面的匿名服务。但与其他服务不同的是,隐藏服务提供双向匿名。服务器不知道客户端的 IP,就像您通过 Tor 访问的任何服务一样,但客户端也不知道服务器的 IP。这提供了终极的隐私,因为它在双方都受到保护。

警告和规划

与设置 Tor 节点本身一样,如果您想设置 Tor 隐藏服务,也需要进行一些规划,以避免因操作失误而破坏 Tor 的匿名性。从操作和安全的角度来看,都有很多规则,因此我建议您阅读这篇 优秀指南,以在一个地方找到最新的最佳实践。

在不深入探讨所有这些步骤的情况下,我确实想在这里列出一些通用指南。首先,您需要确保您托管的任何服务都只监听 localhost (127.0.0.1),并且不能通过常规互联网查看。否则,有人可能会将您的隐藏服务与公共服务关联起来。接下来,检查您正在运行的任何服务,并尝试从中删除特定的身份识别信息。这意味着如果您托管的是 Web 服务,请修改您的 Web 服务器,使其不报告其软件类型或版本;如果您运行的是动态站点,请确保您使用的任何 Web 应用程序也不报告其版本。

某些服务需要连接互联网以解析 DNS 名称或下载其他资源。重要的是,您需要配置您的服务,以便所有这些外部请求都通过 Tor 路由。您可以使用 iptables 规则强制所有流量通过本地 Tor 代理(就像客户端一样),或者如果您的服务支持 SOCKS 代理,您可以将其配置为使用内置的 Tor SOCKS 代理。

最后,虽然您可以从同一主机运行隐藏服务和中继节点,但最佳实践是将它们分开,这样您就无法将隐藏服务与特定的中继节点关联起来。此外,这意味着您可以只运行隐藏服务,而无需担心运行中继节点所涉及的任何风险。

如何配置隐藏服务

配置隐藏服务的第一步是安装 Tor。Tor 应该已针对大多数主要发行版打包,因此您只需使用您的包管理器即可拉取最新版本。如果您喜欢以更困难的方式做事,或者想绝对确保获得最新版本,您也可以绕过您的包管理器,并从 https://torproject.org 上的源代码构建 Tor。

无论您使用基于 Red Hat 还是 Debian 的发行版,您都将通过 /etc/tor/torrc 配置文件以相同的方式配置您的隐藏服务。您会看到,配置非常简洁明了。

隐藏 HTTP 服务

首先,让我们假设您要托管一个 Web 服务。确保您配置您的 Web 服务器,使其仅监听 localhost (127.0.0.1),以免泄露数据,从而更容易将您的隐藏服务与公共服务关联起来。接下来,将以下两行添加到您的 /etc/tor/torrc


HiddenServiceDir /var/lib/tor/hidden_service/http
HiddenServicePort 80 127.0.0.1:80

现在重启 Tor 服务 (sudo systemctl restart tor),您的服务将准备就绪。这还不错,对吧?HiddenServiceDir 选项将告诉您 Tor 应该在哪里存储有关此服务的信息(包括其 .onion 地址)。HiddenServicePort 选项告诉 Tor 它应该在哪个端口监听隐藏服务(在本例中为 80),以及将流量转发到哪个地址(在本示例中为 127.0.0.1:80)。

服务启动后,您会注意到 /var/lib/tor/hidden_service/http 下有两个不同的文件:“private_key” 和 “hostname” 文件。private_key 文件用于验证此特定隐藏服务。保护此文件非常重要,因为任何拥有其副本的人都可以冒充您的服务。hostname 文件包含您的隐藏服务的名称


$ sudo cat /var/lib/tor/hidden_service/http/hostname
o9asojd8aymqqtoa.onion

这个 .onion 主机名是您服务的访问者在他们的 Tor 浏览器中输入以访问您的内容。请注意,您在此处托管的是 HTTP 而不是 HTTPS。HTTPS 要求您为 f27sojd8aymqqtwa.onion 获取有效证书,这不可能实现。在任何情况下,Tor 都会负责验证和加密您与站点的通信,您可以将 private_key 文件视为类似于私有 TLS 密钥。

添加其他服务

您可以从一台服务器托管多个隐藏服务,Tor 允许您以多种方式进行设置。如果您希望同一个主机名托管多个服务,只需在同一个 HiddenServiceDir 下添加额外的 HiddenServicePort 指令。例如,如果我想将 SSH 添加到我现有的 HTTP 服务,我会这样做


HiddenServiceDir /var/lib/tor/hidden_service/http
HiddenServicePort 80 127.0.0.1:80
HiddenServicePort 22 127.0.0.1:22

但在现实中,您可能希望将不同的服务隔离到它们自己的 .onion 地址——这样,您就可以选择在将来通过将其在 /var/lib/tor/hidden_service 下的特定目录及其配置设置复制到新服务器来拆分它们。为此,请为每个服务提供其自己的 HiddenServiceDir 选项


HiddenServiceDir /var/lib/tor/hidden_service/http
HiddenServicePort 80 127.0.0.1:80
HiddenServiceDir /var/lib/tor/hidden_service/ssh
HiddenServicePort 22 127.0.0.1:22

现在您可以查看 /var/lib/tor/hidden_service/ssh/hostname 以查找您的 SSH 服务的新 .onion 地址。

结论

如您所见,配置 Tor 隐藏服务并不像您最初想象的那么困难。可以说,您重新配置您的服务以监听 localhost 所花费的时间将比配置 Tor 本身更长!

Kyle Rankin 是《Linux Journal》的技术编辑和专栏作家,也是 Purism 的首席安全官。他是《Linux Hardening in Hostile Networks》、《DevOps Troubleshooting》、《The Official Ubuntu Server Book》、《Knoppix Hacks》、《Knoppix Pocket Reference》、《Linux Multimedia Hacks》和《Ubuntu Hacks》的作者,也是许多其他 O'Reilly 书籍的贡献者。Rankin 经常在安全和开源软件方面发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论