美文网首页
P2P打洞--内网穿透

P2P打洞--内网穿透

作者: 鹏_921010 | 来源:发表于2021-10-08 16:51 被阅读0次

                                       去中心化技术与P2P框架的实现

关于去中心化的网络架构, 也是服务器架构范畴内必不可少的一部分。 本章讨论的内容,不涉及任何软件技术框架,也不涉及任何软件代码分析,注重把去中心化网络的原理分析清楚, 最后通过 Linux 系统编程实现网络穿透。 大家可以参照 github 代码。为了使本章更加容易描述, 现对五个概念做一个不严谨的非学术的定义。

1> 客户端: 用户直接操作的终端软件。

2> 节点: 对通信网络中机器的简称,包括客户端机器,服务器机器,路由器等等

3> P2P: 描述终端与终端直接通信的方式。

4> 网络穿透: 实现终端与终端直接通信的一种技术方案。

5> 去中心化网络: 包含终端,服务器,以及之间通信方式,一起组成的通信网络。

一、中心化网络与去中心化

为了更好的理解去中心化网络,先来理解传统的中心化网络拓扑图(图 a) 。不论

常用的 B/S 还是 C/S,都是一种星型结构,而中心化节点正是服务器, 每一个客户端只能与

服务器通信。如果客户端与客户端之间需要通信,必须要得通过服务器进行路由处理,才

能把数据路由到另一个客户端。 在通信过程中,服务器与客户端是充当着不同角色的,不

同功能的。 服务器是对所有客户端提供服务的, 这样的通信网络,被称为中心化网络。

在去中心化网络中,每个客户端都是平等的, 没有客户端与服务器之分, 客户端之间

互相提供服务,不存在“特殊” 身份。 客户端之间交互连接,每个客户端同时也对外提供

服务,同时也使用其他客户端的提供的服务。 在此种情形下,再被称为客户端不太妥了。

所以此时的客户端被称为节点。 这样没有中心服务器的网络, 被称为去中心化网络。 不仅

仅解除了中心化服务器绝对控制的风险, 也提高了网络传输效率,也去除了中心化服务器

数据路由的压力。

二、网络地址映射 NAT

在私网与外网通信的过程中, 私网与公网连接的边沿节点被称为路由器。 比如私网内部

网络为 192.168.1.0 的网络。 路由器的公网 IP 为 112.93.114.32, 服务器的公网 IP 地址为

120.93.24.180。 服务器发送数据与路由器公网 IP 时,能够将数据映射到私网中的机器;私

网内的机器发送数据给服务器,路由器也能够映射为公网 IP 地址的过程,成为网络地址映

射。

NAT (Network Address Translation, 网络地址映射)是将公网地址映射为私网地址。

而能够进行映射的网络装置被称为 NAT 路由器。

二(a)、NAT的原理

由于全球网络通信机器增加, IPv4 地址紧缺, 所以提出了 NAT 的理论, 通过公网 IP 地

址与端口映射到私网机器的 IP 地址与端口。 这样就能通过少量的公有 IP 地址能够代表较

多的私有 IP 地址,有助于减缓可用 IPv4 地址的耗尽。

私网内机器上操作系统中的一个网络进程, 与公网服务器 120.93.24.180 机器通信,

NAT 路由器为每一个网络进程分配一个网络 IP 地址与端口,用于与公网服务器通信。 与此

同时,公网服务器与私网内的网络进程通信,也是通过 NAT 路由器分配的网络 IP 地址与端

口进入私网到达网络进程。

二(b)、NAT的实现

NAT 的实现方案有三种, 静态转换,动态转换,端口地址映射。

静态转换(Static NAT): 私网 IP 地址转换为公网 IP 地址, 公网 IP 与私网 IP 地址通

过一对一的配置,配置后是不能更改的。通过静态转换, 实现对私网中的网络进程进行访问。

私网有多少私有地址需要与公网通信,需要配置与之对应的外网 IP 地址,并不节省公网 IP

地址,所以一般不用。

动态转换(Dynamic NAT): 为私网分配多个公网 IP 地址, 组成一个公网 IP 地址池。私

网内部地址需要转换时, NAT 路由器从公网 IP 地址池中取出一个 IP 地址,分配给私网机器

用于网络通信。 当私网机器数据传输结束后, NAT 路由器收回公网 IP 地址,返回 IP 地址池

中。 分配后的 IP 地址是不能再用于其他数据传输。 在公网 IP 地址数量略少于私网机器数量

的时候,可以采用动态转换。

