mirror of
https://gitee.com/konyshe/goodlink.git
synced 2025-12-24 08:13:00 +08:00
服务端支持代理功能,无需指定目标地址
This commit is contained in:
1
go.mod
1
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
|
||||
|
||||
2
go.sum
2
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=
|
||||
|
||||
86
help.go
86
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)
|
||||
}
|
||||
}
|
||||
|
||||
7
main.go
7
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)
|
||||
|
||||
23
proxy/socks5.go
Normal file
23
proxy/socks5.go
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user