已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一种基于SYN注入式的TCP打洞技术SYNI编译:HyoSoft原文:SYNI TCP Hole Punching Based on SYN Injection作者:Sebastian Holzapfel, Matthaus Wander, Arno Wacker, Torben Weis/University of Duisburg-Essen, Distributed Systems Group/Bismarckstrae 90, 47057 Duisburg, Germany前言:互联网IP地址的短缺,IPv4过渡至IPv6进度缓慢,导致目前大多数仍然是通过NAT(网络地址转换)路由器上网。通常位于NAT路由器之后的上网设备无法从外网连接,然而,有很多网上应用需要接受外来连接,例如基于点对点技术的IP电话服务。有一些特别的技术可以绕过这种限制,叫做“NAT穿越”,而“打洞”则是NAT穿越的其中一种形式。本文分析对比一些已有的TCP打洞技术原理,和提出一种新的TCP打洞方案,通过从内网向本地路由器注入一个SYN包以达到打洞的目的。一个基于TCP打洞的远程办公软件已成功开发出来:Rdesk远程办公通道。1.0版本使用了本文中介绍的较为简单的TCP打洞方法,但亦能适用于大多数家用NAT路由器。该软件支持使用微软远程桌面进行远程办公,您可从www.HyoS下载使用。文本的目的除了介绍打洞的新方法,亦让读者对TCP打洞原理能有透彻的理解,可以在实践中实施自己的思路和方法。本文假设读者已熟悉Socket编程,对三次握手建立连接的过程有一定的了解,如果之前已了解过UDP打洞的基本原理,则更有助于理解本文的内容。1、 介绍网络地址转换(NetWork Address Translation,NAT)是解决互联网IP短缺的一种有效方案。目前世界上超过70%的上网电脑都是位于NAT路由器之后。如果互联网能够普及使用IPv6,那当然有充足的IP地址提供给世界上几乎每一台上网终端,但目前来看遥遥无期,NAT在相当长时间内仍将是访问互联网的主要方式。使用NAT路由器,多台电脑能够共享一个公网IP访问互联网,路由器后面的电脑只配置为私网IP。普通的路由不会对IP报文进行修改,只会根据路由表直接转发。而NAT路由器则把来自私网的数据包源IP地址/端口转换成公网IP地址/端口,发送至互联网,同时将来自互联网的相应的数据包的目的IP地址/端口转换为私网目的地址在内网发送,内网主机能透明地访问互联网。路由器的公网IP相对外网是可见的,但不能从外网直接访问位于路由器之后的内网主机。因此导致了一个问题,一些服务例如IP电话等,需要接受由外网发起的连接,但被路由器阻隔,不能正常工作。因此,一种叫做“NAT穿越”的技术方案被提了出来。在路由器设置端口映射(Mapping)是NAT穿越有效办法,有一种NAT穿越技术叫UPnP,一般NAT路由器都内置了此功能,它能实现内网主机向路由器主动请求端口映射,其使用简单,但由于一些原因,几乎所有路由器出厂设置都是禁用UPnP的。在一些场合,使用者无法自行启用UPnP,则打洞技术就非常必要了。打洞过程只需由内网主机向目的外网主机发送一个数据包,NAT路由器就会建立一条映射,允许目的外网主机反向进入和连接相应的内网主机。由于UDP协议的无连接性,UDP打洞比TCP打洞更容易实现。然而,很多应用要求可靠数据传输,而UDP为不可靠传输协议。尽管一种叫RUDP的协议能够提供基于UDP的可靠通讯,但大多数场合,使用成熟的TCP通讯方式无疑是更好的选择。我们的目标在于实现一种高成功率的基于TCP的打洞机制。为达目的,我们分析了各种路由器的特性,尽量让TCP打洞具有通用性。同时这种方法在实践中证明是非常壮健的,例如无需苛刻的时序约束等,否则在编程中难以实现。在本文中我们介绍了一种新的NAT穿越技术: SYN注入式TCP打洞。我们简称为SYNI(SYN Inject)。该技术能使一个位于内网主机对位于另一个内网的主机实现TCP连接,基本原理是:从一个内网的主机向另外一个内网的路由器发送一个SYN包(TCP连接请求包),另一个内网主机也进行同样的操作。但这两个SYN包是不能到达对方内网的,因为双方都有NAT路由器阻隔。2、 系统模型我们定义了一个固定系统模型,这个模型将会适用于下文中所有穿越方式。我们总假设通讯双方主机(Host)都是通过NAT路由器(Router)上网,可能是位于一个甚至多级NAT路由器之后。而且总假设这些主机已知道对方主机的路由器公网IP及发送数据包所分配的端口(Endpoint)。大多数NAT路由器(除Symmetric NAT),当内网主机在本机绑定某个TCP端口向外连接,路由器转换数据包时会保持该端口值作为EndPoint源端口。打洞连接过程双方主机需要交换一些信息,需要建立一个公共通道。例如可以在公网放置一个双方都可以直接访问的第三方服务器。有些系统直接使用了第三方公网服务器来中转通讯数据,而无需打洞,例如TeamViewer软件所使用的连接方式,但这种通讯方式相比直接连接会慢很多,因此一般第三方服务器只用来于协助打洞连接。此外第三方服务器还可以用来获取双方路由器的公网IP等信息。3、 基础知识我们先来讨论位于NAT路由器之后的两个主机尝试与对方建立TCP连接时,会发生什么。一个已经建立的TCP连接,路由器的动态映射表会有一个相应的映射记录,如 目标主机公网IP : 1234 本地NAT路由器端口5678 本地私网主机IP : 5678 ,路由器会转发符合每条记录中相应的数据包。如果内网需要与外网建立TCP连接,首先需要发送一个SYN包请求连接,例如源为“本机私网IP : 5678”,目的为“公网IP:1234”,路由器是允许此连接初始包通过,并进行源转换和发至公网的,此时路由器就会建立一个与上面类似的映射,即是在本地路由器打了一个洞。但当这个SYN包到达对方路由器时,由于对方路由器不存在相应的映射,则对方路由器可能会直接丢弃,或回应一个标记为“目标不可到达”的ICMP包,又或者会回应一个拒绝TCP包(RST)。相比Socket超时错误,返回一个拒绝连接错误,对于Socket通常是致命的,而且这个错误会导致本地路由器删除当前已建立的映射记录。因此,大多数的TCP打洞方法,都需要保证在发送某些数据包时,既可以通过本地路由器而又不到达对方的路由器。为了达到这样的要求,需要修改减少IP报文的TTL值(Time To Live),使报文在到达目的地之前就被丢弃。TTL值的选择一定要小于本地主机与目标主机之间的路由跳数。一般来说,当主机只位于一层路由器之后,则TTL固定为2就能保证达到这样的效果。如果是多级路由器,则在打洞之前主机需要确定合适的TTL值,保证IP包能通过所有本地路由器到达公网,并且不能返回“不可到达错误”或RST,即在所有本地路由器都打一个洞。这个可以通过递增TTL值,重复发送TCP或UDP包,直至检测到“目标不可到达”ICMP错误或RST错误,则上一个TTL值就是可用最大值。当数据包不能达到目的地,会返回一个ICMP超时包(Time Exceed),对于一般的操作系统和路由器,这个信息通常不会认作是一个错误。当主机发送了一个Low_TTL值的SYN包,就在路由器打了一个洞,使路由器生成了一个映射记录。我们期望有了这个洞,路由器就能允许外网主机发送SYN包进来,与内网主机开始建立TCP连接。的确有些路由器是这样,虽然支持这种简单打洞的路由器类型不多,但大多数人家用的路由器其实都是支持这样的方式。如果只希望实现单向连接功能,使用这种方式已经对大多数路由器都是合适的。Rdesk1.0就是使用这种方式,能实现从实现办公电脑对家庭内网电脑进行单向连接。但在相当多类型的NAT路由器,这个映射是有别于已建立连接后的映射的。我们知道,一个标准的TCP连接需要三次握手过程:1、连接:SYN(a / 0) | 2、回应:SYN/ACK(b / a+1) | 3、确认:ACK(a+1 / b+1) 。其中a为从A端发送的初始序列号,b为从B端发送的初始序列号。如果路由器严格安装此标准建立连接,则在内网主机发送一个SYN后,路由器可能会只等待从外网返回的是SYN/ACK包,而不是我们期望的允许SYN包进入,如果从外网返回的是一个SYN包,路由器有可能会当作是非法包而丢弃,甚至向对方回应ICMP错误或RST。在内网方向,路由器允许一个SYN包通过后,亦可能只会等待下一个来自内网主机的包是ACK包,其他包则认为是非法。同时,标准的TCP握手过程是要求序列号一致的。4、 SYNI方式我们上一节已描述了TCP打洞原理,它是依靠从内网向本地NAT路由器注入一个SYN包来实现。现在我们假设一个位于路由器Ra后面的内网主机HostA,试图与另一个位于路由器Rb后面的内网主机HostB建立连接。图一:SYNI-虚线表示双方之间的公共消息通道如图一所示,我们的SYNI方法包括四个步骤。它需要符合一些与HostA、HostB的操作系统有关的先决条件,同样Ra、Rb亦有需符合一定的条件。这里我们标记这些条件为P1,P2.P(x)等,因为在第六节将SYNI与其他打洞方式比较时我们会使用这些条件。第一步,我们会在主机HostA建立一个TCP套接字(SocketA),设置其为上一节中已找到的Low_TTL值,然后对HostB的外网IP及已知的端口号进行连接(Connect)。与此同时,HostA需要创建能够检测及发送Raw Packet的Raw Socket,和开始检测对发向外网的IP包(P1,条件一:操作系统可以实现Raw Socket检测和发送IP包)。通过IP包检测,可以分析TCP初始连接时发送的SYN包中ISN字段信息(Initial Sequence Number,初始序列码),即上一节介绍三次握手协议中的小写a 。这里需要路由器Ra支持,即路由器不会对发送的SYN包中的ISN信息进行修改(P2,条件二:路由器不会修改SYN包的ISN)。一些路由器会用一个偏移量修改ISN,以防止IP欺骗。当然一般的NAT路由器是不会这样做的,在我们的测试中也没有遇到过这种路由器。当这个SYN包到达路由器Ra,Ra会建立一个映射,和将这个SYN包向目的路由器Rb包发送。由于使用了Low_TTL,SYN包不会到达Rb,会在互联网中途某个路由器被丢弃,而不会返回ICMP错误或RST。SYN所经过的每一个互联网路由器可能都会返回一个ICMP超时信息,Ra可能会丢弃这些信息,或会把这些信息返回给HostA。无论如何,一般来说Ra仍然可以保持之前的映射,和SocketA不会终止连接,会继续等待返回一个SYN/ACK包(P3,条件三:内网主机及路由器忽略ICMP超时信息)。HostA通过第三方服务器通知HostB已开始连接,和告知所发送的SYN包中的ISN信息。第二步,HostB获知A已开始连接后,同样启动一个Raw Socket,构建一个目的为Ra的模拟SYN包,设置一个随机的ISN值c,和同样设置为Low_TTL进行对外发送。同理,此时Rb亦会建立一条映射记录。第三步,HostB建立一个SocketB,不需要修改TTL,立即进行侦听(Listen)。B使参考A发送的SYN包,用Raw Socket构建一个模拟SYN(a/0)包进行发送,发送后即可关闭Raw Socket。SocketB接收到该包,会以为是从A发送过来的的SYN包,则会立即以Ra为目的地对外发送一个SYN/ACK( b / a+1)包。由于这个SYN/ACK包拥有正常的TTL值,可以通过互联网传送至Ra。第四步,由于之前Ra已建立了映射,并在等待第二次握手,从B发送过来的SYN/ACK包则可以通过Ra送至HostA。HostA接受到该包后,会执行第三次握手,SocketA随即会发送一个ACK包( a+1 / b+1),此时HostA三次握手完成并返回连接成功。但由于之前SocketA已设置为Low TTL,这个ACK包可以通过Ra发送至互联网,但不能到达Rb和HostB。而且在SocketA开始连接至握手完成期间,我们是没办法去重新设置它的TTL值的。所以我们会使用Raw Socket重新模拟一个同样的ACK包,修改其为正常TTL值,进行重新发送。由于此时Ra已完成握手过程,Ra会把这个ACK包当作是通讯数据,当然可以通过并发送至Rb。Rb会转发该ACK包至内网HostB,同时完成三次握手过程,HostB接收到该ACK包后,亦完成握手过程,SocketB返回“有连接”状态,可以进行Accept等操作。另外,A端亦需设置SocketA为正常的TTL值,使可以正常发送通信数据。以上是从HostA主动发起对HostB的连接过程,如果B端想主动发起对A端的连接,亦可按照同理的方式进行。这种方式对Rb来说需要一个前提条件。我们列出Rb的三次握手的数据包:SYN(c / 0) | SYN/ACK( b+1 / a+1) | ACK( a+1 / b+1 )。对比之前所提到的标准TCP三次握手,其中Rb通过一个SYN包后,又通过一个SYN/ACK包,这个需要Rb的支持(P4,条件四:路由器通过一个SYN包后,可以允许SYN/ACK包继续发送)。5、 评估为了评估我们的打洞方式,我们在实验室测试时使用了12种不同类型的路由器(见表1)。其中10种为家用或办公室用普通路由器,另外2种为软路由,安装在PC电脑上。在公网上放置了一个第三方服务器,A、B端使用UDP方式通过第三方服务器建立一个通道。我们在使用前都将NAT路由器复位为出厂设置,没有修改路由器的任何其他配置除了子网IP及拨号设置。在测试中我们发现,有些NAT路由器转发内网的数据包时,没有对TTL值进行减一操作。但这个不重要,我们只需要确定一个合适的TTL值,使SYN既可通过所有内网路由器而又不到达目标路由器。在IP包检测和发送模拟IP包方面,我们使用了WinPcap来代替Winsock的Raw Socket,因为Raw Socket在很多Windows系统,包括WindowsXP等,是不能实现发送自定义IP包的。测试中我们使用了WindowsXP SP3和Windows 7操作系统,但我们发现在Linux下测试SYNI方式也完全没有问题。有三个型号的路由器(pfSense,Netgear RP613,华硕RX3041),我们无法通过第三方路由器正确判断它数据包转换后的端口,此类型一般称之为Symmetric NAT路由器。有一些文章介绍了通过进行多次连接来预测分析Endpoint端口的方法,但这个不属于本文讨论范围,我们直接忽略这3种类型,而只测试其他9种类型。每两个类型都作为一组进行一次测试,一共是9*8=72次测试。每次测试都进行以下4个步骤:1) 复位路由器为出厂设置;2) 通过第三方服务器获得双方的EndPoint;3) 在两端运行SYNI;4) 显示连接成功后双方互发一些通讯数据来证明实际连接成功与否。测试结果是在72种组合中有56个组合是成功的,成功率为78%,如果包括之前忽略的三个型号,则成功率为56/(12*11)=42%。通过网络检测分析,我们能确定那些成功的测试都是符合我们的预期的,失败的16种都显示结果是“连接超时”。我们具体分析了每次测试的情况。其中IPCop路由器作为B端(Listen端)时,在发送SYN包后,不允许之后的SYN/ACK包继续向外发送;FBR-1415TX作为B端时,可以在SYN包后接着允许SYN/ACK通过,但不允许ACK包从外网进入,因而也不能连接成功。但只要不是两端同时使用这种类型的路由器,把他们作为A端(Connect端)时,是可以连接成功的。在更多的测试中我们发现,当FBR-1415TX、FRITZ!Box 7140用作B端,省略SYNI第二步,即不发送模拟SYN时,却可以成功连接。但如果所有测试都用这种方式,其他已经使用SYNI测试成功的路由器的其中两种Netgear FM114P、Netgear FVS318和W701V又会变成打洞不成功,这样反而会降低了成功率。而我们提出的是一种通用的打洞模式,不会针对某一种路由器使用特别的方式。我们还发现一些路由器拥有一些特性可以一些特别的方式进行打洞,例如,Digitus DN-11004-O在发送SYN后,不允许SYN进入,但允许RST进入,然后接着允许SYN进入。返回一个RST本来是一个错误信息,但这个类型路由器只复位了连接,而没有删除已有的映射。因此,根据这些特性,可以通过更深入的测试来发展一些其他的打洞方式。此外我们在通讯双方属于不同互联网营运商、不同带宽下进行测试,结果显示SYNI能完全正常工作。6、 与其他打洞方式比较这一节我们会介绍一些其他的TCP打洞方式,和与SYNI方式进行比较。NAT穿越也有UDP打洞的方式,但我们的目标是TCP打洞,这里就不进入讨论。所有TCP打洞方式都需要部署第三方服务器获得双方的公网IP,和建立一个信息通道。我们在表2里统计了各种方式下所需的先决条件。方式A:NUTSS图二:NUTSSGuha et al. 提出的两种叫做NUTSS的TCP打洞机制。第一种方式,见图二(a),它使用了叫做STUNT服务器的第三方服务器,可以用来发送欺骗IP包。通讯双方都是以Connect的形式向对方发起连接,通过Raw Socket检测到发出的SYN包中的ISN信息(需要满足条件P1),并将ISN值发送到STUNT服务器,这里同样需要两端路由器不修改SYN包的ISN值(需满足条件P2),否则这种方法也会打洞失败。两端主机都以低TTL值发送SYN包,保证通过本端的路由器而又不到达对方路由器,避免返回RST和建立映射。此外,双方路由器都会收到ICMP不可到达信息,NUTSS(a)需要这些信息不会破坏已建立的映射(需满足条件P3)。当STUNT服务器收到了双方的ISN信息,立即构建两个相应的SYN/ACK欺骗包分别返回给两端,让两端以为都是对方的回应包,这里也要符合条件(P5),这个可能在一些营运网络中的出口过滤中是被限制的,如果STUNT服务器所处的是这样的网络,NUTSS也不能用。这种可能是理论上最好的TCP打洞方式,因为它完全符合TCP三次握手的所有细节,主要的缺点是需要一个可外送欺骗包,和响应等各方面性能较好的第三方STUNT服务器。NUTSS还包括另外一种TCP打洞方案,见图二(b),它不需要发送欺骗IP包,即不需要使用STUNT服务器。A端创建一个Socket并设置为Low_TTL进行Connect,即发送一个低TTL值SYN包,这里需符合条件(P3,不受ICMP超时信息影响。其实这里还需要一个条件,就是在一些系统中可能不能修改TTL),发送完后立即关闭该Socket,并又立即重新创建正常TTL值的Socket,在与之前相同的本机端口(Port)进行Listen监听。这里需要符合一个新的条件是,系统不会在关闭Connect中的连接时发送一个RST(P6),不过使用Winsock是不存在这个问题的。在B端,HostB不需要使用公共通道等待来自A的通知,只需简单建立一个正常的Socket使用Connect方法,对A端进行连接。这种方法需要A端NAT路由器在发送SYN建立映射,立即允许外来的连接(条件P8,SYN out,SYN in),但对B端路由器则无要求。这种方式非常适合单向发起的连接,例如想从家庭端(A端)连接办公端(B端),则只需在家庭路由器单方实施打洞,等待来自办公电脑的反向连接即可,远程办公通道Rdesk1.0就是使用这种方法。不过这种打洞方式需要A端(家庭端)的NAT路由器提供更多的支持,好的一面是目前流行的家用路由器都支持这种方式。方式B:P2PNAT图三:P2PNAT和NATBLASTERFord et al. 提出的一种基于“TCP同时打开”的NAT穿越机制,见图三(a)。双方都创建一个Socket在各自某个本机端口监听,同时又创建另一个Socket绑定在与监听Socket所用的相同端口,进行Connect连接对方。通常,一个端口只会被一个Socket占用进行接受和发送,多个端口如果需要绑定在相同的端口,需要系统支持设置SO_REUSEADDR参数(条件P7)。双反发起的连接必须是某种程度上同时的,即令到在对方的SYN包还没到达己方的路由器之前,己方就已送出SYN包,在己方的路由器建立映射
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2465-2026天然气在线硫化氢气体检测仪校准规范
- T/SSBME 2-2025家用LED紫外治疗设备
- T/SATA 081-2024食品中二氧化硫残留量的测定 间断化学分析法
- T/CSWSL 044-2025猪舍吊装轨道巡检机器人
- T/CI 080-2023富有机硒脐橙生产技术规程
- T/CSPSTC 185-2025深埋地下管道数字化综合探测技术规程
- T/SSX 012-2024发酵人参粉
- 2025-2026学年辽宁省营口市初中数学九年级期末上册高分快速提分卷详细参考解析
- Photoshop CS2 试题及详细参考答案
- 2025-2026学年四川省广元市初中数学八年级期末下册点睛提升黑金试题(附答案)
- 2026年学校德育体系实施方案-五维融通,三阶递进
- 山东省菏泽市菏泽经济技术开发区2026-2027学年七年级上学期10月阶段检测语文试题(含答案)
- 2026年广东省公需课《加快培育发展新质生产力》考试答案
- 2026年农田废弃物的资源化利用路径
- 2026年公路水运工程助理试验检测师练习题附答案
- 2026年成人高考专升本政治真题试卷及完整答案解析(官方标准)
- 检验检测机构法律法规政策培训测试题及答案
- 中远海运集团招聘笔试题目及答案
- 2026中国电信历年考试笔试题库及答案
- 2026年吉林大学中日联谊医院专业技术系列人员招聘笔试参考题库及答案详解
- 护理副高职称评审答辩自我介绍模板
评论
0/150
提交评论