Tor网络原理详解

news2025/4/12 6:48:33

引入

匿名通信是一种通过采用数据转发、内容加密、流量混淆等措施来隐藏通信内容及关系的隐私保护技术。为了提高通信的匿名性,这些数据转发链路通常由多跳加密代理服务节点构成,而所有这些节点即构成了匿名通信系统(或称匿名通信网络)。匿名通信系统本质上是一种提供匿名通信服务的覆盖网络,可以向普通用户提供Internet匿名访问功能以掩盖其网络通信源和目标,向服务提供商提供隐藏服务机制以实现匿名化的网络服务部署。作为匿名通信系统的核心功能,隐藏服务机制通常利用多跳反向代理或通过资源共享存储来掩盖服务提供商的真实地址,可以保证匿名服务不可追踪和定位。

匿名通信技术的提出源于网络用户的隐私保护需求,但是随之而来的是各种匿名滥用问题。尤为突出的是,一些不法用户基于Tor,I2P,Freenet等匿名通信系统提供的隐藏服务机制,架设必须通过特殊软件或进行特殊配置才能访问的网络服务,形成了无法被直接检索的暗网。术语“DarkWeb”和“Darknet”经常被混用指代暗网。为了更好地厘清这2个术语之间的关系和差异,并界定本文所讨论的暗网的内容,给出如下定义:

  1. DarkWeb:必须通过特殊的软件、特殊的配置才能访问的拥有特殊域名的Web站点,搜索引擎无法对其进行检索。
  2. Darknet:必须通过特殊的软件、特殊的配置才能访问,包含Web、IRC、文件共享等各类资源和服务的匿名网络,搜索引擎无法对其进行检索。

两者的关系如图1所示,其中DarkWeb重点在于不可检索、不可直接访问,并不强调匿名,因此既包含匿名Web站点(如Tor隐藏服务站点),也包含非匿名Web站点(如ZeroNet提供的Web站点);而Darknet则强调匿名性,即所有的资源都需要基于相应的匿名通信系统才能进行访问,其中的资源不限于Web服务。
image.png

Tor匿名通信系统

Tor(the second-generation onion router)是目前使用范围最广的匿名通信系统之一,其核心技术“洋葱路由”在20世纪90年代中期由美国海军研究实验室提出,并在1997年交由美国国防高级研究计划局(DARPA)进一步开发。2003年Tor正式版发布,2004年Tor设计文档在第13届USENIX安全讨论会上正式发表,并在同年由美国海军研究实验室公开其源码。

Tor使用多跳代理机制对用户通信隐私进行保护:首先,客户端使用基于加权随机的路由选择算法分别选择3个中继节点,并逐跳与这些中继节点建立链路。在数据传输过程中,客户端对数据进行3层加密,由各个中继节点依次进行解密。由于中继节点和目的服务器无法同时获知客户端IP地址、目的服务器IP地址以及数据内容,从而保障了用户隐私。Tor于2004年开始支持隐藏服务,为Tor暗网的出现提供了技术支撑。Tor暗网是目前规模最大的暗网之一,其中包含大量的敏感内容与恶意内容。Tor隐藏服务是仅能在Tor暗网中通过特定形式的域名(.onion)访问的网络服务。Tor暗网的基本组件包括客户端、目录服务器(directory server)、隐藏服务目录服务器(hidden service directory)、洋葱路由器(onion router, OR)和隐藏服务器(hidden server),如图2所示。
image.png

  1. 客户端:客户端是运行在用户操作系统上的本地程序,称为洋葱代理(onion proxy, OP)。OP将用户数据封装成Tor信元并层层加密,为各类TCP应用程序提供匿名代理服务。
  2. 洋葱路由器:Tor暗网中的数据中继节点。Tor默认匿名链路由3个OR组成,分别为入口节点(Entry)、中间节点(Middle)和出口节点(Exit),其中入口节点一般选择可信度较高的守护节点(Guard)。
  3. 隐藏服务器:提供Web,IRC等TCP应用服务。隐藏服务器受到Tor匿名性的保护,必须使用Tor客户端才能够访问其TCP应用服务。
  4. 目录服务器:目录服务器保存了所有洋葱路由器的IP地址、带宽等信息。客户端在首次启动后向目录服务器请求洋葱路由器信息,以便完成节点选择和链路建立。
  5. 隐藏服务目录服务器:隐藏服务目录服务器存储并为客户端提供隐藏服务器的引入节点(introduction point, IPO)、公钥等节点信息。

