长亭百川云 - 文章详情

Awesome-Forwarder开发实战

零鉴科技

51

2024-07-14

Awesome-Forwarder开发实战

零鉴科技

上矩形

在实战的过程中,总会遇到防火墙或者一些策略的限制,导致目标机器只放行80,443等特定端口的流量,此时若没有闲置的服务器作为攻击机的话,往往则需要调整当前的服务或者新开一台服务器,这会给渗透工作带来很多额外的操作。

如果有一个根据ip来转发流量的工具,对外只暴露所需的端口,后续流量都由转发工具进行转发,那么既能够满足只出特定端口的需求,同时也可以较好地隐藏机器的真实功能。

简介

Awesome-Forwarder是一个轻量级的流量转发工具,能够根据特定的ip或者网段来转发流量,并支持以配置文件的形式导入路由表。

基于golang编写的Awesome-Forwarder可以很好的兼容各个平台,能够保证高并发率以及高效率。

特点功能

1.根据ip或者网段进行流量转发。

2.热加载,这意味着你可以在运行时实时修改配置文件。

3.静默模式。

4.自动日志转储和压缩。

5.每六小时自动存储状态信息。

6.在控制台中,通过输入"conn"来获取当前连接的状态,输入"routes"来获取当前路由信息。

左中括号

项目框架

左中括号

核心代码

1.流量转发

`func forwardPacket(conn net.Conn, dest string, belong string) {`  `var target net.Conn`  `target, err := net.Dial("tcp", dest)`  `defer target.Close()``  //...`  `// io bridge`  `go tcpBridge(conn, target)`  `tcpBridge(target, conn)``}``   ``func tcpBridge(a, b net.Conn) {`  `defer func() {`    `a.Close()`    `b.Close()`  `}()`  `buf := make([]byte, 2048)`  `for {`    `n, err := a.Read(buf)`    `if err != nil {`      `return`    `}`    `b.Write(buf[:n])`  `}``}`

Forwarder在此承担一个双向通信的角色,分别向来源端和目标端建立连接,并将发送来的数据包转发给目标端,将目标返回的数据包返回给来源端。这样的实现方式得益于golang中优雅的io Reader和Writer,通过这两个接口,程序可以以流的方式高效处理数据,而不用考虑数据是什么,数据来自哪里,以及数据要发送到哪里的问题,开发者仅仅需要将数据往里面写(Writer)和读数据(Reader)即可。

2. 热加载

`go func() {`  `for {`    `select {`      `case event := <-watcher.Events:`      `switch event.Op {`        `case fsnotify.Remove:``          // reset routeMap`          `resetConfig()`          `// add the file to the filewatcher again`          `err := watcher.Add(*ConfigFile)`          `if err != nil {`            `fmt.Println("fail to watch directory")`          `}`        `case fsnotify.Write:``          // reset routeMap`          `resetConfig()`      `}`      `case err := <-watcher.Errors:`      `fmt.Println("file watcher error")`    `}`  `}``}()`

在Forwarder启动的同时新建一个goroutine,使用go下的fsnotify库来监控文件,在捕捉到修改文件的事件后,重新设置配置。

这里有一个坑点是:在linux下,使用vim/vi修改文件会产生RENAME, CHMOD, REMOVE三个通知事件,而最后的REMOVE会移除所监控文件,所以要重新把文件添加入监控列表。

3.配置文件

`{`  `"log_level": "debug",``   "listen_port": "0.0.0.0:80",  ``  "routers": [`    `{`      `"description": "web",``       "from": "1.2.3.5",  ``       "to": "5.6.7.8:81"  ``    },`    `{`      `"description": "ssh",`      `"from": "1.2.3.4",``      "to": "5.6.7.8:22"`    `}`  `]``}`

Forwarder读取json格式的配置文件来形成路由表,其中log_level设置log等级,listen_port设置监听的端口,routers中存储着路由信息,路由信息由description,from和to三条信息构成,以此来标识一个转发规则。

压力测试

服务端:Ubuntu 20.04.1 LTS Apache 2.4.41

客户端:apache benchmark Version 2.3

服务端和客户端都位于内网环境

测试结果:

列"Local xxx" 表示直接请求服务端, 列"Forwarder xxx"表示通过    Forwarder转发流量来请求服务端。

从测试结果可以得出,Awesome-Forwarder做到了所有测试100%无丢包率,在内网测试下转发速率约为33MB/s,并且即使在30000次请求,200个线程下也能够很好的完成端口转发的工作。但是因为Forwarder需要将入口流量转发给出口,并将出口流量返回给入口(共两次请求),所以它大约需要耗费两倍于正常请求的时间来完成一次请求。

后序

Forwarder后序可以附加上很多额外的功能:

  • 连接管理终端

  • 提供web api获取当前连接状态和修改配置文件

  • 与telegram bot进行联动,实时提醒

  • 提供以守护进程启动的方式

  • 身份认证功能

参考

https://github.com/crabkun/switcher

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2