Tor网络结构
本篇将详细介绍Tor的基本组件,及其工作原理。
1、基本结构
Tor链路通常包含3种节点,即入口节点(Entry/Guard Node),中间节点(Middle Node)和出口节点(Exit Node),它们统一被称为中继节点(Relay Node),且理论上可以互换位置。其中入口节点可搭载不同的可插拔传输协议(Pluggable Transport, PT),包括WebTunnel、obfs4、Snowflake和meek四种。
Tor有两类加密机制,即channel和circuit。其中channel使用Tor的TLS进行加密传输,用于节点之间进行加密,且channel无需每次都建立,短时间内,可支持多个circuit建立。而circuit则是Tor知名的3跳电路,其是用公钥密码和对称密码组合的加密方式,即用RSA加密进行DH协商AES密钥,最终用AES加密数据。Tor客户端发送消息时,将消息进行3次AES加密,然后经过circuit中的3个节点逐层解密,最终以明文的形式到达目标地址,接受消息则是逐层加密。

图中灰色部分为channel加密层,红绿蓝部分为circuit加密层。
通过标准Tor(不使用PT)访问目标网站有以下几个步骤:
- 初次连接时,Tor客户端与内置的官方目录服务器(Directory Authorities)建立channel,下载Tor共识(Consensus)文件至Tor的Data目录中,官方目录服务器编译在Tor源码中(/src/app/config/auth_dirs.inc),其包含当前Tor网络中可用的中继节点(Relay Nodes)列表及其公钥、IP地址、带宽等信息。还会获取目录缓存节点(Directory Cache)的节点描述信息,这些是存储网络共识的普通中继节点。等下次再请求共识文档时,客户端可以从之前的共识文档中获取目录缓存节点的地址,然后通过Tor电路向这些节点请求最新的共识文档,以减轻目录服务器的压力。Tor客户端从节点列表中随机选择3*n个中继节点组成n个电路(Circuit),客户端同时维护这n条电路。
- 客户端与入口节点首先通过TLS建立channel加密通道,然后客户端生成一个临时会话密钥,并使用入口节点的RSA公钥加密后发送,完成基于Diffie-Hellman协议的密钥协商,随后发送固定512字节大小的CREATE信元(Cell),包含circuit握手数据,入口节点回复CREATED信元,确认连接建立。
- 客户端首先通过channel给入口节点发送EXTEND信元,指示入口节点与指定的中间节点建立连接;然后入口节点与中间节点建立TLS加密的channel,将EXTEND信元中的密钥协商数据封装为CREATE信元,发送给中间节点;接着中间节点构造一个CREATED信元,包含密钥协商的结果,并通过channel发送回入口节点;最后入口节点将CREATED信元封装成EXTENDED信元发回客户端。简单来说,客户端通过入口节点与中间节点协商密钥,客户端生成新的会话密钥并通过中间节点的公钥加密发送,建立客户端与中间节点的端到端加密(非TLS)。
- 与上述过程类似,客户端通过入口节点和中间节点,与出口节点完成密钥协商后,电路建立完成。
- 客户端与3个节点分别建立了端到端的加密,且每个节点之间都建立了TLS加密的channel通道,客户端发送数据时,需要加密3次。正向传播时,数据逐层解密,出口节点将获取明文数据。反向传播时,数据逐层加密,入口节点能够获取客户端IP。
当客户端使用网桥时,通信过程变为如下所示:

客户端首先和网桥节点建立channel通道,然后建立一个仅有1跳的circuit,也就是通过网桥节点代理,连接目录服务器获取共识文件,然后再建立正常的circuit。通过stem库可观察到此现象。

另外,Tor中channel用的TLS加密也是基于OpenSSL库实现的,不过SNI是格式为www.+[4~25个随机字符]+.com的假域名,源码见/src/lib/tls/tortls_openssl.c
2、可插拔传输协议
虽然Tor的重点在去匿名化,但在规避审查方面,Tor也提供了一些协议,不过相比于Xray,Sing-box等专门用于规避流量审查的软件来说,要弱一些。下面介绍Tor四种主要的可插拔传输协议。
2.1 obfs4

obfs4协议由ScrambleSuit协议演变而来,其将流量全部加密,旨在绕过流量审查,但其加密后的流量随机化特征明显,已经能够被精准识别。
2.2 meek

meek协议的核心原理在于域前置,即通过CDN隐藏真实IP和域名,但其访问速度极慢,且重度依赖CDN服务。目前Tor使用的是CDN77厂商的服务,知名的phpmyadmin也是使用的此厂商的CDN服务,遂www.phpmyadmin.net已成为Tor最常用的前置域名。
2.3 Snowflake

Snowflake主要由Client、Proxy和Broker三部分组成。Client需要通过请求Broker协调,与Proxy建立WebRTC连接。Proxy将Client的流量中转至Tor网络。请求Broker时,使用域前置技术隐藏Broker。
2.4 WebTunnel

WebTunnel协议通过Nginx等反向代理服务建立伪站,只有用户提供正确的url,Nginx才会将用户流量代理转发,其原理类似TLS+WS+Web。