内网穿透的本质就是流量转发,把一个电脑的网卡上的流量数据,转发到另一个网卡的流量数据。
实现原理
- 网络协议分层就是,物理层,数据链路层,网络层,传输层,应用层。我简单解释一下这些分层协议,
- 物理层就是规定数据流通的物理硬件,比如网线,光纤,wifi,物理层就是规定这些不同的物理设备怎么传输交换物理设备的。
- 数据链路层,就是以太网帧数据转发的,作用是一个包必须要包含电脑的mac目的地址,将数据转发到一个指定的物理电脑,mac就是物理的地址。
- 网络层,比数据链路层更高级点,这个协议的作用是把数据转到到特定的ip所在的电脑,一个电脑是可以有多个ip的,但是只有一个,mac地址,网络层并不知道应该把包转发给谁,只是把数据解析成以太网帧,由更底层的协议找到ip和mac的对应关系,找到这个ip在这个局域网内的mac地址并转发。
- 传输层,就是我们的socket,在tcp/ip写就两个协议,udp和tcp。网络层只是电脑和电脑之间的数据转发,传输层还要加上端口,我们写代码,肯定会接触到端口,所以这一层开始在网上,都可以用来开发应用软件了。
- 应用层,就是http,ws等协议。没什么好说的。
- 有了前面的网络协议知识前提,那内网穿透是网卡之间的流量转发,那具体是什么呢。一个网卡叫做一个网络适配器,其实就叫做tun,处于网络层的一个设备,在数据链路层,一般叫做tap,如果是想在一个主机上虚拟网络,类似docker的网络虚拟能力,也许会用到tap层。内网穿透使用到tun就行了。
- 具体实现内网穿透,过程就是,在两个电脑上分别创建两个虚拟网卡,然后这两个虚拟网卡其实就是个服务层序,他们可以使用普通的网络通信api,如果设备能上网,就可以向中心服务器发送流量数据,中心服务器再把数据包转发到另一个连接到中心的电脑的适配器上,这个适配器程序再把流量数据,写入到网卡中。操作系统的协议栈,会继续转发这个包,到运输层给相应的程序。
有哪些工具可以实现
太多了,花生壳,frp,natapp。等。有些需要自己部署服务器,有些像花生壳这样的不需要部署。这些穿透工具有的还会限制协议。
我觉得太麻烦了,自己做了个小工具,集成到了我的文件管理项目中。https://github.com/xiaobaidadada/filecat;
打开这个网址,下载完发布包后,简单配置一下就可以流量转发工具,前提是要有一台自己的公网服务器,不需要买很贵的,因为内置了p2p功能,这样流量就不用转发了,而是两个电脑直连。使用操作也是非常简单。傻瓜操作一下就行了。
这个工具还可以实现,你有一台公网服务器,但是性能不好,你想让自己的电脑上的程序被公网服务器调用,自己的电脑又没有功能,你可以在公网服务器上设置服务器模式,自己电脑设置客户端模式,不管是p2p还是流量转发都可以实现这个功能。