暗网架站教程
以.onion结尾的网站就是Tor暗网网站,比如,terminusnemheqvy.onion。暗网网站只能用Tor访问。
暗网受到广大政治活动人士的喜爱。比起把网站开到明网,暗网架站有很多好处,包括:
-
匿名服务器:在明网上,服务器隐匿身份的难度远远大于客户端,客户端可以用代理隐匿IP。而服务器的IP必须暴露在公网上,否则别人无法访问。
CDN(内容分发网络)可以帮助服务器隐匿IP,然而CDN会记录流量日志,也不保证服务器的完全匿名。某些情况下,CDN仍然会根据当地法律提供服务器资料,高危网站自然不能完全信任CDN。
在暗网上,服务器受到Tor三重代理的保护,就像用Tor浏览器上网一样安全。不仅服务器被Tor保护,网站的访客也受到Tor三重代理的保护。换句话说,任何访客和网站之间都有6个Tor节点,其中3个保护服务器,3个保护访客,双方都可以高强度隐匿身份。
-
不需要购买域名:付款信息会暴露网站所有者的身份,从付款记录追查线索是各国执法部门的拿手好戏。暗网网站不需要购买域名,形如
ur7yf23r6espa33w.onion
的「域名」是Tor自动生成的。 -
不需要公网IP:家用宽带一般没有公网IP,因此无法在家里的电脑上架设明网网站。不过,暗网架站不需要公网IP,因此可以把网站开在家里的电脑上,不用购买服务器(也避免付款泄露个人信息)。不仅如此,由于自己掌握服务器硬件,还可以用多种方法增强安全,例如全盘加密,虚拟机隔离等等。
-
端到端加密:暗网不需要HTTPS证书,免去了签发证书的身份风险。暗网网址本身就是网站的「身份公钥」,身份认证和后续加密依靠这个公钥完成。只要你输对了网址,从Tor浏览器到Tor网站就是端到端加密的,任何一个中间节点都无法看到传送的内容。
本文介绍暗网的工作原理,暗网建站方法,和暗网文件分享工具Onion Share的用法。
I. 暗网怎样工作
本质上,暗网通信解决三个问题:
-
保证服务器身份的隐匿。服务器和访客之间,至少有3个服务器亲自选出的Tor节点。(只有自己选出的节点才能保证安全)
-
保证访客身份的隐匿。访客和服务器之间,至少有3个访客亲自选出的Tor节点。
-
保证服务器身份的真实。当访客输入要访问的地址,Tor网络可以确保访问了真实的暗网主机。
Tor网站第一次运行会生成一对公钥和私钥,公钥就是网站的“网址”,可以从其它渠道发布。私钥需要保管好,别人访问网站的时候,私钥用来证明网站确实是域名(公钥)对应的身份。
假设Alice和Bob都是匿名网友,Alice运营了一个暗网网站,Bob是访客,知道Alice网站的网址(公钥)。
现在Bob要访问Alice的网站。Alice和Bob要解决的问题是:
- Bob要选出三个Tor代理节点。(保证访客隐匿)
- Bob要在暗网中找到Alice。这并不容易,因为暗网服务器的IP是隐匿的,所以必须有其它方法让访客找到服务器。
- Bob要验证Alice的身份。(保证服务器身份真实)
- Alice得知有人要来访问她的网站,这时Alice也要选出三个Tor代理节点,与Bob“接头”。(保证服务器隐匿)
建立连接的过程如下:
-
在建站之初,Alice连接到Tor网络,在网络中选出若干个节点,称为引入点。引入点可以帮助暗网上的其它计算机找到服务器。由于Alice通过3重代理连接到这些引入点,因此每个引入点并不知道Alice的真实IP地址。
-
引入点是一个Tor节点,每个Tor节点都有一个独一无二的身份标识。Alice拿到引入点的身份标识,用自己的私钥签名,得到一个文件,也叫做“描述符”。
“描述符”类似于这样:
----- Alice的描述符 ----- 引入点1:FF1CCF57E98C817DF1EFCD9FE44A8AEB 引入点2:C68C559D956D4CA20F435ED74A6E71E6 ... 引入点N:A8803C74A8F7CC4722EB88C5F69772C8 ----- Alice的签名 ----- Z6fihKxlkbmfkzDheYEDu3YsJS/z1yvvrMLrSBHoQXD5fkC5UW4x2/Km82oySaem FDFVKmqOVWWrvzFqwqaLUARawzMJmnvm2HBk+wIsmktveobJTC2Xqzus9/lLvfWh 5KN4L8D3b/H5lrwK9aaZW9rGneA5oG3l9t4= ----- Alice的描述符结束 -----
然后,Alice把“描述符”发布到整个Tor网络上,这是通过分布式散列表实现的。
-
Alice与这些引入点建立长期通信链路。**如果有人想要联系Alice,那么只要联系这些引入点就可以了。**当然,以上的全过程会经过三重代理,不会泄露Alice的真实IP。
图:Alice选出引入点,并建立长期通信
(图中的绿线和蓝线均表示通过三重代理连接)
-
现在Bob要访问Alice的网站。Bob用Alice的网址(公钥),在整个Tor网络的分布式散列表上查找Alice的描述符。这个过程会通过三重代理。
Bob找到Alice的描述符后,验证描述符的真实性。因为描述符是用Alice的私钥签名的,所以Bob可以用Alice网站的网址(也就是公钥)验证描述符的真实性。这一步保证了Alice和Bob之间端到端的验证。
-
接下来Bob通过二重代理,在Tor网络中选出若干个会合点。Bob在每个会合点留下口信。“口信”是一串随机数。
图:Bob选择会合点
-
Bob根据描述符里的信息,通过三重代理连接到Alice的引入点。
图:Bob连接到引入点,通过引入点告诉Alice会合点的位置
-
Bob把会合点的位置和口信用Alice的公钥加密,再发给引入点,引入点再把这些消息转发给Alice。
-
Alice用私钥解密Bob的消息,通过三重代理连接到Bob的会合点,并且把自己拿到的口信和会合点的口信相比对。如果口信一致,就说明Alice和Bob之间的连接建立成功了。
图:Alice连接到Bob的会合点,两人建立连接。注意引入点不参与连接
现在Alice和Bob之间一共有6个Tor节点,其中3个由运营网站的Alice选出,另外3个由访问者Bob选出,会合点也作为Bob选出的3个节点之一转发流量。
-
Alice运营暗网服务器。她的所有连接步骤(选出引入点,发布描述符,连接到Bob的会合点)都经过了三重代理,这保证了【服务器身份的隐匿】。
-
Bob是客户端,他的连接步骤(查询描述符,连接引入点,选出会合点),亦经过了三重代理,这保证了【客户端身份的隐匿】。
-
Alice的描述符经过Alice签名,无法篡改;Bob的口信经过Alice的公钥加密,引入点无法得知其中内容,这保证了【身份的真实性】。
II. 暗网架站
1. 安装Tor
主流的Linux和BSD发行版都收录了Tor。以Debian为例,一行命令安装:
apt install tor
安装之后,Tor的配置文件在/etc/tor/torrc
。输入
systemctl enable tor --now
可以让Tor在开机后自动在后台运行。
2. 修改配置文件
Tor既可以做客户端,也可以做中继,又可以做服务器。如果Tor作为服务器运行,那么这个Tor就是洋葱服务(Onion Service).
默认情况下Tor作为客户端运行,修改配置文件可以启用Tor的不同功能。只要在配置文件里添加以下两行,即可让Tor作为洋葱服务运行:
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8964
解释一下这两行的作用:
-
HiddenServiceDir: 这里指定一个目录位置,用来保存洋葱服务的私钥和域名。洋葱服务的私钥文件叫做private_key,域名文件叫做hostname。
私钥对洋葱服务十分重要,掌握了私钥,就掌握了私钥对应onion地址的控制权。(和比特币的私钥一样)
明网网站的域名控制权由域名商掌握。登录域名商的账户,就可以变更域名所有权。暗网域名的控制权由掌握了私钥的人所有。如果私钥泄露,那么任何人都可以用这个onion地址架设网站。
在【暗网怎样工作】一节提过,洋葱服务会选择一些节点,叫做“引入点”,引入点会告诉客户端怎样连接到洋葱服务。洋葱服务把引入点的身份ID打包成文件(“描述符”),并用自己的私钥签名。如果私钥泄露,别人就可以伪造描述符,进而仿冒网址对应的主机。
域名本质上就是私钥对应的公钥,需要公开发布,其它人可以用域名(公钥)访问洋葱服务。
电脑上的Tor作为洋葱服务运行时,它会检查HiddenServiceDir指定的目录下是否有private_key文件和hostname文件,如果没有,Tor会自己生成这两个文件。private_key是前面提到的私钥,请务必保存好。hostname是私钥对应的公钥(域名),可以公开发布。
-
HiddenServicePort:洋葱服务可以看作是传统的网络服务前面加了一个Tor(反向)代理,这一项告诉Tor把接收来的流量转发到哪里。
HiddenServicePort PortA AddressB
表示打开虚拟端口PortA
,并把PortA
的流量转发到AddressB
。例如
HiddenServicePort 80 127.0.0.1:8964
- 第一项80,表示洋葱服务打开虚拟端口80,对公网提供网页服务。别人用浏览器访问,看到的对外端口是80.
- 第二项127.0.0.1:8964,是Tor要反向代理的服务地址。Web服务开在本机的8964端口上,这里就填写
127.0.0.1:8964
,Tor会转发这个地址的流量。
可以看到,Tor不仅能架设暗网网站,还可以在暗网开设其它网络服务,例如25端口(暗网邮件),194端口(暗网IRC聊天)等等。
HiddenServicePort
可以同时写多个,比如:HiddenServicePort 80 127.0.0.1:996 HiddenServicePort 25 127.0.0.1:251
表示同时开启暗网网站和暗网邮件服务。
贴一个简单的torrc配置:
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8964
Socks5Proxy 127.0.0.1:10086 # 使用前置代理
SocksPort 0 # 不打开socks端口,减小攻击面
# SOCKSPolicy accept 127.0.0.1
HiddenServiceVersion 3 # 第三代洋葱地址
# 可以增加首次连接的速度
HiddenServiceMaxStreams 10
HiddenServiceMaxStreamsCloseCircuit 1
HiddenServiceNumIntroductionPoints 10
这里还有几个比较重要的配置项,说明一下:
-
Socks5Proxy: 这一项可以给Tor配置前置代理,俗称“VPN+Tor”。例如
127.0.0.1:10086
。 -
SocksPort: 这一项是Tor为其它应用打开的socks端口,默认9050。0表示不打开socks端口。
-
SOCKSPolicy: 这一项控制哪些网段的电脑可以连接Tor,例如
accept 192.168.1.0/24
表示允许局域网内的电脑连接,这个选项在双虚拟机隔离时特别有用,平时谨慎使用。默认为accept 127.0.0.1
(只有本地应用可以连接)。 -
HiddenServiceVersion: 洋葱服务的版本号,可以取2或3。比较短的.onion是第二代洋葱地址。比较长的.onion是第三代洋葱地址。第三代地址加密强度更高,并且支持客户端认证。
Tor配置文件的完整说明见这里:
https://2019.www.torproject.org/docs/tor-manual.html.en
有了配置文件后,就可以让Tor作为服务器运行了,操作步骤如下:
- 安装Tor(√)
- 新建一个目录hidden_service:
mkdir -p /var/lib/tor/hidden_service
- 把上述配置文件粘贴到
/etc/tor/torrc
里面。 - 重启tor,让配置文件生效:
systemctl restart tor
- 这时
/var/lib/tor/hidden_service
里会多出两个文件,hostname
和private_key
.
输入 cat /var/lib/tor/hidden_service/hostname
可以看到Tor自动生成的域名。这说明洋葱服务运行成功了。
3. 配置网页服务器
到这一步暗网的部分完成了,接下来的操作和明网建站没有区别。需要做的,就是运行一个Web服务软件(比如Nginx,Caddy等),接收Tor转发来的流量。
例如,上面的配置里,HiddenServicePort
的转发目的地是127.0.0.1:8964
,这表示在本机的8964端口上打开一个HTTP服务。Web服务软件选用Nginx,配置如下:
server {
listen 127.0.0.1:8964; # 这里非常重要,必须让Nginx监听本地,否则会导致公网IP暴露
server_name ur7yf23r6espa33w.onion;
server_tokens off;
autoindex off;
charset utf-8;
gzip on;
root /var/www;
location / {
index index.html;
}
}
明网建站的更多细节就不再赘述了。明网建站的教程,可以参考其它文章,比如我教大家做网站系列。
4. 一些安全建议
因为暗网架站要隐匿身份,所以Web服务的全部流量都应该通过Tor。
然而,如果Web服务器配置错误(这很常见)或者出现漏洞,就会使得Web服务绕过Tor,直连公网。Web服务直连公网会导致你的IP暴露,如下:
图:公网直连导致服务器暴露
例如上面的Nginx配置,第二行如果不是listen 127.0.0.1:8964
而写成listen 8964
,会让Nginx在全网监听。如果有人恶意扫描,就会发现暗网网站的真实IP。
比起浏览器,Web服务软件的风险要高得多,除了暴露IP之外还有其它问题。例如,服务端未设置正确的读写权限,Web服务软件甚至可以随意访问本机文件。如果没有做好身份隔离,也会导致隐私泄露。
Web服务服务器长时间在线更是增加了被攻击的风险。因此,Web服务所在的机器,应当被视为不可靠的环境。如果说,高风险上网建议双虚拟机隔离,那么暗网架站必须使用双虚拟机隔离。
双虚拟机隔离有以下要点:
-
双虚拟机用“host-only”或“internal”模式连接,即使Web服务被攻陷,破坏也无法传出虚拟机。
-
设置快照并定期回退(当然要备份Web数据),可以确保对病毒、木马、黑客的长期渗透完全免疫。
关于双虚拟机隔离的更多资料,可以参考编程随想的文章,此处不再重复。
https://program-think.blogspot.com/2013/01/howto-cover-your-tracks-6.html
https://program-think.blogspot.com/2013/01/howto-cover-your-tracks-7.html
https://program-think.blogspot.com/2015/04/howto-cover-your-tracks-8.html
顺便说一句,如果你有性能比较高的路由器,可以把Tor安装到路由器里,一切对外流量必须经过路由器。这种隔离是物理隔离,安全性高于双虚拟机隔离。
III. Onion Share
直接使用「裸Tor」架站,比较复杂,容易出安全问题。如果只是通过暗网分享文件,或者展示一些静态网页,可以使用Onion Share,非常简单而且安全。下载地址:
Onion Share把前面的步骤都打包到了一个软件里。不过出于安全考虑,Onion Share只支持分享文件、接收文件、发布静态网站。如果要做复杂的动态网站(比如论坛),那么还是需要用上面的方法建站。
Onion Share的主界面如图,把文件拖进窗口就可以在暗网上共享,非常简单:
图:Onion Share主界面
文件拖进窗口之后,Onion Share会自动生成一个暗网网址,其他人可以用Tor浏览器下载分享的文件,如果分享的文件是网页,就可以直接浏览。
Onion Share有一些配置要注意:
图:Onion Share设置界面
-
连接到Tor网络:Onion Share不支持「VPN + Tor」的配置模式,无法配置前置代理。但是,Onion Share可以用Tor浏览器的内置Tor连接到Tor网络。如果Tor浏览器配置了前置代理,那么Onion Share也就配置了前置代理。
在Onion Share连接时点【Quit】可以进入设置界面,选择【Attempt auto configuration with Tor Browser】可以用Tor浏览器的内置Tor联网。
-
私密分享·公开分享·长期分享:默认情况下,Onion Share分享文件生成的地址是一次性的,而且只能给一个人使用,即私密分享。如果要公开分享文件,需要选择【Public mode】。
【Public mode】下,分享文件地址仍然是一次性的,如果要长期保留这个地址(比如展示网页),就要选择【Use a persistent address】。注意此时仍然要保护好私钥,私钥保存至Onion Share的配置文件里。
这样就可以用Onion Share共享文件或者网页了。
本文介绍Tor做服务器的用法。前面说过,Tor有三种运行模式:客户端、服务器、中继,如果对搭建中继感兴趣,可以参考Tor官网的教程: