背景:之前闲得很,想要自己搭建一个网站,服务器是内网中的一个设备。但由于是家庭宽带,没有公网Ip,80、8080、443等端口也是被封掉的(突然觉得好可怜),所以使用了花生壳的内网穿透,之后对其的原理产生了好奇,搜索了一些资料、系统化地呈现下来。
1.普通网站的访问流程:
用户输入域名->DNS服务器查找到服务器对应的Ip->服务器的80端口(或者443,用在HTTPS中)中的软件监控到了访问,做出响应。
PS:如何在同一台服务器上部署多个网站?
这就涉及到了一个主机头的概念。参考博文:https://blog.csdn.net/qq578933760/article/details/7707574。实质上就是服务器会读取用户请求中关于域名的部分,再转到对应的网站下。
2.部署在内网的服务器(有固定公网Ip、80端口可用时)的访问流程:
用户输入域名->DNS服务器查找到网关的ip->网关收到访问申请,要访问自己的80端口->根据预先在网关中设置好的端口映射规则,将申请转发给内网中的服务器(注意,此时是内网通信,网关使用的是自己的内网Ip)->服务器返回消息,发送给网关的内网ip->网关通过公网ip将消息发送给用户
3.部署在内网的服务器(没有固定公网ip、80端口不可用时)的访问流程:
这时我们可以提出一种设想,如果我租用一台有固定公网ip、80端口可用的服务器,并将域名绑定到这一服务器对应的ip上,之后设置反向代理,指定网关的公网ip并指定非80端口。同时,虽然没有固定公网ip,但是我们可以设置一个同步流程,每次重新随机分配公网Ip时,我们都将这个ip同步到服务器上。流程就会变成:
用户输入域名->DNS服务器查找到我们所租用的服务器的ip—>服务器80端口检测到访问,反向代理回网关的动态公网ip(指定非80端口),也就是转发->网关非80端口收到访问申请->根据预先在网关中设置好的端口映射规则,将申请转发给内网中的服务器->服务器返回消息,发送给网关的内网ip->网关将内容返回我们所租用的服务器->服务器返回内容给用户。
实际上,这已经和现在市面上比较流行的内网穿透软件,例如花生壳,的原理比较接近的。但是花生壳的内网穿透是不需要配置网关的端口映射规则的,这一点是怎么做到的呢?
4.以花生壳为例的不需要配置端口映射规则的访问流程:
*注:这只是本人的推断,不代表软件本身真实的原理
和上一步不同的是,花生壳使用时要求服务器要一直运行着花生壳的客户端,而域名也是绑定在花生壳的服务器下的。那么这实际上就不是单纯的web通信了,用户发送消息后花生壳的服务器接收到消息,之后就是服务器端和客户端的通信,原理和微信电脑端和手机端的相互通信一样,所以自然不需要配置端口映射。
当然,无论是花生壳的方式,还是3中的方式,不仅会影响访问速度,用于转发的服务器的负载和流量也是不小的。而且速度上和流量上会有限制,并没有完全体现自己搭建服务器的优势。
----------------------------------------------------------------------------------
参考资料: