zema1 / suo5

一款高性能 HTTP 代理隧道工具 | A high-performance http proxy tunneling tool
MIT License
2.14k stars 200 forks source link
chunked-encoding http-proxy http-socks5 proxy socks5

Suo5

一款高性能 HTTP 代理隧道工具

![License](https://img.shields.io/github/license/zema1/suo5) ![Workflow Status](https://img.shields.io/github/actions/workflow/status/zema1/suo5/release.yml?label=release) ![Workflow Status](https://img.shields.io/github/actions/workflow/status/zema1/suo5/test.yml?label=test) ![Latest release](https://img.shields.io/github/v/release/zema1/suo5?label=latest)

experience

中文 | English


suo5 是一个高性能 HTTP 隧道代理工具,它基于双向的 Chunked-Encoding 构建, 相比 Neo-reGeorg 等传统隧道工具, suo5 的性能可以达到其数十倍。查看 性能测试

其主要特性如下:

原理介绍 https://koalr.me/posts/suo5-a-hign-performace-http-socks/

免责声明:此工具仅限于安全研究,用户承担因使用此工具而导致的所有法律和相关责任!作者不承担任何法律责任!

安装运行

前往 Releases 下载编译好的二进制,其中带 gui 的版本是界面版,不带 gui 的为命令行版。所有编译由 Github Action 自动构建,请放心使用。

使用时需上传 服务端 到目标环境中并确保正常执行。

界面版

界面版基于 wails 实现,依赖 Webview2 框架。Windows 11 和 MacOS 已自带该组件,其他系统会弹框请允许下载安装,否则无法使用。

gui.png

命令行

USAGE:
   suo5 [global options] command [command options] [arguments...]

GLOBAL OPTIONS:
   --target value, -t value                               the remote server url, ex: http://localhost:8080/suo5.jsp
   --listen value, -l value                               listen address of socks5 server (default: "127.0.0.1:1111")
   --method value, -m value                               http request method (default: "POST")
   --redirect value, -r value                             redirect to the url if host not matched, used to bypass load balance
   --no-auth                                              disable socks5 authentication (default: true)
   --auth value                                           socks5 creds, username:password, leave empty to auto generate
   --mode value                                           connection mode, choices are auto, full, half (default: "auto")
   --ua value                                             set the request User-Agent (default: "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.1.2.3")
   --header value, -H value [ --header value, -H value ]  use extra header, ex -H 'Cookie: abc'
   --timeout value                                        request timeout in seconds (default: 10)
   --buf-size value                                       request max body size (default: 327680)
   --proxy value                                          set upstream proxy, support socks5/http(s), eg: socks5://127.0.0.1:7890
   --debug, -d                                            debug the traffic, print more details (default: false)
   --no-heartbeat, --nh                                   disable heartbeat to the remote server which will send data every 5s (default: false)
   --no-gzip, --ng                                        disable gzip compression, which will improve compatibility with some old servers (default: false)
   --jar, -j                                              enable cookiejar (default: false)
   --help, -h                                             show help
   --version, -v                                          print the version

命令行版本与界面版配置完全一致,可以对照界面版功能来使用,最简单的只需指定连接目标

$ ./suo5 -t https://example.com/proxy.jsp

使用 GET 方法发送请求,有时可以绕过限制

$ ./suo5 -m GET -t https://example.com/proxy.jsp

自定义 socks5 监听在 0.0.0.0:7788,并自定义认证信息为 test:test123

$ ./suo5 -t https://example.com/proxy.jsp -l 0.0.0.0:7788 --auth test:test123

负载均衡场景下将流量转发到某一个固定的 url 解决请求被分散的问题,需要尽可能的在每一个后端服务中上传 suo5。 它的原理是判断 -r 中 URL 的 IP 是否与服务器的网卡 IP 匹配,不匹配则转发。

$ ./suo5 -t https://example.com/proxy.jsp -r http://172.0.3.2/code/proxy.jsp

配置域名/IP过滤规则,避免无意义的域名被代理, 命中规则的连接会直接被 reset 掉

# example.com 和 google.com 这两个域名不走代理
$ ./suo5 -t https://example.com/proxy.jsp -E example.com -E google.com

# 也可以将域名列表放在文件里,一行一个
$ ./suo5 -t https://example.com/proxy.jsp -ef ./excludes.txt

# 注意: 如果你配置的是域名,你需要确保 suo5 代理拿到的是域名,而不是解析好的 ip, 否则不会生效, 例如:
# 已经解析成 IP:  curl -v -x 'socks5://127.0.0.1:1111' https://example.com
# 仍然是域名:  curl -v -x 'socks5h://127.0.0.1:1111' https://example.com

特别提醒

User-Agent (ua) 的配置本地端与服务端是绑定的,如果修改了其中一个,另一个也必须对应修改才能连接上, 你可以将这个作为连接密码使用。

配置文件

配置文件的定义来自 ctrl.Suo5Config, 完整的配置如下:

{
  "method": "POST",
  "listen": "127.0.0.1:1111",
  "target": "",
  "no_auth": true,
  "username": "",
  "password": "",
  "mode": "auto",
  "buffer_size": 327680,
  "timeout": 10,
  "debug": false,
  "upstream_proxy": "",
  "redirect_url": "",
  "raw_header": [
    "User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.1.2.3"
  ],
  "disable_heartbeat": false,
  "disable_gzip": false,
  "disable_cookiejar": true,
  "exclude_domain": null
}

GUI 版本可以使用界面 导入配置导出配置 功能来导入和导出配置文件。cli 版本可以使用 -c 参数来指定配置文件。 GUI 导出的配置文件也可以给命令行使用,两者的格式是一样的。

常见问题

  1. 什么是全双工和半双工?

    全双工 仅需发送一个 HTTP 请求即可构建出一个 HTTP 隧道, 实现 TCP 的双向通信。可以理解成这个请求既是一个上传请求又是一个下载请求,只要连接不断开 ,就会一直下载,一直上传, 便可以借此做双向通信。

    半双工 在部分场景下不支持 全双工 模式(比如有反代),可以退而求其次做半双工,即发送一个请求构建一个下行的隧道,同时用短链接发送上行数据一次来完成双向通信。

  2. suo5Neo-reGeorg 怎么选?

    如果目标是 Java 的站点,可以使用 suo5 来构建 http 隧道,大多数情况下 suo5 都要比 neo 更稳定速度更快。但 neo 提供了非常多种类的服务端支持,兼容性很好,而且也支持一些 suo5 当前还在开发的功能,也支持更灵活的定制化。

接下来

参考

其他

扫码加我拉进讨论群,请备注申请理由为:问题反馈与讨论,否则不通过

wechat