端口地址映射(Port Address Translation, PAT): 改变私网内机器发送到公网数据

包的源端口并进行端口转换 (如图 5-6。 私网内部的所有主机均可共享一个公网 IP 地址,

实现对公网的访问, 从而能够最大限度的节省 IP 地址资源。 同时,有隐藏私网中的所有主

机,有效避免其他公网机器的攻击。 目前 NAT 路由器应用最广的就是端口地址映射。

三、NAT种类

从 NAT 的技术实现角度, 可以分为三种,静态转换(Static NAT),动态转换(Dynamic

NAT), 端口地址映射(Port Address Translation, PAT)。

从 NAT 的功能, 可以分为四种: 完全锥型 NAT(Full Cone NAT), 对称 NAT(Symmetric

NAT), IP 限制锥型 NAT(IP Restricted Cone NAT),端口限制锥形 NAT(Port Restricted

Cone NAT)。

三(a)、完全锥型NAT

完全锥型 NAT(Full Cone NAT),私网机器的网络进程(iAddr:iPort)被 NAT 路由器

映射为公网地址( pAddr:pPort),后续该网络进程的所有数据报文都被转换为公网地址

(pAddr:pPort),公网任何一台机器发送报文到(pAddr:pPort),会被转发到私网机器的网

络进程(iAddr:iPort)。如下图所示:

三(b)、对称NAT

对称 NAT(Symmetric NAT), NAT 路由器会为私网机器的每一个网络进程都会分配一个

地址与端口,从而把私网网络进程(iAddr1:iPort1) 与公网地址(pAddr1:pPort1)。后续

NAT 路由器会把私网机器地址端口(iAddr1:iPort1)与公网地址端口(pAddr1:pPort1)完

全相同的报文看作一个连接。如下图:

私网机器的网络进程每与一台公网机器通信, NAT 路由器都会重新分配一个地址端

口。 这样使得每一个通信链路都是经过 NAT 路由器不同的端口。 公网机器往私网发送报文

也是经过不一样的端口。

三(c)、IP限制锥型NAT

限制锥型 NAT(Restricted Cone NAT), 又名 IP 限制锥型 NAT。为了更好理解四种 NAT,

故本篇中一直称为 IP 限制锥型 NAT。限制锥型 NAT,只允许映射关系的对应公网 IP 地址机

器,传输数据到私网机器。其他的公网 IP 地址机器发送数据给 NAT 路由器的公网 IP 地址与

端口时, 则会被 NAT 路由器丢弃。如下图:

私网机器网络进程(192.168.1.3:2341)发送报文到公网地址(180.93.45.46:8080)的服

务器,在 NAT 路由器上产生了映射公网地址(112.93.114.33:34523)。 有以下两种情形分开

讨论

情形一: 私网机器网络进程没有发送报文给其他公网机器, NAT 路由器只允许公网 IP

地址为 180.93.45.46 的机器数据进入,其他地址机器的数据报文则会被 NAT 路由器阻挡,

不允许进入内网。

情形二: 私网机器网络进程同时发送报文给另一台公网机器,此时 NAT 路由器生成了

NAT 映射记录,则另一台公网机器发送报文与公网地址(112.93.114.33:34523), NAT 路由

器是允许报文进入私网。

先由私网机器发送报文到公网机器, 限制锥形 NAT 路由器方能允许公网机器报文进入

私网。

三(d)、端口限制型锥型NAT

端口限制锥形 NAT(Port Restricted Cone NAT), 在 IP 限制锥型 NAT 的基础上,又添

加了一层端口限制。 限制了发送报文进入私网的 IP 地址与端口。 如图 5-12 所示, 私网机器

(192.168.1.3:2341) 发送报文数据到公网机器(180.93.45.46:8080)的过程中,在 NAT 路

由器上产生了(112.93.114.33:34523) 记录。 有以下两种情形讨论。

情形一: 私网机器网络进程没有发送报文给公网机器(180.93.45.46)其他端口, 则 NAT

路由器只允许公网地址(180.93.45.46:8080)的数据报文进入私网。

情形二: 私网机器网络进程发送数据给公网机器(180.93.45.46)的其他端口, NAT 路由

器生成一条 NAT 记录, 则允许该端口的数据报文到达网络进程。

四、NAT鉴别方案

已经了解了四种 NAT 的功能, 本小节介绍四种 NAT 之间的逻辑关系,并且用计算机逻辑

流程实现判断 NAT 的方案。

完全锥型 NAT(Full Cone NAT),对称 NAT(Symmetric NAT), IP 限制锥型 NAT(IP

Restricted Cone NAT),端口限制锥形 NAT(Port Restricted Cone NAT)。 这四种 NAT 的

逻辑关系, 可以将 NAT 划分为一颗二叉树, 如图 5-13 所示。 NAT 分为两种对称 NAT 与锥型

NAT,锥型 NAT 分为两种限制锥型 NAT 与完全锥型 NAT。限制锥型 NAT 分为两种端口限制锥

型 NAT 与 IP 限制锥型 NAT。 叶子节点正好是划分出来的四种 NAT, 同级节点互补,合为整

集。

判别网关是属于哪种 NAT 的方案,就能参照下图所示,按照二叉树的层级逐层判断,

从而确定网关的 NAT 类型。 三次判断分别为对称 NAT 与锥型 NAT,限制锥型 NAT 与完全锥型

NAT,端口限制锥型 NAT 与 IP 限制锥型 NAT。

四(a)、对称NAT与锥型NAT

对称 NAT 与锥型 NAT 的区别, 在于私网机器与不同的公网机器通信在 NAT 路由器上产

生映射表记录的条数。 对称 NAT 与 N 台公网机器通信则生成 N 条记录;而锥形 NAT 与 N 台

公网机器通信则生成 1 条记录。

判断流程如下, 如图 5-14 所示:

步骤 1: 私网机器( 192.168.1.3:2341) 发送报文到服务器 1( 180.93.45.46:8888) 的 NAT

路由器产生了对外公网 IP( 112.93.114.33:23454),此时服务器 1 获取客户端 IP 地址即为

对外公网 IP( 112.93.114.33:23454)

步骤 2: 私网机器( 192.168.1.3:2341)发送报文到服务器 2( 118.56.189.34:8888)。 服务

器 2 获取客户端 IP 地址( iAddr:iPort)

步骤 3: 服务器 1 获取客户端的 IP 地址,发送给服务器 2。 服务器 2 对比服务器 1 发过来的

地址与服务器 2 获取的客户端 IP 地址。 若两个客户端 IP 地址一致,则为锥型 NAT;若不一

致则为对称 NAT。

四(b)、完全锥型NAT与限制锥型NAT

完全锥型 NAT 与限制锥形 NAT 的区别, 在于其他公网机器发送报文到 NAT 路由器对外

公网 IP 地址能否到达私网机器, NAT 路由器的 NAT 类型是完全锥型 NAT 的话,私网机器能

够收到报文数据,限制锥形 NAT 则不能收到报文数据。

判断流程如下, 如上图 所示:

步骤 1: 私网机器网络进程(192.168.1.3:2341)发送报文给服务器 1(180.93.45.46: 8888)。

服务器 1 获取到客户端 IP 地址(即 NAT 路由器对外公网 IP 地址)。

步骤 2: 服务器 1 将获取的客户端 IP 地址发送给服务器 2。

步骤 3: 服务器 2 收到客户端 IP 地址以后,发送报文给客户端 IP 地址。 探测客户端 IP 地

址能否收到报文数据。 若是完全锥型 NAT,则私网机器能够收到报文;若是限制锥形 NAT,

则私网不能收到报文数据。

步骤 4: 私网机器网络进程收到报文数据, 继续发送报文给服务器 1。服务器 1 收到了报文

数据。判断结束。 服务器 1 收到报文数据, 则为完全锥型 NAT;否则为限制锥型 NAT。

四(c)、IP限制型锥型NAT与端口限制型锥型NAT

IP 限制锥型 NAT 与端口限制锥型 NAT 的区别, 在于公网机器的其他端口发送报文数据

给私网机器网络进程能否收到。 网络进程能收到同一台公网机器的其他端口发送的报文数据

则为 IP 限制锥型 NAT,否则为端口限制锥型 NAT。

判断流程如下,如下图所示:

步骤 1: 私网机器网络进程(192.168.1.3:2341)发送报文给服务器(180.93.45.46: 8888)。

服务器获取到客户端 IP 地址。

步骤 2: 服务器从另一个端口(180.93.45.46:8888), 发送报文数据给客户端 IP 地址。若私

网机器能够收到报文则为 IP 限制锥型 NAT, 若不能则为端口限制锥型 NAT。

步骤 3: 私网机器网络进程回发报文给服务器 8888 的端口, 收到报文数据,判断结束。 若

收到数据则为 IP 限制锥形 NAT,否则为端口限制锥型 NAT。

四(d)、STUN协议

STUN 最早是在 RFC3489 中定义, (Simple Traversal of UDP Through NATs) ,即用 UDP

简单的穿透 NAT, 作为一个完整的 NAT 穿透解决方案。 在 RFC5389 中, 把 STUN 协议定义为

穿透 NAT 提供工具,而不是一个完整的解决方案。 STUN

(Session Traversal Utilities for

NAT, NAT 会话穿越应用程序)

是一种网络轻量级协议,它允许私网应用程序发现它们与公共互联网之间存在的 NAT 和防火墙及其他类型。 它也可以让应用程序确定 NAT 分配给它们的公网 IP 地址与端口, STUN 是一种 Client/Server 的协议,也是一种 Request/Response的协议, 默认端口3478。 本小节描述的 NAT 类型鉴别,是将 STUN 实现原理与细节,分析与展示出来。

五、网络穿透

网络穿透,即 NAT 穿透, 能够让公网机器找到私网机器,并提高下载速度。 如图 5-17

所示, 穿透图中两个网关路由器,从而报文数据能够直接到达私网机器。 穿透的本质是给一

个 NAT 路由器的公网 IP 地址与端口发送报文数据, 对应私网机器能够收到报文数据。 比如

图中 NAT1,私网机器(192.168.1.3:2341)发送报文到公网服务器(180.93.45.46:8888)

的过程中,在 NAT 路由器上产生了一条公网映射记录(112.93.14.56:43891)。后续其他外

网机器(192.168.2.6:6583)发送报文数据给公网映射记录(112.93.14.56:43891),使得

私网机器(192.168.1.3:2341)能够收到该报文数据。

a.穿透完全锥型NAT

穿透过程中,两端私网机器都是在 NAT 路由器之下的。 两端 NAT 只要有一方为完全锥型

NAT 的时候,是可以穿透的。 穿透逻辑如下图所示。 比如 NAT1 为完全锥形 NAT, NAT2 为

任意 NAT。

步骤 1: 私网机器 1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888)。 服务

