本文将首先对暗网作以介绍,讲解如何利用暗网,进行安全的通信、提供隐蔽服务的方法,以及相关的注意事项。 之后将针对具体的暗网程序,介绍相应的配置使用方法。

1. 什么是暗网

1.1 暗网的发展史

我们当今使用的互联网的前身,是60年代一系列研究的成果。这些主要目的是军事的研究,其设计是“去中心化”, 以便保证在单个点不能工作的情况下(例如,一个基地被毁),仍然能维持其他基地互相通信。 随着互联网的民用,出现了各种各样的通信协议,例如,70年代的电子邮件协议,和90年代的HTTP协议。

但是,互联网在设计的时候,很少考虑加密的设计。 这大概是可以理解的,在60-70年代,密码学并没有如今这样发达,计算机的运算能力也不够充分。 例如,DES对称加密算法是70年代末的产物,其密钥长度只有56位。 到了90年代,出现了SSL/TLS,这时才有了按照今天的观点看,比较可以接受的加密技术。

互联网上保持匿名的设计的进度则更加落后。稍后将介绍的重要工具,Tor,是在90年代末期出现的。 Tor的诞生也是来自美国军方的项目,是在互联网上隐藏使用者或者服务提供者的地理位置的工具。

暗网这个名词,大概就是随着Tor和类似的工具的开发而产生的。 暗网不是在互联网之外的另一个物理网络。 它只是存在于互联网上的一系列服务器构成的也可以互相通信的系统, 在这个系统中,通信是匿名的、加密的,但是因为各种原因,和普通互联网几乎是隔绝的。 在暗网中,也存在服务器和客户端的区别。也存在网址。

笔者在本文中将不区分暗网(Darknet或者Dark Web)和深网(Deep Web)这两个名词。 在其他地方,这两个词似乎是按照不同的规模或者,是否你能只和认识的人(或者与此相反:陌生人)连接。 然而笔者认为,无论是Tor、i2p还是Freenet,在某种程度上都具有相似的特点,也都是构建在普通的互联网之上的应用, 对这类应用的认识,是可以统一的。

1.2 暗网的特点

暗网之间的通信,一般是采用多层加密的形式。 即每个用户在访问别的暗网节点的时候,其流量都会被一系列节点多次加密。 这样,只要有一个节点在链路中保护了连接的匿名性和机密性,整个链路就是匿名和机密的。 在暗网内部访问只属于暗网的服务时,由于采用了非对称加密,数据是直接到服务器才被解密的。 但是在借助暗网访问外界普通互联网时,一般借助于暗网出口服务器。 这样,出口服务器就有可能看到用户的访问内容。 但是即使这样,只要在访问内容中不包含用户的个人识别数据(例如姓名),出口服务器也是不能确定访问者的来源的。

1.3 暗网的意义

1.3.1 另一种匿名、对等而安全的互联网

暗网使得每台能运行暗网软件的计算机都可以提供服务,这是恢复了互联网的对等性。 虽然互联网在设计之初也是分布式的,但是由于各种运营商的存在,IP地址的容量限制和域名系统的限制等原因, 使用互联网进行“点到点”的通信是十分困难的。 暗网使得所有的节点都具备同样的提供服务和访问服务的能力,只要能访问暗网, 不管是位于数据中心的计算机,还是一台用WIFI接入网络的Android手机,都可以成为服务器

成为服务器是一个说起来似乎很简单的概念。但是却具有重要的价值。 什么是服务器?服务器可以干什么?这都是具有巨大潜力的话题:

  • 个人主页,介绍自己的兴趣爱好和经历,这可以是一个服务器;
  • 发布博客或者论坛,邀请别人参与讨论,这也可以是服务器的功能;
  • 接收发送邮件、即时通信消息,这也可以是服务器的功能;
  • 接收指令完成对其他机电设备——小到房间的灯光,大到战略核导弹的发射按钮——的控制,或者反馈控制结果,这也可以是服务器。
  • ……

在没有暗网的时候,要架设一个服务器,大概有如下步骤:

  1. 首先,要寻找一台可以成为服务器的电脑。 由于家用网络一般对提供HTTP之类的服务有限制,所以,可能选择的一般是租用服务器提供商的服务, 例如虚拟主机或者VPS。
  2. 为了让大家能访问这个服务器,还需要一个域名。 虽然服务器提供商会一般至少提供一个二级域名,例如abc123.provider.com这样的网址, 但是二级域名是有很多局限的,也不便于发展业务。
  3. 如果我购买的只是一台虚拟主机,那么我的网站的设计,也被局限在使用ASP或者PHP 这样的语言,提供仅限于HTTP的业务。这是说,我可以制作主页、论坛、博客, 但是如果要办一个邮件收发的网站,提供类似发送alice@abc.com的邮件的服务,就很难了。 至于做成和离线的业务交往的可能,例如做成一个气象台的实时数据报告网站,就几乎没有可能。
  4. 在网站成功架设之后,还要为网站的安全防护努力。 对于一个暴露在互联网上的普通网站,可能面临的威胁有例如黑客入侵,通过端口扫描找到网站的弱点; 也可能是DDOS攻击,采用大量请求让网站所在的计算机瘫痪; 还可能是一些在服务器和访问者之间链路上的主机,例如防火墙,隔绝访问,甚至篡改网站的通信等等。 网站为了和访问者之间通信安全,应该启用SSL/TLS防护。但是即使这样,也不能避免DDOS和黑客入侵。

