From 28ad598c1d1974484e0ecc7da92463fbfc14b246 Mon Sep 17 00:00:00 2001 From: kony <2312708932@qq.com> Date: Fri, 13 Dec 2024 08:48:04 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=97=A0=E9=9C=80?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E7=9B=AE=E6=A0=87=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 1 + go.sum | 2 ++ help.go | 86 ++++++++++++++++++++++++------------------------ main.go | 7 ++-- proxy/socks5.go | 23 +++++++++++++ tools/tools.go | 12 +++++++ tunnel/server.go | 9 +++++ 7 files changed, 93 insertions(+), 47 deletions(-) create mode 100644 proxy/socks5.go diff --git a/go.mod b/go.mod index 465d1ec..684d64e 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require gogo v0.0.0 require ( github.com/andybalholm/brotli v1.0.4 // indirect + github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 // indirect github.com/bmizerany/pq v0.0.0-20131128184720-da2b95e392c1 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/gaukas/godicttls v0.0.3 // indirect diff --git a/go.sum b/go.sum index cf7fef6..cf71f5e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bmizerany/pq v0.0.0-20131128184720-da2b95e392c1 h1:1clOQIolnXGoH1SUo8ZPgdfOWFp/6i8NuRerrVL/TAc= github.com/bmizerany/pq v0.0.0-20131128184720-da2b95e392c1/go.mod h1:YR6v6TjYGQnPky7rSf5U+AiQ4+EHIVmFYbhHUPo5L2U= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/help.go b/help.go index ad36fc6..5fafdf9 100644 --- a/help.go +++ b/help.go @@ -1,43 +1,43 @@ -package main - -import ( - "flag" - "fmt" - "gogo" - "os" -) - -var ( - m_cli_pprof_addr string - - m_cli_tun_local_addr string - m_cli_tun_remote_addr string - m_cli_redis_addr string - m_cli_redis_pass string - m_cli_redis_id int - m_cli_tun_key string -) - -func help() { - v := flag.Bool("v", false, "show version info") - - /* 没有用到的参数 */ - var temp_value int64 - flag.Int64Var(&temp_value, "gogo-restart-delay", 100, "gogo-restart-delay") - flag.Bool("gogo-background", false, "gogo-background") - - flag.StringVar(&m_cli_pprof_addr, "pprof_addr", "", "提供性能检测的访问地址, 例如: 0.0.0.0:6060") - flag.StringVar(&m_cli_redis_addr, "redis_addr", "", "redis访问地址, 例如: 1.1.2.2:6379") - flag.StringVar(&m_cli_redis_pass, "redis_pass", "", "redis访问密码, 例如: 12345678") - flag.IntVar(&m_cli_redis_id, "redis_id", 0, "redis可用的表ID") - flag.StringVar(&m_cli_tun_local_addr, "local", "", "客户端提供穿透服务的监听地址, 例如: 127.0.0.1:9022") - flag.StringVar(&m_cli_tun_remote_addr, "remote", "", "服务端连接目标服务的地址, 例如: 192.168.3.2:22") - flag.StringVar(&m_cli_tun_key, "key", "", "隧道Key, 请保证客户端和服务端一致") - - flag.Parse() - - if *v { - fmt.Print(gogo.BuildVersion()) - os.Exit(0) - } -} +package main + +import ( + "flag" + "fmt" + "gogo" + "os" +) + +var ( + m_cli_pprof_addr string + + m_cli_tun_local_addr string + m_cli_tun_remote_addr string + m_cli_redis_addr string + m_cli_redis_pass string + m_cli_redis_id int + m_cli_tun_key string +) + +func help() { + v := flag.Bool("v", false, "show version info") + + /* 没有用到的参数 */ + var temp_value int64 + flag.Int64Var(&temp_value, "gogo-restart-delay", 100, "gogo-restart-delay") + flag.Bool("gogo-background", false, "gogo-background") + + flag.StringVar(&m_cli_pprof_addr, "pprof_addr", "", "提供性能检测的访问地址, 例如: 0.0.0.0:6060") + flag.StringVar(&m_cli_redis_addr, "redis_addr", "", "redis访问地址, 例如: 1.1.2.2:6379") + flag.StringVar(&m_cli_redis_pass, "redis_pass", "", "redis访问密码, 例如: 12345678") + flag.IntVar(&m_cli_redis_id, "redis_id", 0, "redis可用的表ID") + flag.StringVar(&m_cli_tun_local_addr, "local", "", "客户端提供穿透服务的监听地址, 例如: 127.0.0.1:9022") + flag.StringVar(&m_cli_tun_remote_addr, "remote", "", "服务端连接目标服务的地址, 例如: 192.168.3.2:22") + flag.StringVar(&m_cli_tun_key, "key", "", "隧道Key, 请保证客户端和服务端一致") + + flag.Parse() + + if *v { + fmt.Print(gogo.BuildVersion()) + os.Exit(0) + } +} diff --git a/main.go b/main.go index 8c91785..89a4a46 100644 --- a/main.go +++ b/main.go @@ -16,16 +16,15 @@ func main2() { go log.Println(http.ListenAndServe(m_cli_pprof_addr, nil)) } - if m_cli_tun_remote_addr != "" { - go tunnel.ProcessServer(m_cli_tun_remote_addr, m_cli_redis_addr, m_cli_redis_pass, m_cli_redis_id, m_cli_tun_key) - - } else if m_cli_tun_local_addr != "" { + if m_cli_tun_local_addr != "" { go func() { if err := tunnel.ProcessClient(m_cli_tun_local_addr, m_cli_redis_addr, m_cli_redis_pass, m_cli_redis_id, m_cli_tun_key, true); err != nil { log.Println(err) os.Exit(0) } }() + } else { + go tunnel.ProcessServer(m_cli_tun_remote_addr, m_cli_redis_addr, m_cli_redis_pass, m_cli_redis_id, m_cli_tun_key) } ch := make(chan os.Signal, 1) diff --git a/proxy/socks5.go b/proxy/socks5.go new file mode 100644 index 0000000..d788856 --- /dev/null +++ b/proxy/socks5.go @@ -0,0 +1,23 @@ +package proxy + +import ( + "log" + + "github.com/armon/go-socks5" +) + +func ListenSocks5(addr string) { + // Create a SOCKS5 server + conf := &socks5.Config{} + server, err := socks5.New(conf) + if err != nil { + panic(err) + } + + log.Printf("ListenSocks5: %v\n", addr) + + // Create SOCKS5 proxy on addr + if err := server.ListenAndServe("tcp", addr); err != nil { + panic(err) + } +} diff --git a/tools/tools.go b/tools/tools.go index c55a583..d482260 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "io" "log" + "net" ) func AssertErrorToNilf(message string, err error) { @@ -21,3 +22,14 @@ func RandomString(length int) string { } return base64.StdEncoding.EncodeToString(k) } + +// 检测未使用的端口 +func GetFreeLocalAddr() string { + listener, err := net.Listen("tcp", "localhost:0") + if err != nil { + return "" + } + defer listener.Close() // 确保在函数退出时关闭监听器 + + return listener.Addr().String() +} diff --git a/tunnel/server.go b/tunnel/server.go index 2623520..3d2abec 100644 --- a/tunnel/server.go +++ b/tunnel/server.go @@ -200,6 +200,15 @@ func ProcessServer(tun_remote_addr, redis_addr, redis_pass string, radis_id int, redisdb.Del(tun_key) + if tun_remote_addr == "" { + tun_remote_addr = tools.GetFreeLocalAddr() + if tun_remote_addr == "" { + log.Println("获取本地端口失败") + os.Exit(0) + } + go proxy.ListenSocks5(tun_remote_addr) + } + for { if res, err := redisdb.Get(tun_key).Bytes(); err == nil && res != nil && len(res) > 0 { if err = json.Unmarshal(res, &redisJson); err == nil {