远程访问统一管理工具——turbo-tunnel

0x00 前言

你是否遇到过以下这些情况:

  • 目标服务需要通过跳板机才能访问,每次都要将端口映射到本地,然后配置hosts访问

  • 不同的服务需要配置不同的代理才能访问,管理起来很不方便

  • 有些服务需要通过嵌套代理才能访问,本地不太好配置

  • 本地开发、调试后端服务时,对于第三方依赖服务难以直连或通过同一个代理访问,而服务进程又只能配置固定的代理

  • 使用全局透明代理时,无法根据目标服务选择不同的路由代理

总的来说,就是因为各种网络连通限制导致的跨网络访问(如:开发、运维环境差异,或是需要连通不同局域网),会影响到我们日常的开发、调试工作,而turbo-tunnel就是为了解决这一问题而诞生的。

它的总体思想是将不同的代理、隧道都转换成本地一个统一的代理服务(如:HTTPS代理、socks5代理),然后进程在访问目标网络时通过配置环境变量或透明代理方式,达到自由访问目标网络的目的;而turbo-tunnel提供了多种不同代理/隧道的支持,并且可以通过插件方式支持更多类型的隧道。

0x01 常见的跨网络访问方式

标准代理

标准代理是指较为通用的代理类型,其代理协议格式一般是有专门的RFC编号的。

HTTPS代理是最常见的一种标准代理类型,大多在内网中作为统一的网络出口提供。浏览器等应用可以直接用它来访问https的网站,但一般也可以用于访问其它任意类型的TCP服务,如:FTP、SSH、VNC等。

其它常见的标准代理协议还有Socks4Socks5等,但使用上不及HTTPS广泛。

非标准代理

某些场景下需要考虑代理服务的隐蔽性和稳定性,此时可以考虑使用非标准版代理。这些代理一般是应用自己定义的格式,其他人很难使用探测的方式发现这是个代理服务。

Websocket代理就是一种很优秀的非标准代理协议,不同应用一般都有自己不同的实现。选择WebSocket协议的原因是:它是一种类似于TCP的流式协议,可以做到全双工通信;它本身基于HTTP协议,易于扩展,Web服务器(如:Nginx)支持性也较好,并且容易穿透防火墙;与HTTPS结合后还能极大提升安全性。由此可见,在诸多协议中,WebSocket协议是最佳的非标准代理选择。

WebSocket协议的握手阶段也可以轻松实现鉴权、建立通信隧道等逻辑;可以说,用它实现非标准代理协议成本是相当低的。

当然,其它协议也可以用于实现非标准代理,只是实现成本与代理效果的问题。

通信隧道

通信隧道是指将真正要通信的数据加密处理后包装成通用的数据包格式在公网中传输,以达到保护通信数据的目的。常见的通信隧道有:VPNIPv6隧道SSH隧道等。

其中,SSH隧道由于十分常见,无需额外部署服务,同时具有较高的隐蔽性和便利性。很多场景下SSH服务会以跳板机的形式提供,使得它成为唯一能够穿透网络的途径。一般情况下是借助于SSH服务的端口转发能力建立通信隧道;但如果SSH服务没有开启端口转发,就只能使用其它手段建立通信隧道了(例如使用进程的stdin和stdout代替socket)。

0x02 嵌套访问

嵌套访问是一种很常见的使用场景,例如:在公司内需要先通过HTTPS访问外网,然后再通过公网的一台SSH跳板机来访问真正的目标服务,甚至有可能还要多次穿越SSH隧道。在不借助特定工具的情况下,这种场景一般比较难以支持,就算能够支持也比较复杂。

支持嵌套访问的原理是:建立每一层的代理连接后,都会告诉它下一跳代理的地址,这样会建立一个请求链,最终将请求发送到真正的目标服务。

turbo-tunnel目前支持将HTTPSSSHWebsocketSOCKS4等代理或隧道,进行任意层级或顺序的组合,从而达到支持嵌套访问的目的。

0x03 支持配置文件

将配置存储到文件,可以避免因进程退出或系统重启导致的配置丢失问题,而且在配置内容较多时,可以有效地管理这些配置,避免混乱。如果需要将配置迁移到另一台机器,也只需要将配置文件拷贝到另一台机器即可。

turbo-tunnel使用yaml格式来管理配置,具体使用方式可以参考文档

0x04 路由管理

在多个代理并存的情况下,必然会出现不同目标服务使用不同代理的需求。这种情况就需要进行路由的管理,这和Proxifier中的规则配置是一致的。

turbo-tunnel通过在配置文件中配置路由规则,允许用户根据目标服务的域名、IP、端口等信息进行路由管理,并且可以设置规则的优先级。

0x05 使用本地的统一代理

turbo-tunnel可以在本地建立一个统一的代理服务(推荐使用http/https代理),自动将接收到请求进行路由分发。用户可以使用以下一些方式来使用这个代理服务:

  • 配置http_proxyhttps_proxy环境变量,很多命令行工具,如:curl,会读取这个环境变量并通过代理访问。

  • 浏览器可以通过配置代理服务器的地址,来将所有流量导入到本地的代理服务。

  • Windows和MacOS推荐使用Proxifier,规则可以设大一些,这样能够实现全局透明代理,应用程序不用再单独设置了。

  • Linux可以使用proxychains等工具进行流量转发,使用时在命令行前面加上proxychains,这样不会影响其它命令,较为灵活。

0x06 总结

turbo-tunnel是一款为简化复杂场景下跨网络访问的工具,提供了多种代理/隧道协议的支持,相信它能为你的工作带来帮助。

详细文档地址:https://ttun.top/

Github项目地址:https://github.com/drunkdream/turbo-tunnel

分享