基于Qt的NAT检测和NAT穿透

基于Qt的NAT检测和NAT穿透

摘要 
网络上的NAT设备主要解决IPV4地址的缺乏,但同时也给端到端的连接带来不便。
目前,对于UDPNAT穿透已经有一些通用的,有	效的解决方法,基于这些方法实现简单NAT检测和穿透

关键词 NAT穿透,P2P,对等网络,Qt
中图法分类号TP311
NAT Detection and NAT Penetration Based on Qt
Yuhang Tang
Abstract NAT devices on the network mainly solve the shortage of IPV4 address, but also bring inconvenience to end-to-end connection. At present, there are some general and effective solutions for UDPNAT penetration. Based on these methods, simple NAT detection and penetration can be realized.
Keywords NAT Penetration, P2P, Peer-to-Peer Network, Qt

1 研究现状及分析

1.1 NAT 技术发展现状

在因特网最初的设计中,每个节点有一个唯一的 IP 地址来表明这个节点的位置和特性。该节点可以使用这个 IP 地址进行通信。但是,由于新技术的发展,已经有其他新的地址方案来取代该地址方案。在新的地址体系中,整个地址域是由部分的公网地址和通过 NAT 技术获得公网地址之后,内网中大量的内网地址一起组成[1-2]。
在这种新的地址实现方案中,只有拥有公网地址的节点才可以直接在网络中使用该地址与任何节点通信,因为这个节点的公网地址是唯一的并且是可路由的地址。而在内网中的节点可以和同一个内网中的其它节点通信,也可以向公网中的终端节点主动发起连接。
NAT 的功能就是为从内网终端向公网中的终端节点主动发起连接时,将来自内网终端节点的数据包的 IP 和端口映射为该 NAT 设备在公网中的的 IP 和端口,同时也可以把来自公网的数据包中的 IP 和端口映射成内网 IP 和端口,在这个过程中 NAT 会丢弃来自公网中的未知终端节点主动发起连接的数据包。 早在 20 世纪 90 年代,就有人提出了 NAT 技术的概念。最早提出 NAT 技术的目的是用来解决 IP 地址枯竭的问题。规范 RFC1918 第一次描述了 NAT 技术的优势,当然 NAT 技术还有很多其他的优势,其中最重要的是,NAT 技术在内网的终端节点和外网的终端节点进行通信的过程中加入了中间层[3]。
这个中间层使 NAT 有如下特点:
(1)NAT 技术可以独自应用,可以单方面部署,增加一个内网不影响公网,使用时无须和任何人协商。
(2)无须批准,采用 NAT 技术后,在局域网内部,可以使用大量私有地址,而且只需要一个地址与外网连接。这对于有大量内部通信而又较少有外部通信的应用场景,如公司、学校、机构等,可以大大降低布网成本,提高效率。
(3)方便变更,如果需要改变网络服务商时,只要改变网关设备的 IP 地址,而无须对内部网络的每一个终端设备重新分配 IP 地址。
(4)可以实现多宿(Multihoming)。多宿指的是一个 NAT 设备连接到多个网络务商,同时有多个 IP地址,使用不同服务商提供的服务。因此,内网中的网络终端就不需要知道自己具体连接了哪个服务商的网络,扩展或者迁移时不需要对每个终端节点的配置进行修改,同时网络服务商也不需要为每个网络终端设备分配一个 ip 地址,大大提高了网络的扩展性。
(5)安全性,采用 NAT 技术意味着内网多了一层保护,因为外网的终端向内网中的终端发起连接都会被 NAT 组织,因此外网的终端也很难猜到内网的终端数量和拓扑结构,并且可以很好的防止内网的终端遭到外网终端的攻击。 随着 NAT 技术的发展和应用的推广,NAT 技术已经非常成熟。近几年来又有一系列关于 NAT 技术的标准被制定和应用,这些都使 NAT 技术越来越成为业界公认的技术[4]。目前几乎绝大部分的网络设备制造商生产的路由器或者其他同类型的网络设备,都具备 NAT 的功能。人们更多地用 NAT 技术来隔离局域网和外网,用来保证局域网内部的安全。更重要的是,利用 NAT 技术不需要采购专门的设备,可以仅利用现有设备,加以改造,就可以大幅度提高内网的安全性。因此,NAT 技术受到广大公司机构的欢迎,目前网络中也存在大量的使用 NAT技术的设备。