在使用暗网架设网站的时候,则:

  1. 首先,只要寻找一个具有充足带宽的联网计算机。虽然很多家用网络限制服务,但是并不一定限制上行带宽。
  2. 其次,在这台计算机上安装暗网软件(例如Tor)、服务器软件和必要的防火墙(如果是Linux系统是自带的)。
  3. 配置暗网软件成为服务器软件作为隐藏服务的反向代理。
  4. 配置防火墙,使得只有暗网软件能访问外网。

这样考虑安全性,由于暗网内互相连接就是端到端加密的,所以不需要考虑SSL/TLS防护。 DDOS在暗网上也是不太可能的。只要服务器上的暗网代理软件能连接到暗网中的其他计算机, 服务器所在计算机外部的防火墙就不能干扰连接。 此外,由于可以使用服务器自带的防火墙软件限制只有暗网连接网络, 而Tor又是以反向代理的模式工作(就是只和服务器的服务端口建立联系),可以大大避免端口扫描的威胁。 更重要的是,服务器所在的地理位置是被隐藏的,不能通过直接看IP来找出服务器的物理位置。这是隐藏服务的匿名性

1.3.2 提供了鲁棒(Robust)的、难以监视的互联网访问

使用暗网提供服务,还有一个好处就是更加鲁棒(Robust)。Robust这个词的含义类似坚实、可靠。 暗网就是这样的一种构建。虽然互联网设计上本来就是分布式、可靠的, 但是这种可靠更多地是针对那些来自互联网之外的灾难:自然灾害、战争攻击等等导致的个别节点无法访问。 对于互联网内部出现的主动攻击,例如区域性的防火墙,互联网中很少有什么技术能抵抗这一点。

暗网提供了另一种可能。只要能够连接上暗网,就能和其他节点保持通信。 即使在此中间,有些节点因为什么原因被限制了访问,或者成为了坏节点(例如丢弃数据包或者进行主动的监视), 要到达目的节点只需要更换一个线路就可以了。由于加密在设计中的存在,想要监视暗网的通信内容也是很难的。

1.3.3 在某种程度上改善(或者说平均了)互联网的连接质量

笔者自身的体会是,使用Tor访问暗网服务有时候甚至比访问普通互联网的速度要快。 互联网的实际访问速度不仅仅取决于带宽。 实际上,互联网的各种提供商为了所谓优化连接质量,会根据访问的内容,对带宽进行各种控制。 这种做法虽然对于特定网站可能提高了用户的体验,但是对于其他网站则不尽然。

此外,对于很多网站,访问之前的DNS查询也是个可以导致问题的因素。 有些地区性的、由运营商提供的DNS,很可能有各种各样的问题:查询不到,或者劫持DNS,或者查询太慢(丢包)。 由于通过Tor访问的时候,流量在用户和目标网站之间总是加密的,而且DNS查询也是在远程进行的,这种问题就可以得到避免。 在很多时候,可以说,Tor使得互联网的连接质量得到改善,优劣差异不会变得很明显。 也许可以说,访问速度,主要取决于Tor所选定的线路的带宽,和本地的基本带宽。

1.4 暗网技术的两面性

暗网技术是很厉害的技术,有人说是平民的武器。因此,可以说和任何技术一样,暗网技术有两面性。

暗网上的服务器到现在有多少,由于暗网的特性,恐怕很难说得清楚。 在此之中,又有多少服务器是非法的,也很难说清楚。即使能举出一个数字来,因为总数不知道,我们甚至不知道比例。 但是,我想不管是普通的互联网还是暗网,想通过互联网犯罪的人总是有的,想正常使用互联网的人也是有的。

此外值得指出,虽然暗网上有一定比例的节点在提供违法犯罪的服务,但是这不代表暗网本身是违法的技术。 我们可以说,暗网是一种构建在互联网上的”虚拟互联网”, 它继承了互联网的思想,但因为互联网的物理结构和底层协议都已经形成, 不可能另起炉灶,所以建设在互联网的应用层次,作为一种“虚拟”的完善。 所以,就如同我们不能因为互联网上有网站是违法就否定互联网的价值一样,我们也不能否定暗网的价值。

