服务端支持代理功能,无需指定目标地址

This commit is contained in:
kony
2024-12-13 08:48:04 +00:00
parent 90adcd677b
commit 28ad598c1d
7 changed files with 93 additions and 47 deletions

1
go.mod
View File

@@ -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

2
go.sum
View File

@@ -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=

86
help.go
View File

@@ -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)
}
}

View File

@@ -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)

23
proxy/socks5.go Normal file
View File

@@ -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)
}
}

View File

@@ -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()
}

View File

@@ -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 {