使用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不一致。

未完待续。。。


推荐阅读:
相关文章