笔者在此希望本文的读者,能首先,实事求是地从纯技术的角度来深入认识暗网, 知道它确实是可以被滥用的媒介,但也可以是有利于构建更加安全的网络结构的工具。 这种认识不仅在道德上有助于正确评价暗网的功过是非, 也有助于在运用暗网时了解它可能的危险,例如运行一个暗网出口代理的危险,并进而安全使用; 更重要的是,能了解暗网技术的巨大优势,发掘出它的潜力,这将有助于开发更好的基于网络的计算机程序。

2 暗网的大致原理和特性

在本系列文章中,笔者意图避免过于深入和复杂的对暗网原理的解释,而仅仅从一个用户的角度,来介绍暗网的大致特性。

2.1 暗网是怎么实现匿名的

暗网实现匿名的方式,一般是基于大量用户的参与和相互协作。 在暗网中的流量,一般是经过很多计算机“转手”流动的。 在用户打算和一个目标通信的时候,用户运行的暗网程序,就会选择若干个暗网中的其他计算机,构建一个“回路”。 回路只是一套加密的多层代理途径。经过每个代理计算机的流量,都会被加密一次。 这意味着,回路中的计算机,不能看到流量的内容。 由于经过了很多计算机,只要其中有几台计算机不记录流量的来去信息,就无法知道流量是谁发出的。这样就实现了匿名性。

2.2 出口代理和中继

我们从上面一节的介绍能看到,暗网中的计算机一般有出口代理和中继两种身份。这两种身份也可以同时存在。

中继是暗网的组成部分。它接收来自别的地方的加密流量,然后将其加密,送到另一个地方然后解密。或者相反。 架设中继有利于暗网的成长。

出口代理是暗网和普通互联网之间相连的部分。出口代理会接收暗网中的流量,并将其送往普通互联网。 出口代理一般不会知道流量的来源。所以它的行为,也无法追溯到暗网的具体哪个角落。 这意味着,在普通互联网的监视机构或者人员看来,出口代理很可能访问了某些非法的内容,并成为他们上门调查的理由。 这是出口代理所受到的挑战之一。因此,在暗网中,出口代理的数量总是不多。

值得一提的是, 回路的出口代理,如果连接到的是普通互联网上的网站,而且这个网站没有实现HTTPS加密的话,那么出口计算机是能看到流量的内容的。 它也许不知道流量是从哪里来的,但是不代表流量的具体内容不会泄漏这一点。 例如,一个对人人网的登录请求(据观察是没有加密的),就对出口计算机是透明的。请求中的用户名和密码,就完全可以泄漏用户的身份。

出口代理是将暗网变成用于匿名访问普通互联网网络的重要组成部分。 但是,暗网的作用并不只是这一点。 普通的中继的存在,使得暗网上访问隐藏服务(暗网本身的设计功能)变得更加安全。这也是很有意义的。 · 值得一提的是,中继和出口代理,在普通互联网上总是会或多或少地留下真实的IP的。 因为只有这样,暗网程序才能首先从普通的互联网中找到合适的暗网计算机。 因此,中继和出口代理的在线时长等各种信息,也都是公开的。 应当避免将隐藏服务架设在和出口代理/中继同一台计算机上,否则通过分别研究隐藏服务的特性和出口代理或中继的特性,可以确定隐藏服务器的位置。

2.3 隐藏服务是什么

隐藏服务是暗网的一个重要的功能。无论是Tor还是i2p,都提供了这一功能。

隐藏服务提供了一种这样的可能,使得一个特定的服务器, 例如一个博客网站、一个论坛、一个FTP站点或者一个什么东西的控制台, 可以在不暴露其地理信息(例如IP地址)的情况下就可被访问。

对于很多敏感的有价值的服务器,例如也许是具有军事价值的服务器,这样做可以避免敌对的力量找到服务器计算机的物理位置并进行攻击。

隐藏服务并不隐藏这个具体服务的内容。任何知道隐藏服务的访问网址的人,都可以访问。 甚至可以不需要暗网软件——互联网上提供了很多代理性质的暗网入口,可以直接用普通的浏览器访问。 但是,如前所述,重要的只是服务器的物理位置。只有这个才是隐藏服务的意义。

此外值得一提的是,由于任何暗网程序几乎都可以将所运行的计算机上的服务器程序公开供暗网访问, 可以说隐藏服务也提供了一种便利的方式,让每台计算机都可以被主动地访问。这是前文所说的“对等性”的体现。

3 使用暗网的一般注意事项

在具体介绍任何暗网软件之前,笔者希望读者注意下面这些一般的注意事项。 这些注意事项是通用的,适合于几乎所有的暗网软件,遵循它们是十分必要的。 无视这些事项的最严重后果,就是匿名性无法得到保证,导致使用暗网的意义消失。