2基于NAT穿越技术的P2P通信方案

2.1 反向连接技术

如图 1 所示,如果通信双方只有一方设置了 NAT 时,则可以采用反向连接技术实现P2P通信。图中Client A(拥有私有 IP地址 10.0.0.1)在 NAT 后,以 TCP 端口 1234 为切入点,直接连接到Medi-Server S(拥有公网IP地址18.181.0.31)的TCP端口1235中,这样 NAT A(拥有公网 IP 地址 155.99.25.11)为了能够匹配TCP端口的62000。而Client B(拥有公网IP地址138.76.29.7)通多端口中的1234连接到Medi-Server S的TCP端口1235上。这样A、B两点就可在S上个获得堆放的公网,其[IP 地址: 端口]对应为[138.76.29.7:1234]和[155.99.25.11:62000],实现在本地端口即可侦听,从而获取相应的信息。图1 反向连接技术网络结构
该设定中,由于端口B中有公网IP,因此A要向B发送通信请求,则可以通过 TCP 直接连接到 B[138.76.29.7:1234]。而如果 B 想要通过 TCP 连接到 A[155.99.25.11:62000],则会连接失败,这是因为在 A 连接到了 NAT,即使是 B 发送了 TCP SYN 请求到达端口62000,但是NAT A会直接将此通信请求拒绝,当作是公网 IP 处理。想要实现 B→A 的通信方案,需要 B 在 Medi-Server S 上给 A 发送连接请求,再反过来让 A 连接到 B,这样即可实现A、B的TCP连接。
2.2 UDP打洞技术
反向连接技术虽然在实际应用中具有局限性,并且需要多项请求,但是以中间服务器作为媒介实现P2P通信的思想却是打洞技术实现的基础。该项技术能够让通信双方在中间服务器中构建一个可以点对点的UDP,从而实现P2P通信。由于个人主机的网络环境存在多种情况,最为普遍的就是双方都在不同NAT后,而打洞技术可以很好地实现NAT穿越。如图 2,Client A 位于在 NAT A 后,Client B 在 NAT B 后,在 A、B共同向 S 发送了 UDP 通信请求后,NAT A 为 A 和 S 间通信匹配出了 UDP 端口 62000,NAT B 为 B 和 S 之间匹配到了 UDP 端口31000,此时的 A、B 共同在 S 上获得了对方的公网,其[IP 地址:端口] 分别对应[138.76.29.7:31000]和[155.99.25.11:62000]。
基于Qt的NAT检测和NAT穿透_第1张图片

