在PC以及路由器上的Tor组网搭建过程

It always seems impossible until its done.
—— 曼德拉

前言

应公司需求搭建Tor组网,找了网上的几篇文章,博主们只是贴了部分代码没有效果也不知道到底弄好了没有。

配合官方文档学习各项技术知识,搭了很多遍,各种检查配置文件以及日志,但是怎么都通不了。

最后找了一篇老外的文章,从视频演示中看到是有效果的,遂参考之。

搭了一遍后完成,最后还是公司小伙伴搭好,我就纳闷相同的操作我怎么就怎么搭都不行…

基础知识说明

Tor基础组件说明
DA、Guard Relay、Exit Relay、Middle Relay、Client

  • DA(Directory Authority):权威服务器,用来获取各中继节点。
  • Guard Relay:入口节点。
  • Middle Relay:中继节点。
  • Exit Relay:退出节点,最后流量通过Exit Relay直接发向目标。
  • Client:客户端。

Tor基本原理
Tor用户架设一个洋葱代理服务器,这个服务器定期和其他Tor节点交流从而形成一个回路(circuit)。Tor把用户要传输的信息在应用层加密,每对节点之间进行加密通信,每层节点只知道谁发送了数据包以及要将数据包发送到下一个,当数据包到达出口时,出口节点将数据包解密,发送到目标。这样的多层拓扑结构相当于把客户端包在洋葱的中心,这就是Tor保护信息来源的方式。
信息从客户端发出,通过网络随机化寻找路径,通过一层一层的加密代理节点,从出口节点以明文的方式发出去,所以对目标服务器来说它只能看到明文消息从出口节点发出并不知道消息源客户端的位置。

PC硬件拓扑

看网上的一些博主都是在局域网下搭的,在局域网下测了很多遍不行,进而转移到公网上,机器选择是在VULTR,按时间计算收费对当前需求还是比较适合。

本次挑选了6台VPS作为实验环境,分别对应的IP及角色为(Tor组网默认跳3次,所以最少需要3台作为中继):

  • Webserver 149.248.0.164
  • Da 149.248.21.46
  • Client 149.248.1.166
  • Relay1 66.42.100.181
  • Relay2 207.246.96.62
  • Relay3 144.202.115.12

Web Serber作用是为我们提供了一个展示来源者IP的页面,效果如图所示:

Relay1~3作为中继,将客户端的流量在其中进行转发,并自动作为出口节点将原始流量发送至目标点。

DA作用是收集我们搭建环境中的所有中继,并在其中选择下一跳的位置。

Client为使用者,作为需要隐匿信息的机器。

功能设计


当我们使用Tor网络进行通信时:
客户端通过代理Tor网络,对Web服务器发出请求,流量通过Tor网络跳转(默认在组网中跳转三次),最后在出口节点处发往Web服务器。
而Web服务器处得到的请求来源IP为Tor组网中的某一节点的IP,节点直接与目标服务器进行交互,从而很好的隐匿了客户端信息。
并且在Tor组网中,若有节点服务器故障终端,并不会影响流量的传输,组网会挑选其他正常的节点来继续传输客户端发出的流量。

配置信息

DA

在终端中依次执行

1
2
3
4
5
6
1、sudo apt-get update
2、sudo apt-get -y --force-yes install tor tor-arm vim curl ntpdate
3、sudo -u debian-tor mkdir /var/lib/tor/keys
4、sudo -u debian-tor tor-gencert --create-identity-key -m 12 -a 149.248.21.46:7000 -i /var/lib/tor/keys/authority_identity_key -s /var/lib/tor/keys/authority_signing_key -c /var/lib/tor/keys/authority_certificate
5、service tor stop
6、sudo -u debian-tor tor --list-fingerprint --orport 1 --dirserver "x 127.0.0.1:1 ffffffffffffffffffffffffffffffffffffffff" --datadirectory /var/lib/tor