3.1 使用被积极开发的、官方、最新版本的程序

暗网是一种密码系统。对于密码系统的学术研究,一般有两个方向同时进行:如何加固,和如何破解。 选取一个正在被积极开发和研究的暗网软件 是十分必要的。 因为这样才会有足够的人手来发现这类软件的原理上或者实现上的问题, 能及时对这些问题进行修正,并向用户及时发布更新。

不必多说的另一个显然的原则是,务必选择开源软件,即软件的源代码应当是可以公开获取的。 可以供其他人审阅的代码,是对于任何密码系统的开发的一个重要要求。 源码开放并不代表漏洞暴露,而是提供了更早地发现漏洞并补救的机会。 闭源是固步自封的表现,并不能减少漏洞的产生,也不能消除漏洞的影响, 而只是将发现漏洞的机会局限于开发者团队的几个人。 对于用户来说,闭源的软件应当是不可信任的,因为用户甚至不能避免木马后门之类的存在。

选择了合适的软件,还要注意的问题是 务必使用最新、稳定版本的程序。 以Tor为例,2.3版本使用的DHE密钥交换使用了1024比特的密钥,在斯诺登爆出NSA对Tor网络的兴趣之后, Tor被建议使用2.4版本,其使用了ECDHE算法(更难被破解)。 但是2.3版本仍然存在于很多Linux发行版,例如Debian,的软件源中。 及时更新暗网软件,有助于尽快避免已被发现的弱点,对自己和整个暗网网络都是重要的。

3.2 避免危险类型的流量

对于Tor这类可以作为匿名代理的软件,其具有出口代理的功能,可以访问普通互联网。 由于暗网网络的特性,这些访问的链路本身是匿名的。 但是,仍然有很多可能,导致用户自己泄漏自己的身份。

下文介绍的是禁止从暗网传送的流量。这些注意事项有些是来自 Tor官网的介绍, 但是并不局限于Tor。笔者建议,在使用任何暗网时都要避免这些行为。

3.2.1 BT下载

BT下载可以说是另一种分布式的下载方式,但是它和Tor的工作原理并不一致。 很多BT下载程序并不会将所有的流量都从暗网通过,而是将一部分流量,包括一些敏感的信息,从暗网发送。 这些程序会发送本地计算机的真实IP地址,和对方计算机进行绕过暗网的p2p(端到端)连接。 这是BT下载的工作原理。

因此,将BT下载流量通过暗网传送,只会拖延整个暗网其他节点的网速,并导致自己的身份被泄漏。

3.2.2 普通的HTTP流量

使用暗网的一种常用的方式是使用浏览器直接访问提供HTTP服务的网站。 如果网站是以隐藏服务的形式存在,直接使用HTTP访问是没什么问题的。 但是如果经过暗网的出口节点访问一个普通互联网的网站,那么没有被HTTPS加密的流量,就还是可以被出口节点和出口节点以外的任何计算机看到。 为此,用户需要注意,在将暗网作为匿名代理的时候,仍然要尽可能地使用HTTPS。

3.2.3 和非匿名的身份有关的任何流量

这一点是很难描述的。读者需要注意的是,不同的浏览习惯都有可能依照不同的方式暴露真实的身份。

例如,Facebook提供了普通互联网的访问地址暗网的访问地址。 如果通过上述任何一个地址访问Facebook并登录用户的帐号,那么用户就自己向暗网传送了自己的身份识别信息。 虽然很多暗网程序会努力避免一些危险,但是这样做仍然可能导致之后的流量不再是匿名,亦即和之前的流量相关,可以被追踪到。

又例如,用户Alice自己搭建了一个个人网站,位于普通的互联网上,地址是alice.blogspot.com。 由于个人网站是新搭建的,访客很少,所以虽然访问这个网站是匿名的,但是能访问网站的人除了Alice还能有谁呢? 这样,如果Alice使用暗网的匿名代理访问自己的个人博客,这样她也是在让自己的流量去匿名化。

此外还可以举例:Bob在真实生活中使用bob19720419作为他的论坛密码。 现在FBI发现在一个暗网隐藏服务的论坛的众多用户中,有个叫Cob的人,密码也是bob19720419(虽然密码一般是被散列存放的,但是用模拟登录的方式尝试并不困难)。 这样,Cob是不是也可能就是Bob在暗网中的一个身份呢?

为了保险期间,笔者建议,在使用暗网的时候,不要将和自己个人身份和个人生活习惯有关的任何痕迹代入这个网络。 一旦被代入了,就应当认为匿名性已经被暴露。

3.2.4 和普通互联网流量在时间上相关联的暗网流量

