B站最详细内网穿透原理 看了包懂 全是干货
最近对计网非常感兴趣,恰巧有因为学习原因,需要在外面访问家里的电脑,遗憾的是家里的网络并没有公网ip,以前对内网穿透就有一些兴趣,很可惜当时没有深入进去,现在有了需求,就将这段时间研究的内容记录下来,以供恰巧读到的人参考。
当然,前几天恰巧发布了一个内网穿透的视频,由于时长限制,无法在视频里将内网穿透的原理全部说完,这篇专栏也就当做视频的补充阅读吧。
以下的内容不涉及最基础的通过一个中央服务器转发的方式,因为这种方式我不说诸位也应该能理解。
在这篇文章写的时候我仍然对当今的内网穿透技术的成熟度不算太了解,目前基于UDP的内网穿透技术可以很确定的说是成熟了,但是基于TCP的内网穿透是还存在一些问题的,由于TCP协议的复杂,导致很多内容无法和UDP雷同,目前网上和书籍能用来参考的资料也较少,所以以下谈及的所有技术皆是在UDP传输的基础上。
既然要谈内网穿透,那么NAT就是不可避免的话题,因为纯粹的NAT技术已经是多年前使用的,现在绝大多数使用的都是NAPT技术,所以下文所说的NAT皆指代NAPT。
关于NAT技术的基础在这里我不想过多的赘述,无非就是将外网的ip及端口和内网的ip及端口建立一个映射关系,如果之前没有相应的了解,可以先参考我这个视频:
嫌弃30分钟太长的话,也可以自行阅读这篇博客
关于NAT,我个人认为,这篇文章的重点应该在于NAT的类型,NAT可以分为锥型和对称型,其中锥型又可以分为完全锥型和限制型锥型,限制型锥型又可分为ip限制型锥型和端口限制型锥型,画成图的话大概就是如下的样子。
所以如果去除分类的话,NAT的类型只有:对称型,完全锥型,ip限制型锥型,端口限制型锥型,也就是下图红圈圈起来的地方,下面我们来详细讲一讲这几种不同的分类。
假定:
公网server1:ip是1.1.1.1,监听端口是1111
公网server2:ip是2.2.2.2,监听端口是2222
NAT网关:ip是3.3.3.3
NAT内部需要穿透的电脑A:内网ip是:192.168.0.2
此刻,A(192.168.0.2:100)已经通过NAT网关(3.3.3.3:200)和server1(1.1.1.1:1111)建立了链接
完全锥型:如果在NAT网关已经建立了一个NAT映射,那么任何外网的机器都可以通过这个映射来访问内网的电脑,例如此刻server2如果想和A建立通信,那么只需要往3.3.3.3:200发送数据包,NAT网关就会接收数据包并将其转发到内部的192.168.0.2:100上。
如果A主动使用同样的端口去和不同的服务器或和相同的服务器,不同的端口建立连接时,NAT的映射也会使用同样的端口,例如A若是想用100端口和server2建立连接,NAT网关仍然会把3.3.3.3:200映射到192.168.0.2:100上,而不是重新选择一个端口映射到100,如果这里不能理解,那就先往下看,等到下面介绍对称型NAT时,结合着对称型NAT看即可。
在所有锥型网络中这一点都是一样的,这也正是锥型网络的特征,下面的两种锥型网络也是一样,虽然在此处声明后,不会在下面重新赘述一遍,但是请读者切记这一点。
ip限制型锥型:如果在NAT网关已经建立了一个NAT映射,那么只有与其建立映射的ip才能通过NAT访问内网的电脑。例如此刻如果server1想通过1112这个端口和A再建立一个连接,那么只需要往3.3.3.3:200发送数据,NAT会正常的将其转发到192.168.0.2:100,但是如果此刻server2想和A建立连接,因为server2在此前并未和A建立连接,所以如果server2给3.3.3.3:200发送数据的话,NAT网关会将来自server2的数据包直接丢弃。
端口限制型锥型:这个类型虽然叫端口限制型,但其实限制的不只是端口,ip也同样限制,可以理解为在ip限制型锥型的基础上,再进行端口的限制,也就是说现在不只对ip有需求,连端口都有需求,如果按照上面的例子,此刻如果server还想通过1112端口和A建立连接就不行了,因为限制了端口,只有从1.1.1.1:1111发来的数据NAT网关才会处理。
对称型NAT:可以看出来,上述的三个类型限制是越来越严格,按照这个思路,对称型NAT的限制会更加严格。首先,对称型NAT和端口限制型锥型是一样的,即对ip和端口都有限制,只有和其建立连接的ip和端口向其发送数据才不会被丢弃。
我们上述说了,锥型网络的特征是如果A使用了100端口和外网的另一台服务器通信,那么NAT网关和其绑定的端口依然是200,一个端口和外面的诸多服务器进行通信,这也正是锥型这种叫法的来源,但是对称型NAT并不是这样。
对称型NAT在A主动使用相同的端口去和不同服务器或和相同的服务器不同的端口建立连接时,NAT网关会给其重新分配一个端口。
例如,我们在最开始的时候说,A(192.168.0.2:100)已经通过NAT网关(3.3.3.3:200)和server1(1.1.1.1:1111)建立了链接,此时如果A(192.168.0.2:100)想和server2(2.2.2.2:2222)建立连接的话,如果使用锥型NAT,那么这个NAT网关会继续使用之前建立的NAT映射(3.3.3.3:200映射到192.168.0.2:100),而如果现在使用对称型NAT的话,NAT网关会再随机分配一个端口(例如300),建立一个映射(3.3.3.3:300映射到192.168.0.2:100),注意,此时NAT网关中存在两条映射规则,分别是:3.3.3.3:200映射到192.168.0.2:100和3.3.3.3:300映射到192.168.0.2:100,也就是说,此刻server1是和3.3.3.3:200进行通信,server2是和3.3.3.3:300进行通信,但是实际上,经过NAT网关的转发后,他们的数据包,最终都被192.168.0.2:100接收。
需要注意的是,内网电脑A始终都是通过100这个端口和外界通信的,而这两条映射规则则是NAT网关建立的,所以电脑A并不知道200和300这个端口,它始终认为自己就是通过100这个端口和外界通信,在外界的两个server来看,它们也并不知道自己是在和主机A通信,它们认为它们在和NAT网关(3.3.3.3)的不同端口进行通信。
我们知道,内网穿透的作用是将两台处于NAT中的主机连接,所以上述介绍了四种NAT的类型,如果对其进行两两组合,共有10种组合方式。事实上,不同的组合方式在进行穿透时的方法也不同,甚至存在两种组合方式无法进行内网穿透(当然,如果全程用一个服务器进行转发自然是可以的,但是我们这里不考虑这种方法,另外目前有一些方式也可以实现这两种的内网穿透,只不过目前还不成熟,成功率较低,事实上不只是目前,我个人认为以后也不会成熟,因为这两种组合无法穿透是nat在设计上就存在的逻辑问题,或者说nat在设计之初就没有考虑这两种的穿透问题),下图将这些组合以及是否可以穿透列了出来。
内网穿透的思路有三种,所有可以进行内网穿透的的组合都可以基于这三种方法或基于这三种方法稍微拓展来实现内网穿透,下面我们讲讲这三种方法。
准备工作:内网穿透是使两个处于NAT中的网络进行连接,所以假设其中一个NAT网关是A,另一个NAT网关是B。另外内网穿透都需要有一个中心服务器来帮助,A和B都需要先连接到这台中心服务器,这里假定中心服务器的名字是server1,所以大致上拓扑应该是这样的。
临时画的,画错了右边的主机应该是主机B
第一种:完全锥型NAT和完全锥型NAT进行穿透
假设A和B都是完全锥型NAT,在A和B都连接到server1后,A和B都可以借助server1的转发互相发送消息,那么此刻A和B就可以知道对方的公网ip,以及对方和server1连接的时候,使用的端口是什么(假设是100),因为两者和server1进行通信的端口已经进行了NAT映射(不然怎么通信呢),所以二者的100端口其实已经完成映射,又因为二者都在完全锥型NAT下,此刻A只需要直接给B的100端口发送建立连接的请求,B给A的100端口回复同意建立连接的请求,二者即可建立UDP连接(当然UDP连接建立要比这复杂点,不过本文重点不在于如何建立UDP连接)
第二种:ip限制型NAT和ip限制型NAT进行穿透
假设A和B都是ip限制型NAT,在A和B都连接到server1后,A和B都可以借助server1的转发互相发送消息,A会先发送一个UDP请求(假设自己的端口用100,目标端口用200)到B的公网ip上,理论上来说,因为B的NAT网关中,200端口没有建立NAT映射,所以这个数据包会被丢弃,但是在A发送给B的UDP请求后,A会通过server1给B发送一个邀请,邀请B也发送一个UDP请求给A(此刻B自己用的端口是200,目标端口是100),注意,在B收到来自A的UDP请求后,虽然A的数据包被B丢弃了,但是此刻,网关A暂时的建立了一个NAT映射,等待B返回的信息,虽然数据包已经被丢弃了,但是A不知道,所以A会稍微等一会B。这时,B收到了A的邀请,给A发送了一个建立连接的请求,此刻A的NAT网关恰巧暂时建立了NAT映射,所以A就可以收到B的UDP请求,接着A会给B发送一个同意建立连接的请求,因为此刻B刚发完请求在等A的回信,所以B的NAT网关也会暂时的建立一个NAT映射,所以A同意建立连接的请求就不会被B的NAT网关丢弃,最终,二者就建立了一个稳定的UDP连接。
第三种:端口限制型NAT和端口限制型NAT进行穿透
原理和第二种其实差不多。
借助这三种思想,我们就可以完成不需要服务器一直进行中转的内网穿透,那么为什么对称型NAT不能使用“ip限制型NAT和ip限制型NAT进行穿透”的思想和对称型NAT穿透呢。
仔细观察一下,在第二种方法中,A邀请B给其发送一个UDP请求,在邀请的信息中,A指明了B的UDP请求的目标端口,因为在锥型NAT中,主机A的一个端口和NAT网关的映射是固定的,所以主机A可以通过server1知道自己给B发送请求是打开的端口是哪一个,也可以知道B给自己发送请求是打开的端口是哪一个,但是当换到对称NAT中时,由于一个连接对应NAT网关上的一个端口,所以主机A无法确定自己通过哪一个端口给B发信息,同样无法确定B会通过哪一个端口给自己发信息,所以二者无法建立连接。
那么端口限制型又为什么不能和对称型进行穿透呢,因为端口限制型对端口存在要求,但是我们无法确定对称型中分配的端口是哪一个,所以无法建立通信
想让二者能建立通信,目前已知较好的的方法是让处于端口限制型NAT中的电脑和对称型中的电脑建立65535个UDP连接,由于65535包含了全部的端口号,所以总有一个端口是对的。但是这样一来就在一瞬间占用了几乎所有的端口,这可能会导致对称型中的电脑来不及处理正常的TCP连接,并且会占用大量资源,而且连接的成功率也非常的低,所以我们通常认为二者不能进行穿透。
最后,想必各位关系的是自己的网络处于哪种NAT,目前来看的话,家里的路由器(包括办宽带时送的光猫),使用的都是完全锥型NAT,但是上层的机房为了公共安全,使用的一般都是对称NAT,也就说是我们绝大多数人使用的都是对称NAT,所以想要进行内网穿透还是非常困难的。
都看到这了,码字也不容易,各位看官点个关注呗~
|B站最详细内网穿透原理、看了包懂、全是干货
B站最详细内网穿透原理 nat穿透 全是干货 内网ip 内部网关协议 映射端口 服务器端口 服务器类型 看了包懂 端口转发 网络映射 网络端口 通信 通信原理