嵌入式C语言volatile关键字 面试问题与典型案例
volatile是一个特征修饰符(type speci...
从网络NAT分析N2N和Ngrok、Frp、nps等内网穿透工具
针对如上问题NAT应运而生
NAT是将私有地址转换为合法IP地址的技术,通俗的讲就是将内网与内网通信时怎么将内网私有IP地址转换为可在网络中传播的合法IP地址。NAT的出现完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
核心的两个概念:SNAT(Source NAT,源网络地址转换),DNAT(Destination NAT,目标网络地址转换)
SNAT: 源地址转换,当请求报文经过NAT网关时。NAT网关会将报文中的源地址替换掉,替换成能与目标地址路由互通的地址(也就是具有公网IP的NAT网关地址),此时目标地址不变,所以最终报文抵达目标服务。
DNAT: 目标地址转换,当service完成处理后返回数据,返回报文时的源地址和目标地址反过来,抵达NAT网关后NAT网关根据请求出去的时候的SNAT记录做反转,将目标地址转换成内网地址,最终抵达客户端。
需要注意的是,如上NAT流程只转换IP地址,并不对端口进行转换,这就导致同一时刻只能有一台主机占用NAT来连接互联网,因为BasicNAT的概念是把此公网IP完全给了私网内一台主机,然后其它网络内的设备将无法访问Internet。
不论是静态NAT还是动态NAT都无法解决IP地址枯竭的问题。
NAPT(Network Address Port Translation),也称为NAT-PT或PAT,网络地址端口转换,它不同于基础NAT只转换IP地址,它还同时进行IP地址和端口的转换,即允许多个私网地址映射到同一个公网地址的不同端口。
如下将会讲到的内网穿透工具都是基于该模式
在STUN标准中,根据私网IP地址和端口到NAT出口的公网IP地址和端口的映射方式,把NAT分为如下四种类型,详见下图。
STUN中定义的NAT类型
所有从同一个私网IP地址和端口(IP1:Port1)发送过来的请求都会被映射成同一个公网IP地址和端口(IP:Port)。并且,任何外部主机通过向映射的公网IP地址和端口发送报文,都可以实现和内部主机进行通信。
这是一种比较宽松的策略,只要建立了私网IP地址和端口与公网IP地址和端口的映射关系,所有的Internet上的主机都可以访问该NAT之后的主机。
所有从同一个私网IP地址和端口(IP1:Port1)发送过来的请求都会被映射成同一个公网IP和端口号(IP:Port)。与完全锥型NAT不同的是,当且仅当内部主机之前已经向公网主机发送过报文,此时公网主机才能向私网主机发送报文。
与限制锥型NAT很相似,只不过它包括端口号。也就是说,一台公网主机(IP2:Port2)想给私网主机发送报文,必须是这台私网主机先前已经给这个IP地址和端口发送过报文。
所有从同一个私网IP地址和端口发送到一个特定的目的IP地址和端口的请求,都会被映射到同一个IP地址和端口。如果同一台主机使用相同的源地址和端口号发送报文,但是发往不同的目的地,NAT将会使用不同的映射。此外,只有收到数据的公网主机才可以反过来向私网主机发送报文。
这和端口限制锥型NAT不同,端口限制锥型NAT是所有请求映射到相同的公网IP地址和端口,而对称NAT是不同的请求有不同的映射。
内网穿透俗称打洞,其实就是透过NAT对外提供服务的方式。当下流行的内网穿透工具ngrok,frp,nps本质上是通过应用层的端口映射实现。即服务端监听一个公网端口,当外部用户请求到这个公网端口时,ngrok通过与客户端建立的连接来进行请求的转发。这种工具只能做到4层或者7层的内网穿透,而N2N实现了2层的网络穿透(N2N Edge节点会创建虚拟网卡,所以它能代理七层网络模型中二层往上网络)。
N2N 是基于P2P协议的加密2层专用网络, 使用UDP协议进行封包传输,使用UDP协议带来了高性能和便捷性,例如利用很多场景下不会封锁DNS的UDP端口来打通网络,例如UDP原生优于TCP的传输性能。在NAT条件允许的情况下, edge节点间流量直连,无需通过supernode转发。
对于锥形NAT来说,supernode节点像是个中介,介绍edge互相认识后,之间的交互直接就是edge与edge的交互了。这也是N2N 最优势与其他中心化方案的地方。流量直连。避免中间转发的开销。
对于对称NAT来说, supernode就是个邮局,所有到达对端的数据报文都要由supernode中转。所以两端交互不但会产生额外的消耗,还会受限于supernode节点的带宽。