rakshasa

rakshasa 是一个使用 Go 语言编写的强大多级代理工具,专为实现多级代理内网穿透而设计。它可以在节点群里面任意两个节点之间转发 TCP 请求和响应,同时支持 socks5 代理http 代理,并且可以引入外部 http、socks5 代理池自动切换请求 IP

节点之间使用内置证书的 TLS 加密 TCP 通讯,再叠加一层自定义秘钥的 AES 加密,可以在所有 Go 支持的平台使用。可以在你所有的的 Windows 和 Linux 服务器上搭建节点并组成节点群网络。

节点分为普通节点 (node) 与控制节点 (fullnode)

  • 普通节点,无法控制其他节点进行代理、shell 等操作
  • 控制节点,全功能节点

版本迭代

  1. v0.1.0 2023-03-28
  2. 首次发布
  3. v0.2.0 2023-04-02
  4. 更改为 fullnode 版本,fullnode 为全功能版本可以控制别人也能被控
  5. 增加 node 版本,去掉私钥,无法发起代理等关键操作,适合被控
  6. 增加 lite 版本,在上面版本的基础上,精简 cli 交互与 http 代理池,体积缩小 2mb
  7. 优化节点连接逻辑,并且遍历网卡 ip 进行 net.Dail,解决多网卡下,无法连接的问题

编译与使用

生成新的证书,编译所有版本节点

go run build.go -all
Plain text

编译所有版本节点(不更新证书)

go run build.go -all -nocert
Plain text

生成覆盖证书

go run build.go -gencert
Plain text

生成控制节点与普通节点

go run build.go -fullnode
Plain text

只生成普通节点

go run build.go -node
Plain text

证书保存在 cert 目录下,可以使用第三方工具生成,请使用 RSA PKCS1-V1.5

private.go     -- 编译普通节点的时候要删除此文件
private.pem  -- 与 public.pem 对应的公钥私钥,普通节点不包含私钥
public.pem
server.crt     --tls 通讯证书
server.key    --tls 通讯私钥
Plain text

版本区别

fullnodenodefullnode_litenode_lite
连接其他节点
启动本地 socks5 代理
启动本地 http 代理
启动多层代理××
远程 shell××
其他远程功能××
交互式 CLI××
check_proxy××

简单来讲

  • fullnode 完全版,能控制别人,也能被控
  • node 能连接其他节点,但是不能对其他节点操控,适合作为被控端
  • lite 版本,精简掉 cli 和 net/http,与一些 debug 的代码

使用图示

rakshasa多级代理内网穿透工具

rakshasa 多级代理内网穿透工具

使用方法

启动一个带 CLI 节点
不带任何参数即可启动:

d:\>rakshasa.exe
start on port: 8883
rakshasa>
rakshasa>help

Commands:
  bind              进入 bind 功能
  clear             clear the screen
  config            配置管理
  connect           进入 connect 功能
  exit              exit the program
  help              display help
  httpproxy         进入 httpProxy 功能
  new               与一个或者多个节点连接,使用方法 new ip: 端口 多个地址以 , 间隔 如 1080 127.0.0.1:1081,127.0.0.1:1082
  ping              ping 节点
  print             列出所有节点
  remoteshell       远程 shell
  remotesocks5      进入 remotesocks5 功能
  shellcode         执行 shellcode
  socks5            进入 socks5 功能


rakshasa>
Plain text

请查阅 CLI 使用说明了解详细信息(见文章下面留言补充 (4) )

其他启动参数说明

-nocli
在无法后台执行的情况下,启动一个不带 CLI 的节点:

nohup /root/rakshasa -nocli > /root/rakshasa.log 2>&1 &
#Linux 下配合 nohup 后台执行
Plain text

-p 端口
以指定端口启动:

rakshasa -p 8883
Plain text

-d ip:port,ip:port...
连接下一层代理或更多层代理,多个地址以逗号隔开,生效在最后一个 ip:port:

rakshasa -d 192.168.1.1:8883,192.168.1.2:8883,192.168.1.3:8883 -socks5 1080
#从本地 1080 端口启动一个 socks5 代理,流量通过三层转发 ip 最后在 192.168.1.3 请求目标数据
Plain text

-socks5 用户名 : 密码 @ip: 端口
本地开启 SOCKS5 代理穿透到远程节点,可以不带 -d:

rakshasa -socks5 1080 
#不使用 -d 参数,则表示直接在本机启动一个 socks5 代理
Plain text

-remotesocks5 端口
远程开启 SOCKS5 代理流量出口到本地:

rakshasa -remotesocks5 1081  -d 192.168.1.2:1080,192.168.1.3:1080
#方向从右往左 (加上本机是 3 个节点),在 192.168.1.3 这台机器开启一个 socks5 端口 1081,流量穿透到本地节点出去
Plain text

-connect ip:port,remote_ip:remote_port
本地监听并转发到指定 IP 端口,使用场景为本机连接 teamserver,隐藏本机 IP:

rakshasa -connect 127.0.0.1:50050,192,168,1,2:50050 -d 192.168.1.3:1080,192.168.1.4:1080 
#本机 cs 连接 127.0.0.1:50050 实际上通过 1.3,1.4 节点后,再连接到 192.168.1.2:50050 teamserver,teamserver 看到你的 ip 是最后一个节点的 ip
Plain text

-bind ip:port,remote_ip:remote_port
反向代理模式,必须配合 -d 使用:

rakshasa -bind 192.168.1.2:50050,0,0,0.0:50050 -d 192.168.1.3:1080,192.168.1.4:1080
#与上面相反,在最右端节点监听端口 50050,流量到本机节点后,最终发往 192.168.1.2,最终上线 ip 为本机 ip
Plain text

-http_proxy 用户名 : 密码 @ip: 端口
启动一个 http 代理,可以不使用 -d,建议配合 -http_proxy_pool 使用代理池,自动切换代理 ip:

rakshasa -http_proxy 8080 -http_proxy_pool out.txt
Plain text

-password 密钥
各节点除了证书校验之外,还额外支持密钥连接,建议使用并定期更换密钥,以避免二进制泄露后被别人连上

rakshasa -password 123456
Plain text

-f yaml 文件
指定配置文件启动。

-help
更多启动参数使用帮助

关于开源

本作品使用 MPL 2.0 许可证,您可以下载、修改和使用本代码。然而,您必须明确表示,任何此类担保、支持、赔偿或责任义务均由您单独提供,与本作者无关。本人不承担您在使用或修改本程序所造成的任何后果或责任。

在遵循 MPL 2.0 许可证的基础上,您可以自由地对 rakshasa 进行修改和扩展,以满足您的特定需求。同时,您可以将改进和新功能贡献给社区,让更多人受益。但请注意,确保在分享和发布修改后的代码时遵守许可证要求,并尊重原作者的版权。