中文 | English
Shermie-Proxy
功能
- 支持 http、https、ws、wss、tcp、socket5 协议数据的接收和发送,只需监听一个端口
- 支持数据拦截和自定义修改
- 自动识别入站协议,根据消息头识别的不同协议进行处理
- 支持添加上层 tcp 代理,仅限一级
待办:
- tcp 连接复用
使用方法
- 安装
go get github.com/kxg3030/shermie-proxy
- 监听
package main
import (
"bufio"
"compress/gzip"
"flag"
"github.com/kxg3030/shermie-proxy/Core"
"github.com/kxg3030/shermie-proxy/Core/Websocket"
"github.com/kxg3030/shermie-proxy/Log"
"io"
"net/http"
"strings"
)
func init() {
Log.NewLogger().Init()
// 初始化根证书
err := Core.NewCertificate().Init()
if err != nil {
return
}
}
func main() {
port := flag.String("port", "9090", "监听端口")
nagle := flag.Bool("nagle", true, "连接远程使用 nagle 算法")
proxy := flag.String("proxy", "", "代理远程主机")
to := flag.String("to", "", "tcp 远程主机")
flag.Parse()
if *port == "0" {
Log.Log.Fatal("需要指定端口")
return
}
// 启动服务
s := Core.NewProxyServer(*port, *nagle, *proxy, *to)
// 注册 tcp 连接事件
s.OnTcpConnectEvent = func(conn net.Conn) {
}
// 注册 tcp 关闭事件
s.OnTcpCloseEvent = func(conn net.Conn) {
}
s.OnHttpRequestEvent = func(message []byte, request *http.Request, resolve Core.ResolveHttpRequest, conn net.Conn) bool {
Log.Log.Println("HttpRequestEvent:" + conn.RemoteAddr().String())
// 这里可以进行数据修改
resolve(message, request)
// 如果正常处理必须返回 true,如果不需要向客户端返回数据,返回 false,一般用于自己操作 conn 时
return true
}
s.OnHttpResponseEvent = func(body []byte, response *http.Response, resolve Core.ResolveHttpResponse, conn net.Conn) bool {
mimeType := response.Header.Get("Content-Type")
if strings.Contains(mimeType, "json") {
Log.Log.Println("HttpResponseEvent:" + string(body))
}
// 这里可以进行数据修改
resolve(body, response)
// 如果正常处理必须返回 true,如果不需要向客户端返回数据,返回 false,一般用于自己操作 conn 时
return true
}
s.OnSocks5ResponseEvent = func(message []byte, resolve Core.ResolveSocks5, conn net.Conn) (int, error) {
Log.Log.Println("Socks5ResponseEvent:" + string(message))
// 这里可以进行数据修改
return resolve(message)
}
s.OnSocks5RequestEvent = func(message []byte, resolve Core.ResolveSocks5, conn net.Conn) (int, error) {
Log.Log.Println("Socks5RequestEvent:" + string(message))
// 这里可以进行数据修改
return resolve(message)
}
s.OnWsRequestEvent = func(msgType int, message []byte, resolve Core.ResolveWs, conn net.Conn) error {
Log.Log.Println("WsRequestEvent:" + string(message))
// 这里可以进行数据修改
return resolve(msgType, message)
}
s.OnWsResponseEvent = func(msgType int, message []byte, resolve Core.ResolveWs, conn net.Conn) error {
Log.Log.Println("WsResponseEvent:" + string(message))
// 这里可以进行数据修改
return resolve(msgType, message)
}
s.OnTcpClientStreamEvent = func(message []byte, resolve Core.ResolveTcp, conn net.Conn) (int, error) {
Log.Log.Println("TcpClientStreamEvent:" + string(message))
// 这里可以进行数据修改
return resolve(message)
}
s.OnTcpServerStreamEvent = func(message []byte, resolve Core.ResolveTcp, conn net.Conn) (int, error) {
Log.Log.Println("TcpServerStreamEvent:" + string(message))
// 这里可以进行数据修改
return resolve(message)
}
_ = s.Start()
}
-
参数
--port: 代理服务监听的端口,默认为 9090
--to: 代理 tcp 服务时,目标服务器的 ip 和端口,默认为 0,仅 tcp 代理时使用
--proxy: 上层 tcp 代理
--nagle: 是否启用 nagle 数据合并算法,默认为 true