客户端、洋葱路由器、目录服务器、隐藏服务目录服务器和隐藏服务器的功能都集成在Tor软件包中,用户可以通过配置文件对具体功能进行配置。

Tor隐藏服务器在启动时会选择3个引入节点作为其前置代理,并将引入节点及其公钥信息上传至隐藏服务目录服务器。客户端访问隐藏服务时,首先建立3跳链路访问隐藏服务目录服务器,获取引入节点和公钥信息。客户端选择一个汇聚节点(rendezvous point, RPO)作为客户端和隐藏服务器通信链路的汇聚点,并将汇聚节点的信息通过引入节点告知隐藏服务器。客户端和隐藏服务器各自建立到达汇聚节点的链路,完成6跳链路的搭建后即可开始通信。Tor用户通过6跳链路访问隐藏服务器,在此过程中任意节点无法同时获知Tor客户端IP地址、隐藏服务器IP地址以及数据内容,保障了Tor客户端与隐藏服务器的匿名性。

匿名接入技术

匿名接入技术是匿名通信网络为了规避网络监管而提供的客户端隐蔽接入技术。网络监管者出于安全审计的考虑,会检测匿名网络的中继节点并阻止用户接入。为了规避此类网络审查,研究人员提出了各种匿名接入技术,包括bridge,pbfs,meek,FTE,Flashproxy等。

bridge节点

Tor的设计者在2011年提出了bridge节点的概念以突破网络监管。由于此类节点的信息不公开,因此Tor客户端可以将其作为入口节点从而接入匿名网络。
bridge是匿名网络为了提升自身隐蔽性和规避基于IP阻断的网络监管而开发的一种接入机制。bridge节点功能上与一般的Tor中继节点相同,但其信息并未被目录服务器公开,从而降低了被网络监管者发现和阻断的风险。为了方便用户获取此类节点信息,Tor项目提供了2种获取方式:

  1. 在bridgeDB数据库中保存了bridge节点信息,用户可通过直接访问官网站点获取3个bridge节点;
  2. 用户还可通过Google和Yahoo邮箱向指定邮箱发送请求,邮件服务器会自动回复3个bridge节点信息。由于Google和Yahoo申请虚假邮件地址比较困难,所以可有效防止无限制获取bridge节点信息等恶意攻击。

obfs混淆代理

虽然Tor可以使用bridge节点来规避基于IP阻断的监管,但监管者仍能通过深度包检测(deep packet inspection, DPI)技术来识别出Tor流量。鉴于此,Tor项目开发了第1个传输插件obfs混淆代理。Obfs后续又经历了3次版本改进,分别为obfs2,obfs3,obfs4,当前最新版本的Tor使用的是obfs4。其中,obfs2设计于2012年,采用分组密码(AES-CTR-128)对Tor的传输数据进行加密,擦除了Tor流量相关的标识信息,从而实现了有效混淆。但是obfs2在设计上存在2个问题:

  1. 握手阶段的连接容易被识别。通信双方在传输数据之前需要交换秘密信息并协商出会话密钥,而在这一阶段的密钥种子是通过明文传输且报文格式固定,导致这种obfs2流量容易被中间审查机制识别并计算出双方的会话密钥。
  2. 可利用Tor客户端探测bridge节点以检查其是否可进行obfs2握手,从而实施主动的bridge探测攻击。

鉴于上述设计缺陷,Tor后续又推出了obfs3和obfs4方案。作为obfs2的后续设计,obfs3使用Diffie-Hellman协议来计算通信双方的共享秘密,并由此生成对称密钥。相较于obfs2,obfs3在握手阶段有了很大的改进,但其在密钥交换阶段仍然缺乏对bridge身份的验证,存在中间人攻击和主动探测攻击的风险。

