私有Tor匿名网络搭建
洋葱头是第二代洋葱路由的一种实现,用户通过它可以在因特网上进行匿名交流。
由于tor在国内是没有节点的,所以想做一些tor的实验,还必须租用国外的服务器。基于此,为了方便读者运行tor网络,解析tor数据包,本专栏基于网上公开资料,使用docker在本地搭建小型tor网络,实现用户的匿名性。
0x01 网络架构
本次网络的搭建,秉持一个观点,以最少的消耗,搭建一个tor网络,所以搭建成功的网络虽然可以传递tor流量,但是并不能保证用户的匿名性。如果读者有更多匿名性的需要,可以通过增加节点数量,来保证匿名性。
网络架构:
- Client:客户机
- DA:目录服务器
- Guard、Middle、Exit:Tor中继或出口节点
这里一共有6个节点,由于我们只是为了保证用户的匿名性,所以web服务,我们就选择百度的门户网站做测试。其他的五个节点,由于DA也可以充当中间的三个节点,所以我们一共搭建4个节点。
0x02 网络搭建
作者的搭建环境是在ubuntu18.04虚拟机上,采用docker搭建。
(一). 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
(二). 建立桥接网络
docker network create --driver bridge --subnet 172.10.1.0/16 --gateway 172.10.1.0 tor_net
–driver bridge 表示使用桥接网络
–subnet 172.10.0.0/16 表示子网ip(分配范围172.10.0.1 - 172.10.255.254)
–gateway 172.10.1.0 表示 网关
tor_net 表示网络名
(三). 建立节点模板
由于节点之间的大部分配置是类似的,所以,我们在单独配置某个节点前,优先配置节点模板。
·1. 拉取ubuntu镜像
docker pull ubuntu
- 建立容器
-
docker run -itd --name tor_1 --network=tor_net ubuntu /bin/bash
-
-itd 就是-i -t -d
-
-d 参数默认不会进入容器
-
-i: 交互式操作。
-
-t: 终端。
-
–name 名字
-
/bin/bash:放在镜像名后的是命令,/bin/bash表示交互式 Shell。
- 编译tor源码
没有选择apt-get直接安装tor的原因是apt-get中的tor是阉割版的,所以对github上的tor源码进行编译。( https://github.com/torproject/tor)
(0) 将 tor-main 拷入 容器
docker exec tor_1 mkdir /etc/tor
docker cp ./tor-main tor_1:/etc/docker
(1) 更新apt
进入容器 docker attach tor_1
修改source list
sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
apt clean
apt-get update -y
(2) 安装一些必备的包
这些包,是我在编译tor过程中,缺的包
apt-get install autotools-dev automake autoconf libtool make gcc libevent-dev libssl-dev zlib1g zlib1g-dev
apt-get --no-install-recommends install asciidoc
(#–no-install-recommend附件太多,只装有必要的)
apt-get install docbook-xml docbook-xsl
(3) 初始化 git
在过程中因为报错,好像用到了git管理,所以按照报错需要对git进行初始化
git init
git config --global --add safe.directory /etc/docker/tor-main
git commit -m “first commit”
(4) 编译tor
chmod 777 tor-main -R
cd tor-main
./autogen.sh
./configure
make
make install
4.保留镜像
导出镜像
docker export tor_1 > tor_p.tar
导入镜像
docker import - tor < tor_p.tar
查看镜像
docker imges
创建新容器
docker run -it --name tor_p --network=mynet tor /bin/bash
(四). 配置DA
(中间有段时间忘了整理了,这里和前面可能有些断片,如果有问题可以评论提问)
四五两节主要是torrc文件的配置。
首先生成节点密钥和指纹
sudo -u root mkdir /etc/docker/data
sudo -u root tor --list-fingerprint --orport 5000 --dirserver “DA 172.10.0.1:7000 ffffffffffffffffffffffffffffffffffffffff” --datadirectory /etc/docker/data
首先生成DA密钥和证书
sudo -u root tor-gencert --create-identity-key -m 12 -a 172.10.0.1:7000 \
-i /etc/docker/data/keys/authority_identity_key \
-s /etc/docker/data/keys/authority_signing_key \
-c /etc/docker/data/keys/authority_certificate
torrc 配置如下,需要注意的是DirAuthority中指纹的获取
v3ident 填写生成的DA证书中的指纹
cat authority_certificate | grep fingerprint
最后的节点指纹
cat /etc/docker/data/fingerprint
配置 torrc
NickName DA
Address 172.10.0.1
# LOG 文件
Log notice file /etc/docker/tor_log/notice.log
Log info file /etc/docker/tor_log/info.log
Log debug file /etc/docker/tor_log/debug.log
## 目录服务器设置
AuthoritativeDirectory 1
## Tor将生成第3版网络状态
V3AuthoritativeDirectory 1
ContactInfo auth0@test.test
# 存储工作数据
DataDirectory /etc/docker/data
## 关键端口
# 不希望通过SOCKS连接应用程序
SocksPort 0
# OrPort监听Tor连接
OrPort 5000
# DirPort监听目录服务 在此端口上通告目录服务
DirPort 7000
# 调试端口
ControlPort 6666
## 指定自己的目录服务器
# 1 authority_certificate | grep fingerprint
# 2 fingerprint
DirAuthority DA orport=5000 no-v2 v3ident=583A462E5CADC4EC5C3212FDAC8F4A028A8E1584 172.10.0.1:7000 DFDA9F10DD63D43B77DFE7FB896310CAD265318E
## 测试 Tornetwork
TestingTorNetwork 1
TestingV3AuthInitialVotingInterval 300
TestingV3AuthInitialVoteDelay 20
TestingV3AuthInitialDistDelay 20
TestingDirAuthVoteGuard *
TestingMinExitFlagThreshold 0
## 这些配置是为了快速上线,避开一些对稳定性的限制
RunAsDaemon 1 #后台运行
AssumeReachable 1
#响应SIGINT信号,立即关闭
ShutdownWaitLength 0
# Tor进程启动前必须可用的最小文件描述符数。
ConnLimit 60
#出口策略 不作为出口 拒绝一切出口流量
ExitPolicy reject *:*
# 安全设置与调试设置
ProtocolWarnings 1
SafeLogging 0
DisableDebuggerAttachment 0
(五). 配置中继节点和客户端
仅需要生成节点密钥和指纹
sudo -u root mkdir /etc/docker/data
sudo -u root tor --list-fingerprint --orport 5000 --dirserver “DA 172.10.0.1:7000 ffffffffffffffffffffffffffffffffffffffff” --datadirectory /etc/docker/data
配置torrc(仅需要修改ip和nickname)
NickName relay*
Address 172.10.0.*
# LOG 文件
Log notice file /etc/docker/tor_log/notice.log
Log info file /etc/docker/tor_log/info.log
Log debug file /etc/docker/tor_log/debug.log
# 存储工作数据
DataDirectory /etc/docker/data
## 关键端口
# 后续代理访问需要的端口
SocksPort 9050
# OrPort监听Tor连接
OrPort 5000
# 调试端口
ControlPort 6666
## 指定自己的目录服务器
# 1 authority_certificate | grep fingerprint
# 2 fingerprint
DirAuthority DA orport=5000 no-v2 v3ident=583A462E5CADC4EC5C3212FDAC8F4A028A8E1584 172.10.0.1:7000 DFDA9F10DD63D43B77DFE7FB896310CAD265318E
## 测试 Tornetwork
TestingTorNetwork 1
TestingDirAuthVoteExit *
TestingDirAuthVoteHSDir *
TestingDirAuthVoteGuard *
TestingMinExitFlagThreshold 0
## 这些配置是为了快速上线,避开一些对稳定性的限制
RunAsDaemon 1 #后台运行
AssumeReachable 1
#响应SIGINT信号,立即关闭
ShutdownWaitLength 0
# Tor进程启动前必须可用的最小文件描述符数。
ConnLimit 60
#出口策略 可以作为出口
ExitRelay 1
ExitPolicy accept *:*
# 安全设置与调试设置
ProtocolWarnings 1
SafeLogging 0
DisableDebuggerAttachment 0
0x03 测试效果
一共搭建了一个DA容器,三个中间节点容器(其中一个客户端,客户端并没有单独配置)
由于没有搭建匿名服务,所以仅通过代理访问和log文件进行效果验证
(一).代理访问
(二).wireshark抓包
这一部分只能知道他们在交换数据,由于内容加密,而且对tor的原理已经忘记的差不多了,所以没有分析,后续有时间,可以结合源码和tor的设计原理对包进行解读
(三).nyx 查看后台
1.客户端
2.DA
3.中继节点
其实这里,我在中继节点和客户端配置是一样的,并且当网络足够大的情况下,某一个节点,某一个节点可能随时既充当中继节点,也充当客户端。
(四).客户端log文件
查看info.log
可以看到客户端,可以看到中继节点的选择
0x04 参考资料
1.搭建私有Tor网络 | 没名字的博客 (zhuyuezy.github.io)
2.Ubuntu Docker 安装 | 菜鸟教程 (runoob.com)
3.Anonymous Routing of Network Traffic Using Tor (poly.edu)
4.tor(1): second-generation onion router - Linux man page (die.net)
5.在PC以及路由器上的Tor组网搭建过程 (lessismore.cool)
6.使用docker搭建Tor测试网络(靶场) (ngui.cc)
等等
0x05 写在最后
如果有错误的地方,请读者在评论区反馈我,我会立刻改正,大家一起进步。
最近的学习生活感觉很凌乱,学了一些东西,但积累文字输出很不到位,感觉有些图快了,上个学期搭建好的环境,这个学期才写文档,所以中间可能会断片,评论区出现问题,我看到会尽快回复。
而且发现自己在组会讲论文的时候,论文的选取和拆分讲解很不到位,重点突出不当,想的以后还是要多总结,写点东西,用朴素凝练的语言,讲易懂的话。
下一阶段,多读点论文,复现些代码和深度学习的项目,思考一下自己到底想解决什么问题。
虽然很菜,不过,我的求学之路才刚刚开始,加油! 作者:ONINE林初九 https://www.bilibili.com/read/cv21769062 出处:bilibili