内网ip打洞-----p2p实现原理

gccbuaa gccbuaa     2022-09-10     334

关键词:

网上找了非常多。代码大堆,原理讲清楚透彻的不多。

本人找几篇讲得好的来整理一下。

一片技术文章,最基本的讲清楚原理。假设再有完整的能执行的源码也可,关键是要把核心部分代码分析清楚。

(1)问题的由来:

大部分的电脑上网都是用动态ip地址。内网的ip是由net(路由、网关)分配的。net发出去的时候。映射到一个公网地址。这是一个动态计算的过程(特别是port号),因此称为动态ip地址。外部网是无法直接訪问内网计算机的,但在大部分情况下,借助一台有公网ip地址电脑(这里叫server),通过某种方式,能够实现连接,这样的技术较“打洞”。

(2)动态ip详细分析:

 

如图:

有一个私有网络192.168.0.2。client a是当中的一台计算机。这个网络的网关natA(一个nat设备)的外网ip是202.103.142.29(应该另一个内网的ip地址,比方10.0.0.10)。假设client a中的某个进程(这个进程创建了一个socket,这个socket绑定1234port)想訪问外网主机129.208.12.38的2000port。那么当数据包通过nat时会发生什么事情呢?

先nat会改变这个数据包的原ip地址,改为202.103.142.29。接着nat会为这个传输创建一个session(session是一个抽象的概念,假设是tcp,或许session是由一个syn包開始。以一个fin包结束。而udp呢,以这个ip的这个port的第一个udp開始。结束不确定,或许是几分钟。或许是几小时,这要看详细的实现了)而且给这个session分配一个port,比方62000,然后改变这个数据包的源port为62000。

所以本来是

                                  (192.168.0.2:1234->129.208.12.38:2000)

的数据包到了互联网上变为了

                                   (202.103.142.29:62000->129.208.12.38:2000)。

一旦nat创建了一个session后,nat会记住62000port相应的是192.168.0.2的1234port,以后从129.208.12.38发送到62000port的数据会被nat自己主动的转发到192.168.0.2上。(注意:这里是说129.208.12.38发送到62000port的数据会被转发,其它的ip发送到这个port的数据将被nat抛弃,这就是真正头痛的问题)这样client a就与server s1建立以了一个连接。

假设client a的原来那个socket(绑定了1234port的那个udp socket)又接着向另外一个服务器server s2发送了一个udp包,那么这个udp包在通过nat时会怎么样呢?

答案是net决定的,不同的net有不同的答案。

这里须要介绍一下NAT的类型:
NAT设备的类型对于TCP穿越NAT,有着十分重要的影响,依据port映射方式,NAT可分为例如以下4类,前3种NAT类型可统称为cone类型。
(1)全克隆( Full Cone) : NAT把全部来自同样内部IP地址和port的请求映射到同样的外部IP地址和port。不论什么一个外部主机均可通过该映射发送IP包到该内部主机。
(2)限制性克隆(Restricted Cone) : NAT把全部来自同样内部IP地址和port的请求映射到同样的外部IP地址和port。可是,仅仅有当内部主机先给IP地址为X的外部主机发送IP包,该外部主机才干向该内部主机发送IP包。
(3)port限制性克隆( Port Restricted Cone) :port限制性克隆与限制性克隆类似,仅仅是多了port号的限制,即仅仅有内部主机先向IP地址为X,port号为P的外部主机发送1个IP包,该外部主机才可以把源port号为P的IP包发送给该内部主机。


(4)对称式NAT ( Symmetric NAT) :这样的类型的NAT与上述3种类型的不同,在于当同一内部主机使用同样的port与不同地址的外部主机进行通信时, NAT对该内部主机的映射会有所不同。

对称式NAT不保证全部会话中的私有地址和公开IP之间绑定的一致性。相反,它为每一个新的会话分配一个新的port号。

第一种最为理想,基本就是无需打洞;

第四种最糟糕。根本就不能打洞。好消息就是这样的net基本没有,非常少。

所以关键是第二和第三种net类型。

因此打洞的本质就是利用net的特性“仅仅有当内部主机先给IP地址为X的外部主机发送IP包,该外部主机才干向该内部主机发送IP包

(3)实现步骤(各个实现可能都不一样)

我们先如果一下:有一个serverS在公网上有一个IP,两个私网分别由NAT-A和NAT-B连接到公网,NAT-A后面有一台clientA。NAT-B 后面有一台clientB,如今。我们须要借助S将A和B建立直接的TCP连接,即由B向A打一个洞。让A能够沿这个洞直接连接到B主机。就好像NAT-B不存在一样。
实现步骤例如以下:
1、 S启动两个网络侦听,一个叫【主连接】侦听。一个叫【协助打洞】的侦听。
2、 A和B分别与S的【主连接】保持联系。
3、 当A须要和B建立直接的TCP连接时,首先连接S的【协助打洞】port。并发送协助连接申请。

同一时候在该port号上启动侦听(保证net类型3也能成功)

注意因为要在同样的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即同意重用),否则侦听会失败。
4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B。并将A经过NAT-A转换后的公网IP地址和port等信息告诉B。


5、 B收到S的连接通知后首先与S的【协助打洞】port连接。随便发送一些数据后马上断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和port号。
6、 B尝试与A的经过NAT-A转换后的公网IP地址和port进行connect(这就是所谓“打洞”),依据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接(比如我用的TPLink R402),大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和port号,为接下来真正的连接做好了准备,这就是所谓的打洞。即B向A打了一个洞,下次A就能直接连接到B刚才使用的port号了。
7、 clientB打洞的同一时候在同样的port上启动侦听。

B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和port号告诉给A。
8、 A收到S回复的B的公网IP和port号等信息以后。開始连接到B公网IP和port号,因为在步骤6中B以前尝试连接过A的公网IP地址和port,NAT-A纪录 了此次连接的信息。所以当A主动连接B时。NAT-B会觉得是合法的SYN数据,并同意通过,从而直接的TCP连接建立起来了。

(4)让内网主机做server

以上的应用主要在于做p2p软件。假设我们想用家里的电脑,做server,是不须要这项技术(“打洞”)的,应为我们能够把路由器设置为net1型。能够直接设置port映射:

但还是须要一个外网固定ip的server来负责通知其它客服端。由于拨号时得到的ip(这事实上也是外网ip,就是其它的计算机能够直接訪问你的)每次还是变化的。

(5)花生壳是什么

花生壳是能够把这个变化的ip映射为固定域名的域名服务商,假设不须要域名服务,仅仅要用ip訪问就可以的应用(比方数据库),是用不上这个软件的。

可是另一种办法,假设你已经有一台有静态ip的server,在上面部署一个代理server(比方nginx),然后把这个动态的ip通知它就能够了。

tcp打洞和udp打洞

...CP不可能打洞?还是TCP打洞难于实现?假设现在有内网客户端A和内网客户端B,有公网服务端S。如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。A发送数据包到公网S,B发送数据包到公网S,则S... 查看详情

p2p技术详解:p2p中的nat穿越(打洞)方案详解

...P2P情景1:两客户端位于同一NAT设备后面(即相同内网中)3.3、典型P2P情景2:两客户端位于不同的NAT设备后面(分属不同的内网)3.4、典型P2P情景3:两客户端位于两层(或多层)NAT设备之后(分属不同... 查看详情

p2p技术详解:p2p中的nat穿越(打洞)方案详解

...P2P情景1:两客户端位于同一NAT设备后面(即相同内网中)3.3、典型P2P情景2:两客户端位于不同的NAT设备后面(分属不同的内网)3.4、典型P2P情景3:两客户端位于两层(或多层)NAT设备之后(分属不同... 查看详情

frp内网穿透

参考技术A内网穿透即内网映射,可以将局域网变公网,从而可以让外网访问本地局域网内的服务。内网穿透原理技术有这么几种:1,通过公网服务器转发,这是目前市场上大多三方的内网穿透服务方式。2,P2P穿透,端对端连接... 查看详情

tcp打洞与udp打洞的差别

...能打洞?还是TCP打洞难于实现?   如果如今有内网clientA和内网clientB。有公网服务端S。   如果A和B想要进行UDP通信,则必须穿透两方的NAT路由。如果为NAT-A和NAT-B。       查看详情

p2p技术详解:p2p中的nat穿越(打洞)方案详解(进阶分析篇)(代码片段)

...:中间件技术5.1、原理5.2、限制6、NAT穿越技术3:打洞技术(HolePunching)6.1、原理6.2、方法6.2.1NAT行为类型与侦测方法6.2.2NAT打洞过程7、NAT穿越技术4&#x 查看详情

p2p通信原理及实现(转)

...些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立。  当今部署的中间件大多都... 查看详情

p2p通信原理与实现(代码片段)

...些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立。目前部署的中间件多都是在C/S... 查看详情

p2p通信原理与实现(02)(代码片段)

...一些中间件(MiddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立.目前部署的中间件多都是在C/S架构上... 查看详情

p2p通讯原理

...些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立。  当今部署的中间件大多都... 查看详情

p2p穿透nat的原理

...接了N多个设备,每个设备都分配到了一个私有的地址(内网地址),这些地址可以通过这个路由器和外网交互(并非是代理的中继方式)。1.基本NAT:这种NAT下的私有IP只有少部分(并不是全部)可以和外网通讯。每次这些私有... 查看详情

p2p技术详解:p2p中的nat穿越(打洞)方案详解(进阶分析篇)(代码片段)

...:中间件技术5.1、原理5.2、限制6、NAT穿越技术3:打洞技术(HolePunching)6.1、原理6.2、方法6.2.1NAT行为类型与侦测方法6.2.2NAT打洞过程7、NAT穿越技术4:Relay服务器中转技术7.1、UDP协议的Relay7.1.1方式一、SendandDatamethods,... 查看详情

p2p技术详解:p2p中的nat穿越(打洞)方案详解(进阶分析篇)(代码片段)

...:中间件技术5.1、原理5.2、限制6、NAT穿越技术3:打洞技术(HolePunching)6.1、原理6.2、方法6.2.1NAT行为类型与侦测方法6.2.2NAT打洞过程7、NAT穿越技术4:Relay服务器中转技术7.1、UDP协议的Relay7.1.1方式一、SendandDatamethods,... 查看详情

udp方式实现广域网的p2p通信

...行客户端与服务器端通信,使用UDP协议进行客户端之间的打洞操作,UDP的方式的源码在下方。一直没有实现TCP的打洞,如果有实现的,希望分享一下经验,谢谢。源码下载 查看详情

uac实现原理及绕过方法-打洞专用(代码片段)

首页新随笔订阅管理随笔-7  文章-0  评论-0 目录0x01UAC实现方法(用户登陆过程)0x02UAC架构0x03触发UAC0x04UAC虚拟化0x05UAC逆向分析1x01无文件白名单提权机制1x02DLL文件注入提权1x030day[TOC]0x00UAC工作流程UAC是微软在Win... 查看详情

p2p中的nat穿越(打洞)方案详解

 1、内容概述P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图“P2P结构模型”所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信、实时文件传输... 查看详情

p2p中的nat穿越(打洞)方案详解

 1、内容概述P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图“P2P结构模型”所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信、实时文件传输... 查看详情

udp打洞原理

源:UDP打洞原理 查看详情