器获取到私网机器 1 的公网 IP 地址与端口(112.93.14.56:43891)。

步骤 2: 服务器收到信息后,通知私网机器 2(192.168.2.6:6583), 通知信息内含私网机器

1 的公网 IP 地址与端口(112.93.14.56:43891)。

步骤 3: 私网机器 2(192.168.2.6:6583)发送数据给私网机器 1 的公网 IP 地址与端口

(112.93.14.56:43891),此时私网机器 1 就能收到私网机器 2 发送的报文数据,并且能过

获取私网机器 2 的公网 IP 地址与端口(iAddr:iPort)。

步骤 4: 私网机器 1 回发报文信息给私网机器 2 的公网 IP 地址与端口(iAddr:iPort),此

时私网机器 2 能够收到报文数据。 穿透流程结束。

b.穿透限制锥型NAT

限制锥型 NAT 的特点是限制了其他公网机器报文数据传输。 如果在采用完全锥型 NAT 的

穿透步骤,就会在步骤 3 不能到达私网机器。 针对于两端 NAT 都是限制锥形 NAT 的情况,穿

透流程如下图所示。

步骤 1: 私网机器 1(192.168.1.3:2341) 发送报文给服务器(180.93.45.46:8888),服务

器获取私网机器的公网 IP 地址(112.93.14.56:43891)。