为了抵御上述攻击,需要能够有效保证双方通信真实性、完整性和机密性的优化方案。ScrambleSuit提出利用带外方式交换共享秘密实现通信双方的互认证,能够有效防御主动探测攻击。在此基础上,obfs4进一步利用BridgeDB实现了基于bridge身份验证的密钥交换。客户端通过BridgeDB查询bridge节点,获得其IP地址、节点ID和公钥信息。只有同时匹配这3个信息才能通过obfs4节点的身份验证并建立连接。obfs4是对obfs3的重大升级,既有效地混淆了Tor流量,又实现了bridge身份验证,达到能够抵御主动探测攻击和中间人攻击的效果。

meek隐蔽通道构建技术

meek是一种基于前置域(domain fronting)的隐蔽通道构建技术,其工作原理如图7所示。首先,meek-client向前置域名服务器发送一个TLS Client Hello消息,并将该服务器域名填入SNI(server name indication)字段。在TLS握手成功后,meek-client把实际传输的Tor流量封装在HTTP POST载荷中,并将目标bridge地址写入HTTP HOST字段。由于监管者无法查看加密后的HTTP POST内容,因此无法识别真正的目标bridge地址。前置域服务器接收到meek-client数据后,根据HTTP HOST字段值将数据转发到目标bridge节点。该节点上运行的meek-server对HTTP报头处理后将封装的Tor流量转发给后续中继节点。在当前Tor网络中,meek的实现主要依赖于Google,Amazon和Azure等大型服务提供商提供的白名单前置域名服务器,造成Tor客户端在访问正常网站的假象,从而规避网络流量监控。
image.png

FTE加密流量转换技术

FTE(format-transforming encryption)由Dyer等人在2013年ACM计算机与通信安全会议(ACM Conference on Computer and Communications Security, CCS)上发表,其主要原理是通过扩展传统对称加密,将密文转换为指定的传输格式。与obfs流量混淆方式不同,FTE没有将原协议流量转换为无序的未知流量,而是根据用户输入的正则表达式,输出具有一定协议格式的流量。其中,用户输入的正则表达式可以从DPI系统源码中直接提取或根据应用层流量自动学习得到。这使得基于正则表达式的DPI技术会将其误识别为用户选定的协议流量,从而实现规避审查的目的。由于大部分Tor流量为HTTP流量,默认情况下采用HTTP正则表达式将之转化为HTTP协议,从而实现流量伪装。

洋葱匿名路由技术

匿名路由技术是匿名通信系统为用户提供匿名服务时所使用的一种关键技术。该技术具体涉及路由节点选择、链路建立、数据传输等多个阶段。通过匿名路由技术,匿名通信系统的安全和性能都能够得到保障。目前,低延迟匿名通信系统所使用的路由技术主要包括洋葱路由、大蒜路由和基于DHT的路由。

洋葱路由技术的核心思想是通过多跳代理与层层加密的方法为用户的通信隐私提供保护。Tor是最典型的使用洋葱路由技术的匿名通信系统。在Tor暗网中,客户端与隐藏服务器之间需要各自选择3个节点建立多跳链路才能进行通信。目前,Tor主要采用基于加权随机的路由选择算法选择洋葱路由器构建链路。该算法依据服务器描述符(server descriptor)与共识文档(consensus document)中的带宽信息与放缩因子计算各节点的加权值,并按照出口节点、入口节点和中间节点的顺序选择链路节点。值得注意的是,链路中任意2个洋葱路由器应来自不同的C类网段。

在节点选择完成之后,OP从入口节点开始逐跳建立匿名链路,节点之间均采用TLS/SSLv3对链路进行认证。为增强可读性,下面将入口节点、中间节点、出口节点用OR1,OR2,OR3表示。首先,OP与OR1建立TLS链接,即OP发送CELL_CREATE信元,OR1进行响应以完成Diffie-Hellman握手并协商会话密钥 k 1 k_{1} k1,从而建立第1跳链路。其中,CELL_CREATE信元是Tor中一种数据传输的基本单元,长度为512B。然后,OP向OR1发出与OR2建立链路的Tor信元,OR1收到后与OR2建立TLS链路,并通过Diffie-Hellman协议协商OP与OR2之间的会话密钥 k 2 k_{2} k2。OR1将会话密钥通过加密报文告知OP,完成第2跳链路的建立。以此类推,Tor建立多跳链路实现与通信目标的安全连接。