接着在Tor配置文件(/etc/tor/torrc)末尾加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
TestingTorNetwork 1  
DataDirectory /var/lib/tor
RunAsDaemon 1
ConnLimit 60
Nickname DA
ShutdownWaitLength 0
PidFile /var/lib/tor/pid
Log notice file /var/log/tor/notice.log
Log info file /var/log/tor/info.log
Log debug file /var/log/tor/debug.log
ProtocolWarnings 1
SafeLogging 0
DisableDebuggerAttachment 0
DirAuthority DA orport=5000 no-v2 hs v3ident=fingerprint1 149.248.21.46:7000 fingerprint2
SocksPort 0
OrPort 5000
ControlPort 9051
Address 149.248.21.46
DirPort 7000
# An exit policy that allows exiting to IPv4 LAN
ExitPolicy accept *:*

AuthoritativeDirectory 1
V3AuthoritativeDirectory 1
ContactInfo auth0@test.test
ExitPolicy reject *:*
TestingV3AuthInitialVotingInterval 300
TestingV3AuthInitialVoteDelay 20
TestingV3AuthInitialDistDelay 20

其中要修改两个点

  1. 修改fingerprint1、fingerprint2
  2. 修改Address的地址为DA的IP地址

其中fingerprint1的位置于/var/lib/tor/keys/authority_certificate 文件中的fingerprint字段,fingerprint2的位置于/var/lib/tor/fingerprint,得出值后填入上述配置信息中的相应位置。

Web Server
依次在终端中执行以下命令

1
2
3
4
5
6
7
1、sudo apt-get -y install apache2 libapache2-mod-php
2、sudo rm /var/www/html/index.html
3、echo '<?php' | sudo tee -a /var/www/html/index.php
4、echo 'echo "Remote address: " . $_SERVER['REMOTE_ADDR'] . "\n";' | sudo tee -a /var/www/html/index.php
5、echo 'echo "Forwarded for: " . $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n";' | sudo tee -a /var/www/html/index.php
6、echo '?>' | sudo tee -a /var/www/html/index.php
7、sudo /etc/init.d/apache2 restart

效果如图:

Relay

我们的中继节点总共有3台,依在每台机器上次执行以下命令

1
2
3
4
1、sudo apt-get update
2、sudo apt-get -y --force-yes install tor tor-arm vim curl ntpdate
3、service tor stop
4、sudo -u debian-tor tor --list-fingerprint --orport 1 --dirserver "x 127.0.0.1:1 ffffffffffffffffffffffffffffffffffffffff" --datadirectory /var/lib/tor

将以下代码写入配置文件(/etc/tor/torrc)尾部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
TestingTorNetwork 1  
DataDirectory /var/lib/tor
RunAsDaemon 1
ConnLimit 60
ShutdownWaitLength 0
PidFile /var/lib/tor/pid
Log notice file /var/log/tor/notice.log
Log info file /var/log/tor/info.log
Log debug file /var/log/tor/debug.log
ProtocolWarnings 1
SafeLogging 0
DisableDebuggerAttachment 0
DirAuthority DA orport=5000 no-v2 hs v3ident=fingerprint1 149.248.21.46:7000 fingerprint2

SocksPort 0
OrPort 5000
ControlPort 9051
# An exit policy that allows exiting to IPv4 LAN
ExitPolicy accept *:*

Nickname relayX
Address xx.xx.xx.xx

上述配置文件中需要改变的有三个地方:
1、fingerprint那行修改至与DA相同
2、Nickname relayX处,修改为当前节点的名称(如本次实验中节点名称为Relay1、Relay2、Relay3),分别在不同的机器上修改。
3、Address的值改变为当前中继节点的IP地址。

Client