步骤 2: 服务器发送通知报文给私网机器 2(192.168.2.6:6583), 通知报文中内含私网机器

1 的公网 IP 地址(112.93.14.56:43891)。

步骤 3: 私网机器 2 发送报文数据到私网机器 1 的公网 IP 地址(112.93.14.56:43891)。由

于 NAT1 是限制锥型 NAT, 此时私网机器 1 是不能收到报文数据的。

步骤 4: 私网机器 2 进行完步骤 3 以后,立即发送报文给服务器(180.93.45.46:8888),要

求私网机器 1 发送数据给私网机器 2 的公网 IP 地址。

步骤 5: 服务器通知私网机器 1, 通知信息内含公网 IP 地址(180.20.198.42.9681)。

步骤 6: 私网机器 1 发送报文数据给私网机器 2 的公网 IP 地址。由于步骤 3 发送报文给私

网机器 2 的公网 IP 地址,此份报文会被 NAT2 的路由器认为是步骤 3 的回复。所以此步骤会

被允许通过。 此时已经穿透了 NAT2。

步骤 7: 私网机器 2 回发报文给私网机器 1,此时穿透了 NAT1。穿透流程结束。

c.穿透对称NAT

对称 NAT 的特点是每一个不同公网机器的通信,都会被分配不同的映射端口通信。 若

