内网穿透工具的原理与开发实战
这里要注意io.Copy函数是同步阻塞的,意味着只要连接没有断开,那么程序执行流将一直卡在这个函数。如果拷贝出错,那么io.Copy函数就会返回,也就是执行他下面的代码。拷贝出错意味着可能连接已断开,那么先把写入流的连接断掉。 这里要重点注意,为什么是断开写入流而不是读写流全部断开呢。因为我们前面发射了两个Goroutine,如果盲目全部断开,将会导致另一个Goroutine中可能还有未写完的数据丢失。具体可以根据TCP四次挥手来分析。 实际执行 如果没有Golang环境的朋友可以直接下载编译好的可执行文件,下载地址:https://github.com/cw1997/NATBypass/releases 我们先来看看代码编译之后实际运行,上图左边为虚拟机跑的内网服务器,他已经设置了入站规则,通过直接连接192.168.2.112:3389是无法连上远程桌面的。 此时此刻右图开始通过listen命令监听7777和9999端口。 接着内网服务器再通过slave命令开始双向连接黑客的主机(右图的192.168.2.101:7777)以及本地的127.0.0.1:3389。 然后黑客的主机上连接本地监听的另一个端口127.0.0.1:9999即可连接上内网服务器的远程桌面。 大家可以根据netstat -an的结果以及控制台日志输出来综合理解这个过程。 写在最后 这个工具现在实现的仍然只是简单的透明传输,并且存在诸多问题。比如说本地主动连接内网服务是一开始就预连接好的,这样会导致一些服务如果在连上之后长期没有数据传输,会主动断掉连接,导致公网端偶尔出现无法连接上,要重新断开重连后才能连上的小BUG,具体在HTTP服务器要多刷新几次页面,远程桌面则可能要连接上然后又取消,然后再连才能连上。而且在并发连接上处理还有一些细节没有做好。并且目前还仅仅支持TCP连接的转发等等,当然要实现UDP的转发也不是很困难稍加改进即可。大家也可以点个star,提个pull request一起来改进这些问题。目前相关的开源项目也有做的比较成熟的,比如说Golang写的ngork,大家也可以参考参考。
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |