注:前几段是铺垫,想看总结原理的直接翻下面就行
这几天在思考做什么毕设,但是总归我是个学Java的,还是要搞web项目,那么问题来了,我要怎么发布我的网站呢?有两个思路,一个是部署到某个大厂的云服务器上,另一个就是通过内网穿透技术将部署在自己家内网上的服务器与外界连通。当然了,云服务器简单方便还省事,但是我就是想练练手,自己搞个服务器玩玩。所以我选择了学习内网穿透。
关于内网穿透的常用软件我就不再赘述了,这篇文章也不是教大家怎么配置内网穿透的,在学习内网穿透的过程中由于我浅薄的知识积累但又喜欢刨根问底的本性,我想到了一个问题:
即:为什么我们需要内网穿透?
1.为什么我们需要内网穿透
显而易见,只要稍微学过计网的同志们都知道,ipv4的总共IP数量是受到限制的,最多只有232个,再刨除一些特殊的,满打满算能用的也就是几十亿个,目前这些ip地址相对于全球的计算机总数是非常不够用的。怎么解决呢?一种解决方案就是推行ipv6这种号称能够给全世界的每一粒沙子都分配一个IP的技术,另一种就是使用局域网的方式,这样一个局域网内部的计算机访问外部网络时由网关通过NAT(network address translation)技术将自己的内网ip和端口(如192.168.1.3:8080)映射为网关的IP地址和相应的端口(182.204.18.204:200),给你提供服务的服务器不需要知道你的具体ip(反正知道了也没用),只需要将你需要的数据发送给你的网关,由网关根据端口的映射转发给你,这样就可以实现通过一个ip指向多个计算机。
这样,你的计算机就藏在了NAT网关的背后,现实中,大部分人的计算机(包括企业的服务器)都藏在NAT网关的背后,相当于有了个假名,这样别人就无法直接找到你,只能找到你所属的NAT网关,而其他人无法得知保存在NAT网关中的映射关系,从而保证了你电脑的安全。对于企业来说,他们的处理数据的服务器并不需要和外界进行直接相连,而是将处理后的结果返回给负责跟外界通讯的服务器,他们就藏在NAT之后。
那么又有一个问题了,这样的映射方式很明显是通过端口来具体的分割每个计算机,那么如果一个计算机就运行了65535个程序,占满了网关的65535个端口该怎么办呢?又或者一个网关链接了很多台计算机,计算机又运行了很多程序,端口被占满了该怎么办呢?
关于这个问题我并没有一个具体的答案,欢迎大佬们帮我涨知识。
我个人的理解是,大部分计算机并不会占用那么多的端口,同样的,一个ip往往不至于往局域网里放那么多的计算机(对于企业来说公网ip并没有那么难获取)
很明显的,我们在外网是无法访问没有公网IP的自家的计算机的,那么问题来了,通过NAT技术,我们在自家电脑上可以访问外网,同时从外网获取数据,按理来说,只要知道了一个内网的公网ip和映射的端口,应该能够通过NAT往外映射的逆过程, 借助路由器将咱们想要发送的数据或者指令发过去啊。
但是在咱们实际的应用中,往往就算我们知道了自己家路由器(甚至运营商给整栋楼的)的公网ip,但是同样不能直接访问自己家的电脑是什么原因呢?
PS:最开始我也不知道, 也有可能是老师上课讲过但是我没听,经过漫长的查询我才知道一些皮毛。
这个问题就涉及到NAT的分类问题了,NAT大体上分为对称型,ip限制型,端口限制型和完全锥形
图片转自知乎@夜雨听风
以上这些类型完全不需要理解,如果想深入了解可以看这篇知乎
详解内网穿透
简单来说,这四种NAT是这样的
完全锥形NAT :比较好客,所有人都可以向我的任何端口发数据
ip限制型NAT :稍显腼腆,只认跟自己建立过链接的ip,来自其他ip的数据包都会被丢弃
端口限制型NAT:比上面那位还腼腆,只人建立过链接的端口。
对称型NAT:这位更是重量级,以上的几位都是只在被动接受数据的时候挑挑拣拣,主动发数据是都没啥限制(当内网中的同一个主机想使用原先的端口,例如8080端口跟另一个服务器建立链接都会沿用之前映射过的端口200),而这位不一样,同一个内网主机的同一个端口想跟不同的服务器建立链接,NAT网关都要给它提供一个新的映射(例如300)
这就导致了一个什么问题呢?
就是咱们自家的路由器基本上都是完全锥形,但是家用路由器的上一层(例如运营商提供的)路由器往往使用的都是对称型NAT,这就导致只有自己访问外边才会被通过(自己主动建立的链接,建立完成后收信息的时候就不腼腆),而外面的主机想主动访问自己时就会被拦截在对称NAT这个阶段。
显而易见的,这样可以避免所有人随便访问自家的网络,保证了安全性,但是你也失去了在外网随意访问自家计算机的便利。
另一方面,我们在自己家的电脑上部署的程序,例如tomcat监听8080端口,又于我们并没有事先规定NAT网关中关于8080端口向外的映射关系,所以即使外部访问了我们的网关的所有端口,数据包也不会被转发到我们家中的电脑上。
2.内网穿透
好了,铺垫了这么半天明眼人都能看出来下一步要讲什么了,解决访问自家内网的问题就要使用内网穿透技术。
要实现内网穿透,首先我们需要一台有公网ip的服务器,云服务器也可以。
最开始学到这块的时候我就很奇怪了,我都能跟处在外网的云服务器建立练习了,怎么还没法跟其他计算机建立联系呢?
如果你看懂了上面对于多种NAT的解释,你就能明白问题的所在了,说白了,就是一个“主动”的故事。我们在主动访问云服务器时,与云服务器建立了链接,因为这个链接是我们主动去建立的,即使是对称型的也可以完成建立过程,当链接建立完成后,NAT网关中就存储了云服务器的IP和端口,这样的话以后服务器向咱们发数据的时候,NAT也不会丢弃数据包。但是外网的其他计算机想访问我们的话,对NAT来说是被动的过程,在NAT中并没有存储,对于NAT来说就是一个陌生人,来自其的数据包就会被丢弃掉,也就无法访问内网了。、
那么在建立内网穿透时这个有公网IP的服务器的作用是什么呢?简单来讲,就是起了一个“介绍人”的作用,你俩不是不熟吗,由我来帮助你们建立第一次链接,这样对于NAT来说你俩就不是陌生人了,NAT就可以正常接收来自外部网络的数据了。具体的过程可以看上面那篇大佬的详解。
显而易见,这个有公网IP的服务器需要有什么特性(做什么配置)呢?
首先需要我们的内网的计算机主动去与这个公网服务器建立链接,让他俩先成为熟人,再让这个有公网IP的服务器具备跟所有人都能熟络的能力(可以被动接受任何IP的数据,也就是如果这个服务器也藏在一个NAT网关之后,这个NAT必须是完全锥形的)。
感谢看到这里的读者们,如果您对这篇文章有不同的理解或者发现我的错误,请务必提出,这也是我学习的机会。
我是之前没好好学但已经开始好好学的言少不失,这也是我第一篇公开的博客,希望您能从中获得知识或灵感。