在匿名链路建立后,用户可以通过OP访问公共网络进行数据传输。当OP获得目标服务的IP地址和端口后,使用 k 1 k_{1} k1 k 2 k_{2} k2 k 3 k_{3} k3对数据信元进行层层加密封装,即 { { { < I P : p o r t > } k 3 } k 2 } k 1 \{\{\{<IP:port>\}_{k_{3}}\}_{k_{2}}\}_{k_{1}} {{{<IP:port>}k3}k2}k1,这种加密方式称为“洋葱加密”。该信元经过每个OR节点时,都会被使用对应的密钥对最外层进行解密并转发。当到达OR3后进行最后一次解密,即可识别出目标服务器的IP地址和端口,从而建立TCP连接。在此过程中,用户的上行数据经过OP层层加密,由各OR逐层解密并转发至目标服务器;与此相反,目标服务器的下行数据经过各OR加密,由OP逐层解密并最终返回给应用程序。对于目标服务器来说,Tor用户是透明的,其始终认为自己在和OR3通信,而各OR无法同时获得Tor用户IP、目的服务器IP和应用数据,从而保证了通信的匿名性。

Tor隐藏服务

Tor隐藏服务是通过隐藏服务域名(即洋葱域名)唯一标识和查找的。服务器首次运行后将生成一个隐藏服务域名,其域名形式为.onion。其中是长度为16B的字符串,由RSA公钥Hash值的前80b进行base32编码获得。

image.png

Tor隐藏服务器在启动过程中会将其信息上传至隐藏服务目录服务器,Tor客户端能够通过目录服务器获取足够的信息与隐藏服务器建立双向链路。图2展示了客户端访问隐藏服务的具体过程:

  1. 隐藏服务器选择3个洋葱路由器作为其引入节点,并与引入节点建立3跳链路;
  2. 隐藏服务器将其隐藏服务描述符(hidden service descriptor)上传至隐藏服务目录服务器,描述符中包含引入节点的信息与自身RSA公钥;
  3. 客户端通过隐藏服务域名(.onion)进行访问时,从隐藏服务目录服务器获取引入节点的相关信息;
  4. 客户端选择一个洋葱路由器作为汇聚节点并与该节点建立3跳链路;
  5. 客户端建立到达引入节点的3跳链路,并通过引入节点将汇聚节点的信息发送到隐藏服务器;
  6. 隐藏服务器建立到达汇聚节点的3跳链路,并对该链路进行认证;
  7. 经过汇聚节点,客户端与隐藏服务器通过6跳链路进行交互。

Tor隐藏服务器运行时,将自身的RSA公钥及引入节点信息上传至通过下式选定的6个隐藏服务目录服务器上,其中 H ( x ) H(x) H(x)是结果长度为160b的Hash函数, ∥ \parallel 为拼接函数。
D e s c r i p t o r − i d = H ( P u b l i c − k e y − i d ∥ S e c r e t − i d − p a r t ) Descriptor-id=H(Public-key-id\parallel Secret-id-part) Descriptorid=H(PublickeyidSecretidpart)
其中,Public-key-id即为RSA公钥的SHA1摘要的前80b。Secret-id-part,可计算为
S e c r e t − i d − p a r t = H ( T i m e − p e r i o d ∥ D e s c r i p t o r − c o o k i e ∥ R e p l i c a − i n d e x ) Secret-id-part=H(Time-period\parallel Descriptor-cookie\parallel Replica-index) Secretidpart=H(TimeperiodDescriptorcookieReplicaindex)
其中,Descriptor-cookie为可选字段,该字段可以用来防止未授权客户端访问隐藏服务;Replica-index有2种取值,其作用为选择不同的隐藏服务目录服务器。Time-period字段用于分散隐藏服务重新选择隐藏服务目录服务器的时间,可计算为
T i m e − p e r i o d = t + P [ 0 : 1 ] × 86400 256 86400 Time-period=\frac{t+P[0:1]\times \frac{86400}{256} }{86400} Timeperiod=86400t+P[0:1]×25686400
其中,t为当前的UNIX时间。该字段将一天划分为256个时段,并在其中某个时刻重新选择隐藏服务目录服务器上传信息。