图2.2-1 打洞技术网络图
结合 NAT 特点,其不允许外网主机访问内网主机,所以实现通信的前提条件是:此消息[IP 地址 : 端口]对于某个先前通过NAT内部发起的通信目的[IP地址 : 端口]相匹配。从而实现A→B的对点对通信。
如果A简单地向B发送消息,由于NAT B中内部向外发送通信只是B和S间的通信,所以通信连接的目的[IP地址 : 端口]是 [18.181.0.31: 1234],NAT B 所 接 受 到 的 消 息 端 口 为[155.99.25.11:62000],所以[IP 地址 : 端口]不匹配,这时 NAT B就会自动摒弃这一消息。
想要实现A、B无阻通信,需要事先构建和B点对点的UDP通信,A向B第一发送消息时[138.76.29.7:31000],会以S为平台转发通信请求,让 B 向 A[155.99.25.11:62000]发送消息(打洞消息),这时会在NAT B上留下标志信息[155.99.25.11:62000](洞,发送信息过程的打洞过程),之后即可将[155.99.25.11:62000]消息传输到 NAT 内部,因此在 A 第二次向 B 发送消息时,即可直
接 将 消 息 传 输 到 NAT B 内 部 。 这 是 因 为 第 一 次 向 B[138.76.29.7: 31000] 发 送 消 息 过 程 中 ,NAT A 已 经 在 B[138.76.29.7: 31000] 中 预 留 下 了“ 洞 ”,因 此 从 B→A 发 送[155.99.25.11:62000]打洞消息后会直接进入到 NAT A 内,所以在以后的 A、B 消息传输即可采用 P2P 网络,而不需要借助 Me⁃di-Server S平台。3.3 P2P通信方案通信双方A和B在不了解对方网络环境的情况下,如IP可能位于一级NAT后,也可能位于多级NAT后,如果网络环境不明确就无法实现P2P通信,这就需要考虑在此条件下如何实现P2P通信。首先,A在NAT后,B也在NAT后时,则A可以利用打洞技术向 B 发送 UDP 通信请求即可实现二者的通信;其次,A 在NAT后,B拥有公网IP时,则可以采用TCP直接与B通信,也可以采用UDP通信;再次,A、B都拥有公网IP,此时A可以向TCP连接B,也可以同UDP连接;最后,A拥有公网、B在NAT后。A可以采用反向连接方法构建与B之间的TCP连接,也可以利用打洞技术和B构建娘UDP通信实现P2P连接。
在实际实现过程中,借助Socket 网络编程实现了P2P通信系统,主要是由 P2P Client 和 P2P Medi-Server 组成。在系统中采用了以上方案,并通过 VMware Workstation 软件模拟 NAT 多级网络环境,进行网络环境测试,对其中所出现的Cone NAT都保持了良好的通信状态。其中,要考虑到打洞消息在网络中可能出现堵塞或丢包等情况,因此在打洞过程中要间隔发送一定数量的打洞消息,直到打洞出现结果(成功或失败)。如图3所示,是 P2P 通信系统中 Medi-Server 的通信记录,B 和 A 先后登录到 Medi-Server 中,由于 A 和 B 都在 NAT 后,所以在 A 向 B 发送通信请求时,即可通过 Medi-Server 发送打洞请求,让 B 向 A公网 [IP 地址 : 端口 ] 发打洞消息进行打洞。图3 P2P即时通信系统中Medi-Server通信记录

NAT从实现方式上分为了三种技术类型,其中包括了静态地址转换、动态地址转换和网络端口地址转换。作为转换最简单的静态NAT,它将私网地址与公网合法地址进行了一对一的固定映射,所有内网主机都被永远映射成可被外网访问的IP地址[6]

3.实验

3.1开启服务器上NAT检测服务程序

基于Qt的NAT检测和NAT穿透_第2张图片

图3.1-1
基于Qt的NAT检测和NAT穿透_第3张图片

图3.1-2

通过Qt的QUdpSocket进行网络编程,在.pro文件中添加QT+=network[5]

3.2 开启NAT检测客户端

基于Qt的NAT检测和NAT穿透_第4张图片
图3.2-1
基于Qt的NAT检测和NAT穿透_第5张图片
图3.2-2
如图所示开启客户端
点击第一步(step1)开始第一个检测点

3.2.1 NAT检测第一步:检测客户端是否可以做P2P和是否在NAT之后

实际设备:在复杂的校园网中,分别在移动,联通,电信测试
first step:check the client’s NAT if can do P2P and if is located before the NAT?
客户端机(校园网)内网IP:192.168.1.100,PORT:8001向服务器(腾讯云)IP: 132.232.214.178,PORT:8000发送数据包
基于Qt的NAT检测和NAT穿透_第6张图片

图3.2.1-1
基于Qt的NAT检测和NAT穿透_第7张图片

图3.2.1-2
如图所示NAT检测的第一步可以接受到服务器发送的数据包,客户端向NAT检测服务器发送数据包次数为20次,20次后停止。可以看出现在本地地址为192.168.80.222,端口:8001,公网地址为202.115.82.27,公网端口为49419,客户端可以收到数据包,
服务器程序也接受到客户端的请求,继续第二步检测,否则无法进行P2P