暗网服务器根据用户的请求,做出的响应,有时候也很容易导致暗网服务器被确定身份。 反过来,用户访问一个被控制的暗网节点,那么也可能被观察到特定的流量特征,被确定身份。 这是一种需要被特别警惕的身份泄漏方式。下面举几个例子。

第一种叫做流量关联分析。 假设有一个只在暗网提供服务的服务器。例如一个FTP站点。 一个外在的攻击者,因为法律规定或者调查范围所限,可能是不能在全国的数以万计甚至亿计的计算机中找到哪个服务器在运行暗网服务的。 但是,具有一定资源的攻击者,可以观察到全国的流量。 例如,攻击者通过暗网从FTP站点中下载1GB的数据,然后看到全国有一个服务器传送了1GB的数据。 这样尝试不同的时刻来开始和中止下载,观察所有服务器的响应情况,就仍然可以很容易(在几分钟之内)找到这个隐藏的服务器。

第二种也是流量关联分析,但是是针对暗网访问者的。 例如,在一个学校校园网的论坛上,在某个精确到秒的时刻出现了一篇贴子。 调查这篇贴子得出的结论是,作者是通过暗网发布的内容。 那么进而调查学校校园网的网关,检查在这个时刻之前有什么人连接了暗网网络,就仍然能找到这个发布者。 读者需要记住,暗网技术至今还不是特别普及,在很多比较小的圈子里,可能常用暗网的人并不是想象的那么多。

为了减少流量关联分析的风险,一个推荐的方式是将暗网的入口节点也变成暗网的中继。 这种方法在暗网入口节点长时间上线的时候是很好的, 因为这种做法使得节点一直保持忙碌(总有流量传入传出),可以减少流量分析的特征。 然而,节点的IP地址,可能是暴露在普通互联网的。 根据节点在暗网和在普通互联网中的在线时间(比如什么时候这个节点重启了、下线了、上线了), 也可以进行关联分析。 一个计算机如果同时运行普通互联网的服务,也运行暗网的节点, 那么这台计算机自身的在线时间特征也可以同样成为关联分析的线索。

第三种是由于暗网服务的配置问题,导致暗网服务器主动地向普通互联网发送数据包,导致匿名性被泄漏的可能。 很简单的一个例子是一个暗网论坛的注册页面。在注册过程中,很多论坛程序会向用户的邮箱发送一封用来激活的电子邮件。 显然,一个攻击者可以架设一个邮件服务器陷阱,例如trap.mail.org,将其配置成正常工作的邮件服务器。 之后,当他在暗网服务器中注册用户时,填写attacker@trap.mail.org后提交, 服务器就会连接到trap.mail.org的邮件服务器,然后试图投递邮件。 这样,只要查看trap.mail.org的访问记录,就很容易查到服务器的真实IP地址了。

对于使用暗网架设的专门服务器,应当特别小心第三种配置问题。 暗网服务器应当仅仅经过暗网程序作为代理和外界通信。 应当在服务器上配置额外的防火墙,禁止暗网服务器的进程绕过暗网程序向互联网发送信息。 对于Linux类的系统,通过iptables来禁止暗网服务器进程所在用户向OUTPUT链中发送外出流量的数据包是非常必要的。

4 Tor的使用方式

Tor是一个很有名的暗网程序,具有大量的用户(和带宽),也经历了很长的开发过程和安全审计, 因此是值得推荐的了解暗网的起点。

4.1 获得Tor

Tor可以运行在使用Windows、Mac OS、Linux、UNIX作为操作系统的计算机上,也可以运行在Android手机上。

要下载Tor,可以从官网找到下载方式。 笔者在这里要明确提醒的是:务必使用官网的最新版本的Tor。 Tor是一个在不断地开发、审计(被检查漏洞)、研究(研究理论上的缺陷)然后完善的工程。 所以,旧的版本很有可能包含了需要被修正的漏洞之类。在这一问题上,Debian系统式的“旧而稳定”的想法是错误的。 务必使用最新的版本!

Tor官网对一般的电脑用户提供一种Tor Browser Bundle,就是Tor浏览器套装。 该套装是笔者十分推荐的。这是一个经过特定改造、适合与其自带的新版本的Tor核心配合使用的浏览器。 其自带的JavaScript工具可以禁止网页上的不安全脚本。此外浏览器的设计还融合了很多Tor团队的、专业的保护隐私的知识。 新版本的Tor浏览器套装还可以自动升级,免除了很多麻烦。 如果用户只是需要进入暗网浏览,那么应当使用这个套装。

对于Tor浏览器套装,一个重要的问题是,Tor可能在某些网络中根本无法连接到目录服务器。 在此情况下,Tor自己还需要一个代理服务器才能连接。可以使用Shadowsocks或者SSH作为这样的代理,提供Socks5类型的代理服务。 较新版本的Tor浏览器套装自带一种基于亚马逊的代理连接工具,也可以使用。 这些设定都可以在Tor浏览器套装启动时的界面中选择“设定”然后根据描述进行修改。也可以在浏览器界面弹出后,点击左上角的洋葱图标,重新修改。