隐藏服务目录服务器利用DHT进行组织,每个目录服务器都是DHT中的一个节点,DHT结构如图12所示。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1318497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ReenterLock重入锁

synchronized就是一种最简单的控制方法&#xff0c;它决定了一个线程释放可以访问临界区资源。 同时&#xff0c;Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

使用podman管理容器

目录 1.安装及配置podman 2.镜像的命名 3.对镜像重新做标签 4.删除镜像 5.查看镜像的层结构 6.导出和导入镜像 7.创建容器 8.创建一个简单的容器 9.容器的生命周期 10.创建临时容器 11.指定容器中运行的命令 12.创建容器时使用变量 对于初学者来说&#xff0c;不太容易理…

深入解析HashMap数据结构及其应用

目录 引言 1. HashMap简介 2. 哈希表的基本原理 3. HashMap的内部结构 4. 哈希冲突的处理 5. HashMap的常见操作 6. HashMap的性能优化 7. 实际应用场景 结论 引言 在计算机科学中&#xff0c;数据结构是构建和组织数据的一种方式&#xff0c;而HashMap是其中一种常用…

TCP单人聊天

TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式&#xff0c;也有着优点和缺点 它的优点对比于UDP来说就是可靠一点 因为它的通讯方式是需…

ripro后台登录后转圈和图标不显示的原因及解决方法

最近&#xff0c;好多小伙伴使用ripro主题的小伙伴们都发现&#xff0c;登录后台后&#xff0c;进入主题设置就转圈&#xff0c;等待老半天后好不容易显示页面了&#xff0c;却发现图标不显示了&#xff0c;都统一显示为方框。 这是因为后台的js、css这类静态资源托管用的是js…

02-分组查询group by和having的使用

分组查询 MySQL中默认是对整张表的数据进行操作即整张表为一组, 如果想对每一组的数据进行操作,这个时候我们需要使用分组查询 分组函数的执行顺序: 先根据where条件筛选数据,然后对查询到的数据进行分组,最后也可以采用having关键字过滤取得正确的数据 group by子句 在一条…

FME之FeatureReader转换器按表格内容读取矢量数据

问题&#xff1a;平时会遇到只用某个大数据里某小部分数据参与下一步数据处理&#xff0c;此时我们会用到FeatureReader转换器&#xff0c;一般是通过空间关系&#xff08;相交、包含&#xff09;来读取相应涉及的图斑矢量&#xff0c;但就有一个问题&#xff0c;加入你的启动器…

JS中浅拷贝和深拷贝

本篇文章咱们一起来学习下JS中的浅拷贝和深拷贝&#xff0c;了解它们在内存上的区别&#xff0c;并掌握浅拷贝和深拷贝的常用实现方法。 引用赋值 在学习拷贝之前&#xff0c;咱们先来看一个常见的情景&#xff0c;如下图&#xff1a; 大家觉得这是深拷贝还是浅拷贝&#xff0…

ensp创建配置环境,实现全网互访

文章目录 创建配置环境&#xff0c;实现全网互访配置步骤接入层交换机&#xff08;sw4、sw5&#xff09;划分vlan汇聚层交换机&#xff08;sw2、sw3&#xff09;配置ip地址作为vlan网关、与sw1 ip地址直连核心层交换机&#xff08;sw1&#xff09;配置ip地址与汇聚层交换机&…

计算机网络:数据链路层(VLAN)

今天又学到一个知识&#xff0c;加油&#xff01; 目录 一、传统局域网的局限&#xff08;促进VLAN的诞生&#xff09; 二、VLAN简介 三、VLAN的实现 总结 一、传统局域网的局限&#xff08;促进VLAN的诞生&#xff09; 缺乏流量隔离:即使把组流量局域化道一个单一交换机中…

