使用golang手把手实现一个tcp内网穿透代理工具。
描述一下应用场景,假设内网也就是我们的局域网,我们的电脑,pc运行了一个tomcat服务器,或者nginx服务器,又或者jdbc数据库,又或者python的服务器。
正常来说,我们是无法通过互联网达到访问局域网的电脑,pc的。
然后我们有一台外网主机,需要实现在外网主机端口支持访问我们内网的服务,这样的好处和目的是什么呢?
方便调试我们的代码,尤其是微信的公众号,以及线上的支付功能回调。凡是需要别人的服务器回调我们的服务器的都需要。
在做工具之前,需要先设计一下怎么实现这个工具,而不是盲目的开工。
首先可以明确的是:
1.控制服务,控制服务需要监听在外网服务器上,假设这个服务名字叫做control_server
control_server的主要功能是:
-
接受来自client的合法连接请求,是合法连接请求,因为不是所有client都可以连接到我们的control_server
这里需要一个鉴权方法,普通密码鉴权的话,tcp连接有可能被窃取。
所以我们的连接需要加密,可以考虑使用tls或者非对称加密,也就是server持有公钥,client持有私钥,client请求server端验证的时候,需要把内容加密,如果server端可以解码出来,那么就是可信的client端。
-
当client端请求,在server端服务器监听端口的时候,server端需要响应请求,并在server端监听该端口
假设client端请求在服务器上监听8080端口的时候,那么server端需要在服务器上监听8080端口,如果有端口占用的话,需要回复端口已被占用
-
当server端的监听端口收到连接请求的时候,需要请求client端,建立到目前端口的tcp连接,假设client那边的操作系统的端口8080需要转发出去,那么client端需要建立一个到client端8080的tcp连接。
同时client端需要连接到server端,并标记该连接是用于tcp透明传输的。
模拟一下其中涉及到的tcp连接:
tcp1: client:8080(监听) client:56789(连接到8080)
tcp2: server:4444(控制端,监听) client:56799(连接到控制端,专用透明传输,假设标记为8080透明1)
tcp3: server:8080(监听代理端) 用户端:56790(连接到服务器监听代理端,假设标记为8080透明1)
为什么上面需要有标记为8080透明1的用法呢?这是因为有可能用户端多个tcp连接请求到8080,所以server端需要明确传递到哪里。
control_server和client间连接需要有心跳处理,该请求需要标记为work,和其它标记tunnel不一致。
未完待续。。。
有疑问加站长微信联系(非本文作者)