4.2 配置Tor的隐藏服务

如果不仅仅想要使用Tor作为一个匿名浏览工具,更想用它提供隐藏服务的话,这一节的描述就会比较有用。 如果读者不知道这一节正在说什么,那么就完全可以跳过这一节的内容。 本节的内容将仅以Linux上配置Tor的隐藏服务为例。用户需要有基本的Linux命令行操作的知识。

4.2.1 torrc文件

Tor在通过Linux的命令行安装,例如sudo apt-get install tor(对于Debian/Ubuntu系列的系统), 或者sudo yum install tor(对于Fedora/Centos/Red Hat)系列的系统安装后, 一般会在/etc/tor/目录下创建一个torrc文件。这个就是Tor的配置文件。

一般来说torrc文件会写得很详细了。仔细阅读就能修改。关于隐藏服务的章节,一般会这样写:

############### This section is just for location-hidden services ###

## Once you have configured a hidden service, you can look at the
## contents of the file ".../hidden_service/hostname" for the address
## to tell people.
##
## HiddenServicePort x y:z says to redirect requests on port x to the
## address y:z.

HiddenServiceDir /opt/tor-hidden-service/
HiddenServicePort 80 127.0.0.1:8080

#HiddenServiceDir /var/lib/tor/other_hidden_service/
#HiddenServicePort 80 127.0.0.1:80
#Hidden`S`ervicePort 22 127.0.0.1:22

重要的是那些前面没有加#号的行——这些才是真正起作用的行。其他的都是注释(给人看的)。

上面这个示例中写得已经比较明白了。如果要启用一个Tor隐藏服务,就要添加这样几行: 112远程访问隐藏服务的1隐藏服务的 HiddenServicePort 远程访问端口号2 隐藏服务的地址2:隐藏服务的端口号2

如果需要提供多个隐藏服务,就要在torrc文件中增加多个如上的“章节”。

隐藏服务的配置目录 是对应于一个特定的Tor隐藏服务网址的目录。 在目录中将会存储有关这个服务的私钥和网址内容。 我们知道,一个典型的Tor网址是例如这个样子facebookcorewwwi.onion(这是Facebook在暗网上的入口地址)。 对应于这个网址需要一个私钥,由负责这个网址的Tor终端读取。 这个私钥体现了对这一网址的拥有权利,即,拥有这个私钥的人,也只有这个人,才能在这个网址上公布隐藏服务。 HiddenServiceDir中储存的两个文件:hostnameprivate_key,后者就是这个私钥的存储。 前者则是对应于这个私钥的网址,可以公之于众,以便让大家都来访问这个隐藏服务。

对于这个隐藏目录和其中的文件的权限,Tor是有特定的设定的。应当只让Tor进程所用的用户(可能是toranon或者tor)访问。

远程访问端口号 是允许一个Tor的使用者在访问这个特定的服务时所用的端口号。 例如,如果要开放一个网站,一般应该配置远程访问的端口号为80。这样,对方在使用浏览器访问这个地址时,默认的80端口就会得到允许。 如果要设立一个隐蔽的网站SSH登录管理入口,远程访问的端口号就可以设定为22。当然也可以设定成自己能记住的其他数字,这样就能更加隐蔽一点。

隐藏服务的地址隐藏服务的端口号 是关乎本地的具体提供的隐藏服务器的配置。 Tor只是一个反向代理程序(将暗网上的用户引导到我们的服务器)。具体我们的服务器上为了提供服务,还需要很多其他的程序。 例如,对于一个网站类型的服务器,需要的软件可能是Apache或者nginx或者httpd。 一个XMPP服务器,可能是prosody。对于SSH登录,本地的软件是SSH的后台进程。 这里的两个参数就是指被连接到的服务程序的地址和端口号。 地址多数时侯可能是代表本地计算机的127.0.0.1,但也可能是本地局域网上的其他计算机(例如我们要搭建一个服务器集群的时候)。 端口号也就是服务程序所监听的端口。

4.2.2 防火墙

笔者着重将设定隐藏服务时,对计算机防火墙的有关配置的注意事项拿出来。这是十分重要的内容。

对于一个确实打算在普通互联网上销声匿迹的隐藏服务来说,隐藏服务和普通互联网是必须隔离的。 虽然很容易就可以做到让普通互联网上的用户无法访问隐藏服务,但是隐藏服务程序自身的问题,完全可能导致这一服务程序自己透漏真实身份。