参照限制锥型 NAT 的穿透流程,则在不能准确地知道步骤 3 所产生的公网 IP 地址与端口。

穿透流程如下图所示。 NAT1 为限制锥型 NAT, NAT2 为对称 NAT。

步骤 1: 私网机器 1(192.168.1.3:2341)发送报文数据给服务器(180.93.45.46:8888),

请求与私网机器 2 进行透传。

步骤 2: 服务器(180.93.45.46:8888)发送通知信息给私网机器 2。通知信息内含私网机器

1 的公网 IP 地址(112.93.14.56:43891)。

步骤 3: 私网机器 2 收到通知信息,发送报文数据给私网机器 1 的公网 IP 地址。 此时由于

NAT1 为限制锥形 NAT,数据是不被允许进入私网的。同时由于 NAT2 为对称 NAT,所以会在

此次报文发送过程中,会被产生新的映射记录, 分配公网地址与端口(iAddr:iPort)。

步骤 4: 私网机器 2 进行完步骤 3 以后, 发送报文信息给服务器的另一个端口 8889,此步骤

也会在路由器上产生一条新的映射记录, 分配公网地址与端口(mAddr:mPort)。 服务器同时

也获取到新的公网地址与端口(mAddr:mPort)。

步骤 5: 服务器(180.93.45.46:8889) 发送通知信息给私网机器 1。 通知信息内含步骤 4 产

生的新记录公网地址与端口(mAddr:mPort)。 此时根据 iPort 与 mPort 产生的相隔时间很

短,可以来判断 iPort 的值,即需要穿透的端口。 为了判断的根据准确,可以在产生 mPort

之前也加上一次新记录,即再步骤 3 以前让 NAT 路由器产生一条记录,这样准确度会大大穿

透的概率。

步骤 6: 根据 mPort 的值,来猜测 iPort 的值,发送报文信息给私网机器 2 的公网地址与端

口(mAddr:mPort)。 准确的 mPort 值,则能够穿透 NAT2。

步骤 7: 收到穿透报文信息后,回复报文信息。 流程完毕。

demo:

Server

Client 1:

Client 2:

穿透之后,关闭服务器,2个Client可以互相发送消息。

学习P2P的,gitbub上有实列。可以参考evilpan的大神的代码学习:https://github.com/evilpan/P2P-Over-MiddleBoxes-Demo

blob:

 https://evilpan.com/2015/10/31/p2p-over-middle-box/

相关文章

  • P2P打洞--内网穿透

    去中心化技术与P2P框架的实现 关于去中心化的网络架构, 也是服务器架构范畴...

  • Linux-SSH反向连接(内网穿透,打洞)

    场景 对于外网来说,公司内部的是内网,中间隔了个防火墙,如果想从外网去访问公司内部网络,正常情况下是不可行的,也无...

  • p2p内网穿透

    当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法...

  • P2P内网穿透

    需要开发一个软件实现数以万计个终端之间的数据传输,首先想到的最近又开始疯涨的比特币,比特币、以太坊等虚拟货币采用的...

  • Nodejs实现简单的UDP打洞(内网穿透)实验

    想实现UDP内网穿透,方法基本有两种,一种是通过服务器端口代理转发的方式,另外一种是通过UDP打洞来实现穿透。而所...

  • 钉钉内网穿透vs花生壳vsNATAPP

    目前常用的内网穿透有3种:钉钉内网穿透,花生壳内网穿透,natapp内网穿透。下面我们来对比一下他们的优略以及使用...

  • 内网端口穿透

    内网端口穿透 内网穿透在实际生活中,我们经常会在内网里部署服务让外网访问内网应用。这里我用的花生壳免费的内网穿透。...

  • Sunny-Ngrok实现自定义域名内网穿透

    内网穿透 + Sunny-Ngrok + 自定义域名 1、内网穿透 1.1 内网IP:内网IP,过多官方的解释这里...

  • 自建NAS系列04——网络服务

    内网穿透 花生壳 公网服务器与frp 内网穿透 内网穿透就是将自己内网中的服务映射到公网ip,达到公网可访问的目的...

  • frp内网穿透

    1-内网穿透 内网穿透即内网映射,可以将局域网变公网,从而可以让外网访问本地局域网内的服务。内网穿透原理技术有这么...

网友评论

      本文标题:P2P打洞--内网穿透

      本文链接:https://www.haomeiwen.com/subject/fsxdnltx.html