内网穿透

内网穿透

机缘巧合,正好在考虑工作台可以进行远程控制的问题。打算平时工作就在位置上用台式工作台完成工作,如果是去短途会议或者出差,那么就带一个ipad就够了。

在这种思路下,考虑并且实践了一些方案。

Win

安装了win10,然后在ipad上面安装了remote desktop,非常非常好用;但是碰到一个问题,当自己拿着pad在家的时候,想要远程控制是不可能的了。于是开始寻找方法,这个过程中就涉及到了一个词语:“内网穿透”。

Mac

mac下面也有比较火的“内网穿透”的项目:ngrok。


概要原理

penetrate
远程控制(花生壳),FQ(ss),微信小程序开发(ngrok)都可以用这个图解释。

  1. 远程控制(花生壳):
    • 外部B:代表了自己在家的时候的机器(包含了路由了)。
    • proxy:代表花生壳自己的服务器,并且有对应的域名和端口。
    • 内部A:代表安装了花生壳客户端,想要被远程控制的公司内部机器。
      逻辑关系:
      外部B 请求 proxyproxy 找到与 内部A 之间的长链接,然后代理接受和发送RDP协议数据,达到远程控制的效果。
  2. FQ(ss):
    • 外部B:代表被访问的fb,tw等Q外内容。
    • proxy:代表ss服务商提供的服务器,提供了对应的地址和端口。
    • 内部A:代表安装了ss客户端的,想要FQ的机器。
      逻辑关系:
      ss使用了socket5的协议,ss客户端监控了特定的端口,内部A 上面的数据只要是通过特定的端口经过ss客户端,就会被特定算法对称加密,然后到达 proxy 会做对称解密,最后 proxy外部B 交互的到结果,最终再次加密返回给 内部A ,由 内部A 解密给给对应的应用。
  3. ngrok:
    • 外部B:微信小程序api或者银行链条方
    • proxy:公网的机器带有域名,ngrok的服务端
    • 内部A:自己的机器,ngrok的客户端
      逻辑关系:
      ngrok的客户端和服务端直接使用tcp开socket长链接通信。客户端和服务端都维护了映射表:服务端维护了二级域名和客户端之间的关系;客户端维护了二级域名加端口和自己所在局域网中的ip加端口之间的关系;外部B 先通过 proxy 找到对应的 内部B内部B 然后再调用对应的服务达到穿透的效果。

自己简易实现内网穿透

有现成的例子:
清晰的协议
java实现的客户端
java实现的服务端