例如,如果用户打算搭建一个隐藏服务的论坛。用户可能会去下载一个常见的论坛程序,例如phpBB,然后安装到服务器上。 然而,很多论坛程序会提供发送电子邮件的选项,例如用来发送注册时的邮箱验证等的邮件。 在调用发送邮件的功能后,论坛程序可能会利用服务器上的mail程序等,主动 连接到邮件地址所对应的对方服务器上。 这只是论坛程序自己主动访问互联网的一个例子。类似的例子还有很多,例如论坛程序可能会自己进行DNS查询。

这些程序的主动行为,不需多说,很容易被一个攻击者利用,并用来查询隐藏服务的真实IP地址。 因此,通过配置防火墙,禁止隐藏服务程序对互联网的访问,是十分重要的。

对于Ubuntu/Debian系列的操作系统来说,系统自带的ufw软件可以用来相对容易地配置防火墙。

首先,需要启用ufw。方法是:

sudo ufw enable   # 如果enable换成disable,就是禁用了防火墙

如果我们正在使用SSH配置这个服务器,那么ufw启动后最重要的事情是,让防火墙始终开着我们的SSH端口(默认是22)。 否则,防火墙可能将我们的连接也阻止掉。方法是:

sudo ufw allow 22

之后,我们可以用如下方法,修改防火墙的默认行为是Deny。 这就是说,如果防火墙没有找到匹配的规则(例如放行规则),就会拒绝这个数据包——这是对于进入服务器的流量说的:

sudo ufw default deny

到此为止,我们还没有配置防火墙来具体禁止某个进程的外出访问。现在我们来研究这一点。

实际上,很多服务程序都是以各自独立的用户来运行的。例如,对于nginx,运行时的用户可能是www-data。 读者请按照自己的服务器配置来对应寻找这个用户。我们现在要做的,就是禁止www-data用户的外出访问。

进入目录/etc/ufw/中,寻找before.rules文件。如果网卡配置了IPv6地址,我们稍后还要修改before6.rules。 这个文件的作用是,配置系统的iptables的before链(这是外出数据包需要经过的第一个链)。

在文件靠前的位置,例如在allow all on loopback这句话附近,添加如下内容:

-A ufw-before-output -o eth0 -m owner --uid-owner www-data -j DROP

这句话的含义是,

  1. ufw-before-output链(ufw程序附加到iptables上的规则)中追加一个规则;
  2. 网卡是eth0;
  3. 匹配方法是看owner所有者,具体来说是用户为www-data这个用户;
  4. 动作是DROP,丢弃数据包。

eth0网卡在本例中是用来和互联网进行通信的网卡,可能有一个互联网上的IP地址。 除此之外,系统中会显示一个lo(loopback)网卡,这个是本地计算机上用的。 我们不禁止后者,因为服务程序还是要和Tor通过本地地址上的端口通信的。

如果要修改before6.rules文件,上面要添加的话就修改为:

-A ufw6-before-output -o eth0 -m owner --uid-owner www-data -j DROP

亦即生效于链ufw6-before-output上。

修改完成后,先用sudo ufw reload更新防火墙的配置。 之后,我们需要测试我们的配置是否正确。测试的想法是装作服务器程序的用户,去主动请求一个互联网上的网站。 方法是:

su - www-data -s /bin/sh     # 切换到www-data身份并开启一个基于sh的命令行
telnet www.google.com 80     # 尝试访问google的80端口

我们预期的结果是,telnet应当返回无法访问目标服务器的错误。如果telnet连接成功,那么我们的设置就失败了。

4.3 配置Tor作为中继和/或出口代理

配置Tor作为中继或者出口代理的方法,也是同样修改torrc文件。 关于torrc文件的介绍,请参考4.2.1小节的内容。

任何#所开头的段落都是注释,是对于程序无效的。 ##开头的注释是给人写的注释, #(一个井号)开头的行,同样是注释,但是可以通过直接去掉这个井号来启用对应的选项。

有区别的地方是,具体的段落。为了配置Tor出口代理,有用的段落如下。 由于配置文件选项很多,为了简便起见,这里直接摘录并翻译一个torrc文件的注释。

################ This section is just for relays #####################
# 从本段往下,都是为了配置中继所用的选项。
## 参考 https://www.torproject.org/docs/tor-doc-relay 来获得更多的指导。

## 必填 中继所用的、公开到普通互联网的端口,用来接收进入本中继的连接。
#ORPort 9001

## 为了到达本中继所需要的IP地址或者域名。不设定的话Tor可以自己猜测。
#Address noname.example.com

## 如果有多个网卡,可以指定一个作为外出流量所用的网卡。
# OutboundBindAddress 10.0.0.5

## 中继的昵称。用于给人看的称呼。
#Nickname ididnteditheconfig

## 设定中继服务流量的限制。这不影响本机自己在使用暗网程序时所产生的流量。
## RelayBandwidthRate 至少需要 20 KB.
## 这个配置选项的单位是字节每秒,不是比特每秒。在使用K或者M前缀时,K表示1024,
## M表示1024×1024.
#RelayBandwidthRate 100 KB  # 设定网速为 100KB/s (800Kbps)
#RelayBandwidthBurst 200 KB # 但是允许突发网速到 200KB/s (1600Kbps)

## 使用如下选项来限制每天/每周/每月的最大流量。这是在分别限制发送和接收的字节,
## 而不是总数:设定为 4 GB 将导致总计为 8 GB 的时候才会暂停。
##
## 设置进或者出方向,在每个周期内通过 4 GB .
#AccountingMax 4 GB
## 每个计算周期开始于每天午夜(这样AccountingMax就是对应每天)
#AccountingStart day 00:00
## 每个计算周期开始于每月第三天15:00(这样AccountingMax就是对应每月)
#AccountingStart month 3 15:00

## 管理这个中继或者出口代理的人员联系信息。将会用这段信息来联系您,如果您的
## 中继或者出口代理被发现配置有误,或者其他特殊事情。
## 注意我们会归档和公开所有的中继信息并包含这些数据,Google也会记录这些内容,
## 垃圾邮件发送者也会收集它们。所以您可能需要使用暗示的方式来表示电子邮件地址,
## 或者使用一个单独的新地址。
#ContactInfo Random Person <nobody AT example dot com>
## 您还可以公布您的PGP或者GPG公钥的指纹,如果您有这样的公钥的话:
#ContactInfo 0xFFFFFFFF Random Person <nobody AT example dot com>

## 取消注释如下一行,在您运行着多个Tor中继的时候,并添加您所控制的这些中继的
## 密钥指纹。这样Tor客户端将不会在一个Tor回路中包含您的多个中继。参考:
## https://www.torproject.org/docs/faq#MultipleRelays
## 然而,请不要在此包含一个桥接中继的指纹,这将导致他们无法隐藏,并且可能暴露
## 它们的IP地址。
#MyFamily $keyid,$keyid,...

## 使用逗号分隔的出口策略列表。顺序是从第一条到最后一条考虑,第一个匹配的策略
## 生效。如果您打算替换默认的策略,请在策略结尾使用 reject *:* (拒绝全部)
## 或者 accept *:* (接受全部)。否则的话,您是在扩展(从开头)默认的出口策略。
## 如果保持下面的内容被注释,将使用软件文档中所述的默认策略,其内容在man手册
## 中,也可以在如下网址找到。
## https://www.torproject.org/documentation.html
##
## 阅读 https://www.torproject.org/faq-abuse.html#TypicalAbuses
## 来了解在使用默认出口策略时您可能遇到的各种情况。
##
## 如果特定的IP地址或者端口被外部阻止,例如被您的防火墙阻止,您应当通过更新
## 出口策略来反映这一点。否则Tor将会告诉用户这些访问无法连接。
##
#ExitPolicy accept *:6660-6667,reject *:* # 只允许irc端口,拒绝其他
#ExitPolicy accept *:119 # 在默认出口策略的同时,接受nntp协议
#ExitPolicy reject *:* # 禁止全部出口流量

用户应当可以根据如上配置文件来完成大多数配置。值得一提的是,最后一段的关于ExitPolicy的设定决定了这个代理是中继还是出口代理。

5 i2p的使用方式简介

i2p是一个类似Tor的暗网软件。对i2p的密码分析研究,比Tor偏少,这是i2p可能的弱点之一。 i2p除此之外可能有比Tor更加安全和健壮的潜力。这是因为i2p不依赖于一个中心的目录服务器。 这样,在无法访问目录服务器的时候,Tor无法工作,但是i2p只要仍然能通过p2p网络找到对方, 就仍然可以工作。除此之外,i2p在建立连接时使用更多的跳数,使得连接更加安全。 但是这样的代价是i2p的系统负荷也比较大。i2p目前使用Java开发,这使得性能问题更加突出。

i2p可以从网站下载。对于Windows系统,下载得到exe可以直接运行。 在Linux系统上,下载得到的jar包,可以使用java运行:

java -jar i2p_install.jar  # 将文件名i2p_install.jar替换为实际下载的名字

管理i2p不需要修改配置文件, 可以通过浏览器直接访问本地的地址http://127.0.0.1:7567,来进入一个管理界面。

和Tor不同,i2p提供的匿名代理基于http协议(而不是Tor的Socks5协议)。 为此需要将浏览器设定为使用HTTP代理,通过默认的4444端口进行。HTTPS协议通过4445端口。 然而,i2p网络中的出口代理目前数量还十分少。所以使用i2p进行匿名访问并不是十分有效率。