3.2.2 第二步:检测客户端是否为完全锥形(Full Cone NAT)?
seccond step:check the client’s NAT if is Full Cone NAT?
点击客户端的step2,进行第二步检测
基于Qt的NAT检测和NAT穿透_第8张图片

图3.2.2-1
基于Qt的NAT检测和NAT穿透_第9张图片

图3.2.2-2
如图3.2.2.1客户端向服务器连续20次发送数据包,服务器能接受客户端的数据包,在服务器上用B地址(IP: 132.232.64.228,PORT:8001)向客户端发送数据包,由于客户端不为Full Cone NAT,所以数据包被丢弃,反之为Full Cone NAT,可以进行P2P.
继续第三步

3.2.3第三步:检测客户端是否为对称NAT?

third step:check the client’s NAT if is Symmetric NAT?
点击客户端step3,进行第三步
基于Qt的NAT检测和NAT穿透_第10张图片

图3.2.3-1
基于Qt的NAT检测和NAT穿透_第11张图片

图3.2.3-2
如图3.2.3-1客服端向服务器发送数据包,服务器接受到数据包,比较IP和PORT发现端口没有任何规律,且PORT不相同,说明当前客户端为Symmetric NAT,在这种情况下无法采用P2P进行直接通信,如果相同,那么可以进行第四步检测

3.2.4第四步:检测客户端是限制锥型还是端口限制型?

fourth step:check the client’s NAT if is Restricted Cone NAT or if is Port Restricted Cone NAT?
点击客户端step4,进行第四步检测
基于Qt的NAT检测和NAT穿透_第12张图片

图3.2.4-1
基于Qt的NAT检测和NAT穿透_第13张图片

图3.2.4-2
可以看出当前无法接受数据包,因为该设备在第三步已经判断无法进行下一步,所以这一步没有任何反应,在其他类型的机器上,如电信可以成功打洞,其他类型无法成功打洞,所以在复杂的校园网环境下,P2P无法直接穿透广域网,必须借助其他方式,例如http遂道穿透,软交换是下一代网络中的核心技术,SIP 协议作为下一代网络最重要的协议之一,已经被广泛应用于 VoIP 系统
中。SIP 协议无法支持 SIP 信令和媒体流的 NAT 穿越,从而限制了其在广域网上的应用和发展。虽然目前解决 NAT 穿越的方案已经很多,但都存在着一定的局限性。文中详细解释了 NAT 对 SIP 通信的影响,介绍了 UDP 打洞技术的基本原理,
介绍了 UDP 打洞技术穿越锥形 NAT 的流程,以及 Http 代理网关方式穿越各种 NAT 的流程。文中通过比较各种 NAT 穿越方案的优缺点,提出一种综合 UDP 打洞与 Http 代理网关的 NAT 穿越方案。经过论证与实验,证明了该方案的可行性。[7]

4.NAT穿透

4.1在即时通讯上应用

UDP Hole Punching技术是目前在实际应用中利用STUN技术穿越NAT设备
的一种主要的技术[8-9]。

4.1.1登陆

图4.1-1
基于Qt的NAT检测和NAT穿透_第14张图片

图4.1-2
基于Qt的NAT检测和NAT穿透_第15张图片
基于Qt的NAT检测和NAT穿透_第16张图片

图4.1-3
如图4.1-1和4.1-2,4.1-3分别为服务器端和客户端A,B,服务器开启端口监听,客户端点击登陆于服务器握手,

4.1.2 通信