将以下代码写入配置文件(/etc/tor/torrc)尾部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TestingTorNetwork 1  
DataDirectory /var/lib/tor
RunAsDaemon 1
ConnLimit 60
ShutdownWaitLength 0
PidFile /var/lib/tor/pid
Log notice file /var/log/tor/notice.log
Log info file /var/log/tor/info.log
Log debug file /var/log/tor/debug.log
ProtocolWarnings 1
SafeLogging 0
DisableDebuggerAttachment 0
DirAuthority DA orport=5000 no-v2 hs v3ident=fingerprint1 149.248.21.46:7000 fingerprint2 #修改此行与DA处相同

SocksPort 9050
ControlPort 9051

Nickname client
Address 149.248.1.166

接着安装proxychains(其作用是对指定的程序添加代理),在终端中执行

1
apt install proxychains

编辑其配置文件(/etc/proxychains.conf),默认行尾使用的配置为

1
2
3
SOCKS4 127.0.0.1 9050
将其改为
SOCKS5 127.0.0.1 9050

效果展示

当完成上述配置后,在每台机器上执行以下两条命令,作用是同步各机器之间的时间

1
2
1. /etc/init.d/ntp stop
2. ntpdate ntp.ubuntu.com

接着在每台机器开启Tor服务

1
1.service tor start

跳转回客户端机器,执行下图命令

客户端IP为149.248.1.166,通过代理本地Tor端口,对Web Server发送出HTTP请求,发现返回的IP结果不是我们客户端的IP地址,说明代理已经完成。
查看节点服务器上的日志(var/log/tor/info.log),发现其找到了对应IP的三个节点从而作为跳板,依次进行跳跃,最后选择出口跳向目标服务器,如下图所示。



在Web服务器中查看请求来源,IP为节点服务器IP,没有客户端信息,如下图所示

我们关闭其中一个节点作为故障测试,发现依旧可以通过其他的节点跳出,如下图所示

至此,Tor组网测试完毕。

在ROUTER上搭建Tor

开始找到了这个哥们的文章,准备开始编,也大概两种方法:

  • 编译生成适合路由器指令集的GCC编译器,直接在路由器上编。
  • 交叉编译编好再装到路由器上。

开始没多久,公司小伙伴发现前边我们编译出来的Merlin固件里边自带有Tor,写个配置文件直接就可以用了,遂测试,完成,

编译固件

前段时间做了一段时间的过路由器固件认证,在针对ASUS Merlin类型时,GitHub上的外国师兄给出了多种型号的编译方法4,遂搭建环境进行测试,根据官方文档,中间遇到了各种坑,处在不停地解决问题然而又遇到新问题的过程。
后边是公司小伙伴搭好了,也最终有了一次搭建完成的过程文档。

效果和上文中的一样,也还是默认跳三下,关掉其中一个会重新选择别的节点

虽然Tor早就已经不再安全,但是不能否认它在历史上的巨大作用以及它代码的优秀,还是值得参考以及改进,网上也有一部分文章阅读并分析Tor的源码,如果对这方面的知识有兴趣,还是可以继续钻研一番。

至此Tor组网也就测试完毕。

另外

我感觉我现在对于处理问题的能力相比较于大学时期下降的比较多。就技术层面来说,来一些问题还好,但是不停的出现新的问题就开始越来越躁了。当在学校时,烦躁了从实验室直接回寝室吃完饭睡一觉就出去打球,晚上再回去实验室也就更有耐心地去探究并最后解决这个问题。但现在烦躁了只能在阳台上待一会回去还是得面对并解决这个问题,没有了缓冲的时间,个人觉得还是应该调整自己,去适应这种情况,现如今时间不像以前那样慢节奏,需要自己提高在短时间内面对不同情况并及时解决的能力。但就当前的话,还是处于一个较低的水平,还是需要谨记并在日后的生活中不断调整与提升。

参阅文章

1、Tor Documentation
2、Anonymous Routing of Network Traffic Using Tor
3、交叉编译Tor在路由器上使用
4、Compile Firmware from source using Ubuntu
感谢他们提供的知识。