Java小案例-RocketMQ的11种消息类型,你知道几种?(请求应答消息)

前言 Rocket的请求应答消息是指在使用Rocket&#xff08;这里可能是RocketMQ或者Rocket框架&#xff09;进行通信时&#xff0c;客户端发送一个请求到服务端&#xff0c;然后服务端处理该请求并返回一个响应的过程中的数据交换。 在RocketMQ中&#xff1a; 请求应答消息通常…

MySQL性能测试(完整版)

MySQL性能测试之SysBench 一、SysBench安装 1、mac安装命令&#xff1a;&#xff08;其他系统安装对应的命令即可&#xff0c;不影响后面的使用&#xff09; brew install sysbench2、查看是否安装成功&#xff1b; sysbench --version附&#xff1a; &#xff08;1&#x…

The Grid – Responsive WordPress Grid响应式网格插件

点击阅读The Grid – Responsive WordPress Grid响应式网格插件原文 The Grid – Responsive WordPress Grid响应式网格插件是一个高级 wordpress 网格插件&#xff0c;它允许您在完全可定制且响应迅速的网格系统中展示任何自定义帖子类型。 Grid WordPress 非常适合展示您的博…

runCatching异常捕获onSuccess/onFailure返回函数,Kotlin

runCatching异常捕获onSuccess/onFailure返回函数&#xff0c;Kotlin fun test(a: Int, b: Int) {runCatching {a / b}.onSuccess {println("onSuccess: $it")return ok(it)}.onFailure {println("onFailure: $it")return fail(it)} }fun ok(o: Any) {prin…

QT第一步

文章目录 软件下载软件安装QT的程序组新建项目 软件下载 qt下载网址&#xff1a;https://download.qt.io/archive/qt/   关于版本&#xff1a;     我选择的版本是5.14.2&#xff0c;这个版本是最后的二进制安装包的版本&#xff0c;在往后的版本就需要在线安装了。并且5…

常用网安渗透工具及命令(扫目录、解密爆破、漏洞信息搜索)

目录 dirsearch&#xff1a; dirmap&#xff1a; 输入目标 文件读取 ciphey&#xff08;很强的一个自动解密工具&#xff09;&#xff1a; john(破解密码)&#xff1a; whatweb指纹识别&#xff1a; searchsploit&#xff1a; 例1&#xff1a; 例2&#xff1a; 例3&…

QT5 CMake进行开发

配置环境 因为是使用CMake进行开发&#xff0c;所以推荐使用的QT版本是 5.14.2。因为楼主有 vs2015的环境&#xff0c;所以在安装QT时选择的是 msvc 2015 64bit msvc 2017 32bit 勾选了所有需要的模块。kit配置如下 图中画框的地方是比较关键的地方&#xff0c;1. 指定编译器…

3. cgal 示例 GIS (Geographic Information System)

GIS (Geographic Information System) 地理信息系统 原文地址: https://doc.cgal.org/latest/Manual/tuto_gis.html GIS 应用中使用的许多传感器&#xff08;例如激光雷达&#xff09;都会生成密集的点云。此类应用程序通常利用更先进的数据结构&#xff1a;例如&#xff0c;不…

【STM32】STM32学习笔记-对射式红外传感器计次 旋转编码器计次(12)

00. 目录 文章目录 00. 目录01. NVIC相关函数1.1 NVIC_PriorityGroupConfig函数1.2 NVIC_PriorityGroup类型1.3 NVIC_Init函数1.4 NVIC_InitTypeDef类型 02. 外部中断相关API2.1 GPIO_EXTILineConfig2.2 EXTI_Init2.3 EXTI_GetITStatus2.4 EXTI_ClearITPendingBit2.5 中断回调函…

一篇文章了解Flutter Json系列化和反序列化

目录 一. 使用dart:convert实现JSON格式编解码1. 生成数据模型类2. 将JSON数据转化成数据模型类3. 数据模型类转化成JSON字符串 二、借助json_serializable实现Json编解码1.添加json_annotation、build_runner、json_serializable依赖2. 创建一个数据模型类3. 使用命令行生成JS…