(1)在最初状态下,由于AB的都是内网地址,A不知道如何连接B,因此A
必须首先向服务器S请求协助,帮助A与B之间建立连接。A发送请求数据包给S,
NAT A为这次连接分配了一个端口号。服务器S收到A的请求并且可以获得A在外
网的IP和端口号。
(2)同样的,B也需要首先发送请求给S,同样的,S也可以获得B在外网上
的地址和端口号
(2)然后需要S将B的公网IP地址和端口号发给A,同时,S将A的公网IP地
址和端口号也发给B。这样,A与B就都互相知道了对方的公网IP地址和端口号。
(3)如果A想和B建立连接,那么A根据在S处获得B在外网的地址和端口号,
发送请求数据包。但是由于在NAT B处还没有生成与A的连接的映射,那么请求
将会被NATB丢弃。所以还需要在NAT B上“打洞”,建立映射关系,地址为A的
外网地址。这样AB才能建立连接。
(4)同样的,B也进行同样的操作,发送请求数据包给A,由于NATA上已
经建立了A和B的公网地址和端口号的映射关系,因此该请求可以顺利到达A
(5)在A收到从B发来的请求之后就可以和B进行通信,UDP打洞完成。
在这个过程中,由于AB互相向对方发送请求数据包的操作是异步的,数据
包到达的时间不会影响到打洞的效果,所以A和B发送的数据包到达对方的终端
节点的时间顺序对结果不会产生影响。
接下来,我们就具体来研究一下这如何协作进行UDP打洞的。根据NAT应用
场景的不同,我们可以分为三种应用场景来研究[10-11]:

  1. A和B都位于同一个NAT设备后面,也就是说位于同一个内网中;
  2. A和B分别位于两个不同的NAT设备后面,也就是说,分别属于不同的内
    网,这是实际应用中比较普遍的场景
    3.两个终端A和B分别位于两个两层NAT设备的后面,一般的来说,上层是由
    网络提供商提供的,下面那层的NAT设备则是自家的NAT设备。
    基于Qt的NAT检测和NAT穿透_第17张图片

图4.1.2-1
基于Qt的NAT检测和NAT穿透_第18张图片

图4.1.2-2
如图所示,P2P在通信方面也有很大的作用,这里我采用的是sTRUN,即客户端之间打不通,就才用服务器代发,保证消息100%发送成功

5.总结

NAT检测对于很多应用都有用处,比如即时通信,文件共享等等,通过这次实验对NAT穿透有了更深的印象,如何通过NAT穿透写了一个即时通信,分别在同一台设备,和不同设备,以及不同运营商等等,测试数据100%到达,当在NAT穿透方面做的不足,未来将采用http/sock5代理穿透的方式来减轻无法通过NAT穿透而给中转服务器带来的压力

参考文献
[1]李航,马林华.IP音视频穿越NAT技术的研究[J].通信技术, 2008,41(3):65-67, 87.DOI:10.3969/j.issn.1002-0802.2008.03.024.
[2]李正梅.NAT技术在计算机实验室中的运用[J].硅谷,2011,(9):191-191,145.DOI:10.3969/j.issn.1671-7597.2011.09.125.
[3]孔令旺.NAT技术及应用浅析[J].科技资讯,2011,(32):2626,56.DOI:10.3969/j.issn.1672-3791.2011.32.022.
[4]彭湘凯.NAT技术及其在网络安全中的应用[J].四川师范大学学报(自然科学版),2001,24(5):
542-545.DOI:10.3969/j.issn.1001-8395.2001.05.033.
[5][韩]金大臣,张红艳 TP311[M] 人民邮电出版社 2015-09-01 1-507
[6]马煜.NAT技术在校园网内部的分析与应用[J].科技创新与生产力,2017(01):52-53+58.
[7]周敏,余慕春,黄维丰.综合UDP打洞与Http代理的SIP穿越NAT方案[J].计算机技术与发展,2014,24(08):147-151+156.
[8]张建伟,蔡增玉,郭云飞等.基于UDP交换路由的NAT互联技术研究[J].计算机科学,2008,35(
9):119-122.DOI:10.3969/j.issn.1002-137X.2008.09.031.
[9]杨洋,冯小坤,杨光等.浅谈P2P的NAT穿越[J].科技信息,2011,(29):82,150.DOI:10.3969/j.issn.1001-9960.2011.29.057.
[10]范勇.对等网络中NAT穿越方案的研究与实现[D].南开大学,2009.DOI:10.7666/d.y1592106
[11]白伟华.NAT穿越在应用中的问题及解决方案[J].电脑开发与应用,2005,18(9):22-24.DOI:1
0.3969/j.issn.1003-5850.2005.09.017.

你可能感兴趣的:(qt,网络,c++,p2p)