From e116bf88978086adef1653d53eaa26f47fc84609 Mon Sep 17 00:00:00 2001 From: "arraykeys@gmail.com" Date: Fri, 14 Sep 2018 16:12:56 +0800 Subject: [PATCH] update kcpcfg import path --- CHANGELOG | 4 ++ config.go | 28 ++++++++--- core/cs/client/client.go | 3 ++ sdk/android-ios/dns.go | 6 +-- sdk/android-ios/sdk.go | 21 +++++++-- services/http/http.go | 4 +- services/mux/mux_bridge.go | 45 ++++++++++-------- services/mux/mux_client.go | 39 +++++++++++----- services/mux/mux_server.go | 32 ++++++++++--- services/socks/socks.go | 2 +- services/sps/sps.go | 2 +- services/tcp/tcp.go | 8 ++-- utils/functions.go | 95 +------------------------------------- utils/serve-channel.go | 2 +- 14 files changed, 136 insertions(+), 155 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7dafe31..6b4f7c3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,10 @@ proxy更新日志 v6.1 1.黑白名单支持设置顶级域了,比如:com,匹配所有的.com域名 2.优化TCPS内存释放. +3.优化了域名检查. +4.内网穿透增加了TCPS和TOU协议, + TCPS提供了多种自定义加密TCP方式传输. + TOU提供了TCP over UDP,多种自定义加密UDP方式传输TCP数据. v6.0 企业版开源啦 本次更新主要是把企业版开源,把企业版代码合并到现在的开源goproxy当中,继续遵循GPLv3,免费开源, diff --git a/config.go b/config.go index a8ddb40..6098db2 100755 --- a/config.go +++ b/config.go @@ -12,12 +12,14 @@ import ( "path/filepath" "runtime/debug" "runtime/pprof" + "strings" "time" + "github.com/snail007/goproxy/core/lib/kcpcfg" + encryptconn "github.com/snail007/goproxy/core/lib/transport/encrypt" sdk "github.com/snail007/goproxy/sdk/android-ios" services "github.com/snail007/goproxy/services" httpx "github.com/snail007/goproxy/services/http" - "github.com/snail007/goproxy/services/kcpcfg" keygenx "github.com/snail007/goproxy/services/keygen" mux "github.com/snail007/goproxy/services/mux" socksx "github.com/snail007/goproxy/services/socks" @@ -147,7 +149,7 @@ func initConfig() (err error) { //########mux-server######### muxServer := app.Command("server", "proxy on mux server mode") muxServerArgs.Parent = muxServer.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() - muxServerArgs.ParentType = muxServer.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "kcp") + muxServerArgs.ParentType = muxServer.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "tcps", "kcp", "tou") muxServerArgs.CertFile = muxServer.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() muxServerArgs.KeyFile = muxServer.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxServerArgs.Timeout = muxServer.Flag("timeout", "tcp timeout with milliseconds").Short('i').Default("2000").Int() @@ -157,11 +159,15 @@ func initConfig() (err error) { muxServerArgs.IsCompress = muxServer.Flag("c", "compress data when tcp|tls mode").Default("false").Bool() muxServerArgs.SessionCount = muxServer.Flag("session-count", "session count which connect to bridge").Short('n').Default("10").Int() muxServerArgs.Jumper = muxServer.Flag("jumper", "https or socks5 proxies used when connecting to parent, only worked of -T is tls or tcp, format is https://username:password@host:port https://host:port or socks5://username:password@host:port socks5://host:port").Short('J').Default("").String() + muxServerArgs.TCPSMethod = muxServer.Flag("tcps-method", "method of parent tcps's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxServerArgs.TCPSPassword = muxServer.Flag("tcps-password", "password of parent tcps's encrpyt/decrypt").Default("snail007's_goproxy").String() + muxServerArgs.TOUMethod = muxServer.Flag("tou-method", "method of parent tou's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxServerArgs.TOUPassword = muxServer.Flag("tou-password", "password of parent tou's encrpyt/decrypt").Default("snail007's_goproxy").String() //########mux-client######### muxClient := app.Command("client", "proxy on mux client mode") muxClientArgs.Parent = muxClient.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() - muxClientArgs.ParentType = muxClient.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "kcp") + muxClientArgs.ParentType = muxClient.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "tcps", "kcp", "tou") muxClientArgs.CertFile = muxClient.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() muxClientArgs.KeyFile = muxClient.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxClientArgs.Timeout = muxClient.Flag("timeout", "tcp timeout with milliseconds").Short('i').Default("2000").Int() @@ -169,6 +175,10 @@ func initConfig() (err error) { muxClientArgs.IsCompress = muxClient.Flag("c", "compress data when tcp|tls mode").Default("false").Bool() muxClientArgs.SessionCount = muxClient.Flag("session-count", "session count which connect to bridge").Short('n').Default("10").Int() muxClientArgs.Jumper = muxClient.Flag("jumper", "https or socks5 proxies used when connecting to parent, only worked of -T is tls or tcp, format is https://username:password@host:port https://host:port or socks5://username:password@host:port socks5://host:port").Short('J').Default("").String() + muxClientArgs.TCPSMethod = muxClient.Flag("tcps-method", "method of parent tcps's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxClientArgs.TCPSPassword = muxClient.Flag("tcps-password", "password of parent tcps's encrpyt/decrypt").Default("snail007's_goproxy").String() + muxClientArgs.TOUMethod = muxClient.Flag("tou-method", "method of parent tou's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxClientArgs.TOUPassword = muxClient.Flag("tou-password", "password of parent tou's encrpyt/decrypt").Default("snail007's_goproxy").String() //########mux-bridge######### muxBridge := app.Command("bridge", "proxy on mux bridge mode") @@ -176,7 +186,11 @@ func initConfig() (err error) { muxBridgeArgs.KeyFile = muxBridge.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxBridgeArgs.Timeout = muxBridge.Flag("timeout", "tcp timeout with milliseconds").Short('i').Default("2000").Int() muxBridgeArgs.Local = muxBridge.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String() - muxBridgeArgs.LocalType = muxBridge.Flag("local-type", "local protocol type ").Default("tls").Short('t').Enum("tls", "tcp", "kcp") + muxBridgeArgs.LocalType = muxBridge.Flag("local-type", "local protocol type ").Default("tls").Short('t').Enum("tls", "tcp", "tcps", "kcp", "tou") + muxBridgeArgs.TCPSMethod = muxBridge.Flag("tcps-method", "method of local tcps's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxBridgeArgs.TCPSPassword = muxBridge.Flag("tcps-password", "password of local tcps's encrpyt/decrypt").Default("snail007's_goproxy").String() + muxBridgeArgs.TOUMethod = muxBridge.Flag("tou-method", "method of local tou's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxBridgeArgs.TOUPassword = muxBridge.Flag("tou-password", "password of local tou's encrpyt/decrypt").Default("snail007's_goproxy").String() //########tunnel-server######### tunnelServer := app.Command("tserver", "proxy on tunnel server mode") @@ -418,7 +432,7 @@ func initConfig() (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() for { @@ -442,7 +456,7 @@ func initConfig() (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() for scanner.Scan() { @@ -452,7 +466,7 @@ func initConfig() (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() for scannerStdErr.Scan() { diff --git a/core/cs/client/client.go b/core/cs/client/client.go index 43d5aa9..3e13a07 100644 --- a/core/cs/client/client.go +++ b/core/cs/client/client.go @@ -35,6 +35,9 @@ func TlsConnect(host string, port, timeout int, certBytes, keyBytes, caCertBytes } return *tls.Client(_conn, conf), err } +func TlsConfig(certBytes, keyBytes, caCertBytes []byte) (conf *tls.Config, err error) { + return getRequestTlsConfig(certBytes, keyBytes, caCertBytes) +} func getRequestTlsConfig(certBytes, keyBytes, caCertBytes []byte) (conf *tls.Config, err error) { var cert tls.Certificate diff --git a/sdk/android-ios/dns.go b/sdk/android-ios/dns.go index c4c7afd..b8edfde 100644 --- a/sdk/android-ios/dns.go +++ b/sdk/android-ios/dns.go @@ -13,8 +13,8 @@ import ( "github.com/miekg/dns" gocache "github.com/pmylund/go-cache" + "github.com/snail007/goproxy/core/lib/kcpcfg" services "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" ) type DNSArgs struct { @@ -60,7 +60,7 @@ func (s *DNS) InitService() (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() for { @@ -142,7 +142,7 @@ func (s *DNS) Start(args interface{}, log *logger.Logger) (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() log.Printf("dns server on udp %s", *s.cfg.Local) diff --git a/sdk/android-ios/sdk.go b/sdk/android-ios/sdk.go index 7178e03..1eb1252 100644 --- a/sdk/android-ios/sdk.go +++ b/sdk/android-ios/sdk.go @@ -10,9 +10,10 @@ import ( "path/filepath" "strings" + "github.com/snail007/goproxy/core/lib/kcpcfg" + encryptconn "github.com/snail007/goproxy/core/lib/transport/encrypt" "github.com/snail007/goproxy/services" httpx "github.com/snail007/goproxy/services/http" - "github.com/snail007/goproxy/services/kcpcfg" keygenx "github.com/snail007/goproxy/services/keygen" mux "github.com/snail007/goproxy/services/mux" socksx "github.com/snail007/goproxy/services/socks" @@ -166,7 +167,7 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) //########mux-server######### muxServer := app.Command("server", "proxy on mux server mode") muxServerArgs.Parent = muxServer.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() - muxServerArgs.ParentType = muxServer.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "kcp") + muxServerArgs.ParentType = muxServer.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "tcps", "kcp", "tou") muxServerArgs.CertFile = muxServer.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() muxServerArgs.KeyFile = muxServer.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxServerArgs.Timeout = muxServer.Flag("timeout", "tcp timeout with milliseconds").Short('i').Default("2000").Int() @@ -176,11 +177,15 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) muxServerArgs.IsCompress = muxServer.Flag("c", "compress data when tcp|tls mode").Default("false").Bool() muxServerArgs.SessionCount = muxServer.Flag("session-count", "session count which connect to bridge").Short('n').Default("10").Int() muxServerArgs.Jumper = muxServer.Flag("jumper", "https or socks5 proxies used when connecting to parent, only worked of -T is tls or tcp, format is https://username:password@host:port https://host:port or socks5://username:password@host:port socks5://host:port").Short('J').Default("").String() + muxServerArgs.TCPSMethod = muxServer.Flag("tcps-method", "method of parent tcps's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxServerArgs.TCPSPassword = muxServer.Flag("tcps-password", "password of parent tcps's encrpyt/decrypt").Default("snail007's_goproxy").String() + muxServerArgs.TOUMethod = muxServer.Flag("tou-method", "method of parent tou's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxServerArgs.TOUPassword = muxServer.Flag("tou-password", "password of parent tou's encrpyt/decrypt").Default("snail007's_goproxy").String() //########mux-client######### muxClient := app.Command("client", "proxy on mux client mode") muxClientArgs.Parent = muxClient.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() - muxClientArgs.ParentType = muxClient.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "kcp") + muxClientArgs.ParentType = muxClient.Flag("parent-type", "parent protocol type ").Default("tls").Short('T').Enum("tls", "tcp", "tcps", "kcp", "tou") muxClientArgs.CertFile = muxClient.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() muxClientArgs.KeyFile = muxClient.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxClientArgs.Timeout = muxClient.Flag("timeout", "tcp timeout with milliseconds").Short('i').Default("2000").Int() @@ -188,6 +193,10 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) muxClientArgs.IsCompress = muxClient.Flag("c", "compress data when tcp|tls mode").Default("false").Bool() muxClientArgs.SessionCount = muxClient.Flag("session-count", "session count which connect to bridge").Short('n').Default("10").Int() muxClientArgs.Jumper = muxClient.Flag("jumper", "https or socks5 proxies used when connecting to parent, only worked of -T is tls or tcp, format is https://username:password@host:port https://host:port or socks5://username:password@host:port socks5://host:port").Short('J').Default("").String() + muxClientArgs.TCPSMethod = muxClient.Flag("tcps-method", "method of parent tcps's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxClientArgs.TCPSPassword = muxClient.Flag("tcps-password", "password of parent tcps's encrpyt/decrypt").Default("snail007's_goproxy").String() + muxClientArgs.TOUMethod = muxClient.Flag("tou-method", "method of parent tou's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxClientArgs.TOUPassword = muxClient.Flag("tou-password", "password of parent tou's encrpyt/decrypt").Default("snail007's_goproxy").String() //########mux-bridge######### muxBridge := app.Command("bridge", "proxy on mux bridge mode") @@ -195,7 +204,11 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) muxBridgeArgs.KeyFile = muxBridge.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxBridgeArgs.Timeout = muxBridge.Flag("timeout", "tcp timeout with milliseconds").Short('i').Default("2000").Int() muxBridgeArgs.Local = muxBridge.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String() - muxBridgeArgs.LocalType = muxBridge.Flag("local-type", "local protocol type ").Default("tls").Short('t').Enum("tls", "tcp", "kcp") + muxBridgeArgs.LocalType = muxBridge.Flag("local-type", "local protocol type ").Default("tls").Short('t').Enum("tls", "tcp", "tcps", "kcp", "tou") + muxBridgeArgs.TCPSMethod = muxBridge.Flag("tcps-method", "method of local tcps's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxBridgeArgs.TCPSPassword = muxBridge.Flag("tcps-password", "password of local tcps's encrpyt/decrypt").Default("snail007's_goproxy").String() + muxBridgeArgs.TOUMethod = muxBridge.Flag("tou-method", "method of local tou's encrpyt/decrypt, these below are supported :\n"+strings.Join(encryptconn.GetCipherMethods(), ",")).Default("aes-192-cfb").String() + muxBridgeArgs.TOUPassword = muxBridge.Flag("tou-password", "password of local tou's encrpyt/decrypt").Default("snail007's_goproxy").String() //########tunnel-server######### tunnelServer := app.Command("tserver", "proxy on tunnel server mode") diff --git a/services/http/http.go b/services/http/http.go index 0997f80..10b53a7 100644 --- a/services/http/http.go +++ b/services/http/http.go @@ -12,8 +12,8 @@ import ( "strings" "time" + "github.com/snail007/goproxy/core/lib/kcpcfg" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" "github.com/snail007/goproxy/utils/datasize" "github.com/snail007/goproxy/utils/dnsx" "github.com/snail007/goproxy/utils/iolimiter" @@ -183,7 +183,7 @@ func (s *HTTP) InitService() (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() //循环检查ssh网络连通性 diff --git a/services/mux/mux_bridge.go b/services/mux/mux_bridge.go index 37128f4..b44b18a 100644 --- a/services/mux/mux_bridge.go +++ b/services/mux/mux_bridge.go @@ -8,30 +8,33 @@ import ( "math/rand" "net" "runtime/debug" - "strconv" "strings" "sync" "time" + srvtransport "github.com/snail007/goproxy/core/cs/server" + "github.com/snail007/goproxy/core/lib/kcpcfg" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" "github.com/snail007/goproxy/utils" "github.com/snail007/goproxy/utils/mapx" - //"github.com/xtaci/smux" smux "github.com/hashicorp/yamux" ) type MuxBridgeArgs struct { - CertFile *string - KeyFile *string - CertBytes []byte - KeyBytes []byte - Local *string - LocalType *string - Timeout *int - IsCompress *bool - KCP kcpcfg.KCPConfigArgs + CertFile *string + KeyFile *string + CertBytes []byte + KeyBytes []byte + Local *string + LocalType *string + Timeout *int + IsCompress *bool + KCP kcpcfg.KCPConfigArgs + TCPSMethod *string + TCPSPassword *string + TOUMethod *string + TOUPassword *string } type MuxBridge struct { cfg MuxBridgeArgs @@ -40,7 +43,7 @@ type MuxBridge struct { router utils.ClientKeyRouter l *sync.Mutex isStop bool - sc *utils.ServerChannel + sc *srvtransport.ServerChannel log *logger.Logger } @@ -112,15 +115,17 @@ func (s *MuxBridge) Start(args interface{}, log *logger.Logger) (err error) { return } - host, port, _ := net.SplitHostPort(*s.cfg.Local) - p, _ := strconv.Atoi(port) - sc := utils.NewServerChannel(host, p, s.log) + sc := srvtransport.NewServerChannelHost(*s.cfg.Local, s.log) if *s.cfg.LocalType == "tcp" { err = sc.ListenTCP(s.handler) } else if *s.cfg.LocalType == "tls" { - err = sc.ListenTls(s.cfg.CertBytes, s.cfg.KeyBytes, nil, s.handler) + err = sc.ListenTLS(s.cfg.CertBytes, s.cfg.KeyBytes, nil, s.handler) } else if *s.cfg.LocalType == "kcp" { err = sc.ListenKCP(s.cfg.KCP, s.handler, s.log) + } else if *s.cfg.LocalType == "tcps" { + err = sc.ListenTCPS(*s.cfg.TCPSMethod, *s.cfg.TCPSPassword, false, s.handler) + } else if *s.cfg.LocalType == "tou" { + err = sc.ListenTOU(*s.cfg.TOUMethod, *s.cfg.TOUPassword, false, s.handler) } if err != nil { return @@ -219,7 +224,7 @@ func (s *MuxBridge) handler(inConn net.Conn) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() for { @@ -292,7 +297,7 @@ func (s *MuxBridge) callback(inConn net.Conn, serverID, key string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() io.Copy(stream, inConn) @@ -301,7 +306,7 @@ func (s *MuxBridge) callback(inConn net.Conn, serverID, key string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() io.Copy(inConn, stream) diff --git a/services/mux/mux_client.go b/services/mux/mux_client.go index 9eb2b9f..662748a 100644 --- a/services/mux/mux_client.go +++ b/services/mux/mux_client.go @@ -10,13 +10,14 @@ import ( "strings" "time" + "github.com/golang/snappy" + clienttransport "github.com/snail007/goproxy/core/cs/client" + "github.com/snail007/goproxy/core/lib/kcpcfg" + encryptconn "github.com/snail007/goproxy/core/lib/transport/encrypt" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" "github.com/snail007/goproxy/utils" "github.com/snail007/goproxy/utils/jumper" "github.com/snail007/goproxy/utils/mapx" - - "github.com/golang/snappy" //"github.com/xtaci/smux" smux "github.com/hashicorp/yamux" ) @@ -34,6 +35,10 @@ type MuxClientArgs struct { SessionCount *int KCP kcpcfg.KCPConfigArgs Jumper *string + TCPSMethod *string + TCPSPassword *string + TOUMethod *string + TOUPassword *string } type ClientUDPConnItem struct { conn *smux.Stream @@ -222,7 +227,7 @@ func (s *MuxClient) getParentConn() (conn net.Conn, err error) { if *s.cfg.ParentType == "tls" { if s.jumper == nil { var _conn tls.Conn - _conn, err = utils.TlsConnectHost(*s.cfg.Parent, *s.cfg.Timeout, s.cfg.CertBytes, s.cfg.KeyBytes, nil) + _conn, err = clienttransport.TlsConnectHost(*s.cfg.Parent, *s.cfg.Timeout, s.cfg.CertBytes, s.cfg.KeyBytes, nil) if err == nil { conn = net.Conn(&_conn) } @@ -239,10 +244,22 @@ func (s *MuxClient) getParentConn() (conn net.Conn, err error) { } } else if *s.cfg.ParentType == "kcp" { - conn, err = utils.ConnectKCPHost(*s.cfg.Parent, s.cfg.KCP) + conn, err = clienttransport.KCPConnectHost(*s.cfg.Parent, s.cfg.KCP) + } else if *s.cfg.ParentType == "tcps" { + if s.jumper == nil { + conn, err = clienttransport.TCPSConnectHost(*s.cfg.Parent, *s.cfg.TCPSMethod, *s.cfg.TCPSPassword, false, *s.cfg.Timeout) + } else { + conn, err = s.jumper.Dial(*s.cfg.Parent, time.Millisecond*time.Duration(*s.cfg.Timeout)) + if err == nil { + conn, err = encryptconn.NewConn(conn, *s.cfg.TCPSMethod, *s.cfg.TCPSPassword) + } + } + + } else if *s.cfg.ParentType == "tou" { + conn, err = clienttransport.TOUConnectHost(*s.cfg.Parent, *s.cfg.TCPSMethod, *s.cfg.TCPSPassword, false, *s.cfg.Timeout) } else { if s.jumper == nil { - conn, err = utils.ConnectHost(*s.cfg.Parent, *s.cfg.Timeout) + conn, err = clienttransport.TCPConnectHost(*s.cfg.Parent, *s.cfg.Timeout) } else { conn, err = s.jumper.Dial(*s.cfg.Parent, time.Millisecond*time.Duration(*s.cfg.Timeout)) } @@ -306,7 +323,7 @@ func (s *MuxClient) UDPRevecive(key, ID string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() s.log.Printf("udp conn %s connected", ID) @@ -336,7 +353,7 @@ func (s *MuxClient) UDPRevecive(key, ID string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() cui.conn.SetWriteDeadline(time.Now().Add(time.Millisecond * time.Duration(*s.cfg.Timeout))) @@ -355,7 +372,7 @@ func (s *MuxClient) UDPGCDeamon() { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() if s.isStop { @@ -414,7 +431,7 @@ func (s *MuxClient) ServeConn(inConn *smux.Stream, localAddr, ID string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() io.Copy(outConn, snappy.NewReader(inConn)) @@ -423,7 +440,7 @@ func (s *MuxClient) ServeConn(inConn *smux.Stream, localAddr, ID string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() io.Copy(snappy.NewWriter(inConn), outConn) diff --git a/services/mux/mux_server.go b/services/mux/mux_server.go index e6faffa..f2be351 100644 --- a/services/mux/mux_server.go +++ b/services/mux/mux_server.go @@ -12,8 +12,10 @@ import ( "strings" "time" + clienttransport "github.com/snail007/goproxy/core/cs/client" + "github.com/snail007/goproxy/core/lib/kcpcfg" + encryptconn "github.com/snail007/goproxy/core/lib/transport/encrypt" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" "github.com/snail007/goproxy/utils" "github.com/snail007/goproxy/utils/jumper" "github.com/snail007/goproxy/utils/mapx" @@ -47,6 +49,10 @@ type MuxServerArgs struct { SessionCount *int KCP kcpcfg.KCPConfigArgs Jumper *string + TCPSMethod *string + TCPSPassword *string + TOUMethod *string + TOUPassword *string } type MuxServer struct { cfg MuxServerArgs @@ -293,7 +299,7 @@ func (s *MuxServer) Start(args interface{}, log *logger.Logger) (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() io.Copy(inConn, snappy.NewReader(outConn)) @@ -302,7 +308,7 @@ func (s *MuxServer) Start(args interface{}, log *logger.Logger) (err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() io.Copy(snappy.NewWriter(outConn), inConn) @@ -397,7 +403,7 @@ func (s *MuxServer) GetConn(index string) (conn net.Conn, err error) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() for { @@ -443,6 +449,18 @@ func (s *MuxServer) getParentConn() (conn net.Conn, err error) { } else if *s.cfg.ParentType == "kcp" { conn, err = utils.ConnectKCPHost(*s.cfg.Parent, s.cfg.KCP) + } else if *s.cfg.ParentType == "tcps" { + if s.jumper == nil { + conn, err = clienttransport.TCPSConnectHost(*s.cfg.Parent, *s.cfg.TCPSMethod, *s.cfg.TCPSPassword, false, *s.cfg.Timeout) + } else { + conn, err = s.jumper.Dial(*s.cfg.Parent, time.Millisecond*time.Duration(*s.cfg.Timeout)) + if err == nil { + conn, err = encryptconn.NewConn(conn, *s.cfg.TCPSMethod, *s.cfg.TCPSPassword) + } + } + + } else if *s.cfg.ParentType == "tou" { + conn, err = clienttransport.TOUConnectHost(*s.cfg.Parent, *s.cfg.TCPSMethod, *s.cfg.TCPSPassword, false, *s.cfg.Timeout) } else { if s.jumper == nil { conn, err = utils.ConnectHost(*s.cfg.Parent, *s.cfg.Timeout) @@ -457,7 +475,7 @@ func (s *MuxServer) UDPGCDeamon() { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() if s.isStop { @@ -536,7 +554,7 @@ func (s *MuxServer) UDPRevecive(key, ID string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() s.log.Printf("udp conn %s connected", ID) @@ -569,7 +587,7 @@ func (s *MuxServer) UDPRevecive(key, ID string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() s.sc.UDPListener.WriteToUDP(body, uc.srcAddr) diff --git a/services/socks/socks.go b/services/socks/socks.go index c5790ea..14abee8 100644 --- a/services/socks/socks.go +++ b/services/socks/socks.go @@ -13,7 +13,7 @@ import ( "time" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" + "github.com/snail007/goproxy/core/lib/kcpcfg" "github.com/snail007/goproxy/utils" "github.com/snail007/goproxy/utils/conncrypt" "github.com/snail007/goproxy/utils/datasize" diff --git a/services/sps/sps.go b/services/sps/sps.go index d48e9e5..589cbeb 100644 --- a/services/sps/sps.go +++ b/services/sps/sps.go @@ -15,8 +15,8 @@ import ( "strings" "time" + "github.com/snail007/goproxy/core/lib/kcpcfg" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" "github.com/snail007/goproxy/utils" "github.com/snail007/goproxy/utils/conncrypt" "github.com/snail007/goproxy/utils/datasize" diff --git a/services/tcp/tcp.go b/services/tcp/tcp.go index f35b5d2..4b92c3c 100644 --- a/services/tcp/tcp.go +++ b/services/tcp/tcp.go @@ -9,8 +9,8 @@ import ( "strings" "time" + "github.com/snail007/goproxy/core/lib/kcpcfg" "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" "github.com/snail007/goproxy/utils" "github.com/snail007/goproxy/utils/jumper" "github.com/snail007/goproxy/utils/mapx" @@ -256,7 +256,7 @@ func (s *TCP) UDPRevecive(key string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() s.log.Printf("udp conn %s connected", key) @@ -286,7 +286,7 @@ func (s *TCP) UDPRevecive(key string) { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() (*cui.conn).SetWriteDeadline(time.Now().Add(time.Millisecond * time.Duration(*s.cfg.Timeout))) @@ -305,7 +305,7 @@ func (s *TCP) UDPGCDeamon() { go func() { defer func() { if e := recover(); e != nil { - fmt.Printf("crashed, err: %s\nstack:",e, string(debug.Stack())) + fmt.Printf("crashed, err: %s\nstack:", e, string(debug.Stack())) } }() if s.isStop { diff --git a/utils/functions.go b/utils/functions.go index a00d334..56f91be 100755 --- a/utils/functions.go +++ b/utils/functions.go @@ -20,10 +20,9 @@ import ( "net" "net/http" "os" - "os/exec" "strings" - "github.com/snail007/goproxy/services/kcpcfg" + "github.com/snail007/goproxy/core/lib/kcpcfg" "github.com/snail007/goproxy/utils/lb" "golang.org/x/crypto/pbkdf2" @@ -245,98 +244,6 @@ func CloseConn(conn *net.Conn) { (*conn).Close() } } -func Keygen() (err error) { - CList := []string{"AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AR", "AT", "AU", "AZ", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BR", "BS", "BW", "BY", "BZ", "CA", "CF", "CG", "CH", "CK", "CL", "CM", "CN", "CO", "CR", "CS", "CU", "CY", "CZ", "DE", "DJ", "DK", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FJ", "FR", "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GM", "GN", "GR", "GT", "GU", "GY", "HK", "HN", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KP", "KR", "KT", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "ML", "MM", "MN", "MO", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PR", "PT", "PY", "QA", "RO", "RU", "SA", "SB", "SC", "SD", "SE", "SG", "SI", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TD", "TG", "TH", "TJ", "TM", "TN", "TO", "TR", "TT", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "YE", "YU", "ZA", "ZM", "ZR", "ZW"} - domainSubfixList := []string{".com", ".edu", ".gov", ".int", ".mil", ".net", ".org", ".biz", ".info", ".pro", ".name", ".museum", ".coop", ".aero", ".xxx", ".idv", ".ac", ".ad", ".ae", ".af", ".ag", ".ai", ".al", ".am", ".an", ".ao", ".aq", ".ar", ".as", ".at", ".au", ".aw", ".az", ".ba", ".bb", ".bd", ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bm", ".bn", ".bo", ".br", ".bs", ".bt", ".bv", ".bw", ".by", ".bz", ".ca", ".cc", ".cd", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl", ".cm", ".cn", ".co", ".cr", ".cu", ".cv", ".cx", ".cy", ".cz", ".de", ".dj", ".dk", ".dm", ".do", ".dz", ".ec", ".ee", ".eg", ".eh", ".er", ".es", ".et", ".eu", ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", ".ga", ".gd", ".ge", ".gf", ".gg", ".gh", ".gi", ".gl", ".gm", ".gn", ".gp", ".gq", ".gr", ".gs", ".gt", ".gu", ".gw", ".gy", ".hk", ".hm", ".hn", ".hr", ".ht", ".hu", ".id", ".ie", ".il", ".im", ".in", ".io", ".iq", ".ir", ".is", ".it", ".je", ".jm", ".jo", ".jp", ".ke", ".kg", ".kh", ".ki", ".km", ".kn", ".kp", ".kr", ".kw", ".ky", ".kz", ".la", ".lb", ".lc", ".li", ".lk", ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", ".ma", ".mc", ".md", ".mg", ".mh", ".mk", ".ml", ".mm", ".mn", ".mo", ".mp", ".mq", ".mr", ".ms", ".mt", ".mu", ".mv", ".mw", ".mx", ".my", ".mz", ".na", ".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nu", ".nz", ".om", ".pa", ".pe", ".pf", ".pg", ".ph", ".pk", ".pl", ".pm", ".pn", ".pr", ".ps", ".pt", ".pw", ".py", ".qa", ".re", ".ro", ".ru", ".rw", ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si", ".sj", ".sk", ".sl", ".sm", ".sn", ".so", ".sr", ".st", ".sv", ".sy", ".sz", ".tc", ".td", ".tf", ".tg", ".th", ".tj", ".tk", ".tl", ".tm", ".tn", ".to", ".tp", ".tr", ".tt", ".tv", ".tw", ".tz", ".ua", ".ug", ".uk", ".um", ".us", ".uy", ".uz", ".va", ".vc", ".ve", ".vg", ".vi", ".vn", ".vu", ".wf", ".ws", ".ye", ".yt", ".yu", ".yr", ".za", ".zm", ".zw"} - C := CList[int(RandInt(4))%len(CList)] - ST := RandString(int(RandInt(4) % 10)) - O := RandString(int(RandInt(4) % 10)) - CN := strings.ToLower(RandString(int(RandInt(4)%10)) + domainSubfixList[int(RandInt(4))%len(domainSubfixList)]) - //log.Printf("C: %s, ST: %s, O: %s, CN: %s", C, ST, O, CN) - var out []byte - if len(os.Args) == 3 && os.Args[2] == "ca" { - cmd := exec.Command("sh", "-c", "openssl genrsa -out ca.key 2048") - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - fmt.Println(string(out)) - - cmdStr := fmt.Sprintf("openssl req -new -key ca.key -x509 -days 36500 -out ca.crt -subj /C=%s/ST=%s/O=%s/CN=%s", C, ST, O, "*."+CN) - cmd = exec.Command("sh", "-c", cmdStr) - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - fmt.Println(string(out)) - } else if len(os.Args) == 5 && os.Args[2] == "ca" && os.Args[3] != "" && os.Args[4] != "" { - certBytes, _ := ioutil.ReadFile("ca.crt") - block, _ := pem.Decode(certBytes) - if block == nil || certBytes == nil { - panic("failed to parse ca certificate PEM") - } - x509Cert, _ := x509.ParseCertificate(block.Bytes) - if x509Cert == nil { - panic("failed to parse block") - } - name := os.Args[3] - days := os.Args[4] - cmd := exec.Command("sh", "-c", "openssl genrsa -out "+name+".key 2048") - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - fmt.Println(string(out)) - - cmdStr := fmt.Sprintf("openssl req -new -key %s.key -out %s.csr -subj /C=%s/ST=%s/O=%s/CN=%s", name, name, C, ST, O, CN) - fmt.Printf("%s", cmdStr) - cmd = exec.Command("sh", "-c", cmdStr) - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - fmt.Println(string(out)) - - cmdStr = fmt.Sprintf("openssl x509 -req -days %s -in %s.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out %s.crt", days, name, name) - fmt.Printf("%s", cmdStr) - cmd = exec.Command("sh", "-c", cmdStr) - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - - fmt.Println(string(out)) - } else if len(os.Args) == 3 && os.Args[2] == "usage" { - fmt.Println(`proxy keygen //generate proxy.crt and proxy.key -proxy keygen ca //generate ca.crt and ca.key -proxy keygen ca client0 30 //generate client0.crt client0.key and use ca.crt sign it with 30 days - `) - } else if len(os.Args) == 2 { - cmd := exec.Command("sh", "-c", "openssl genrsa -out proxy.key 2048") - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - fmt.Println(string(out)) - - cmdStr := fmt.Sprintf("openssl req -new -key proxy.key -x509 -days 36500 -out proxy.crt -subj /C=%s/ST=%s/O=%s/CN=%s", C, ST, O, CN) - cmd = exec.Command("sh", "-c", cmdStr) - out, err = cmd.CombinedOutput() - if err != nil { - logger.Printf("err:%s", err) - return - } - fmt.Println(string(out)) - } - - return -} var allInterfaceAddrCache []net.IP diff --git a/utils/serve-channel.go b/utils/serve-channel.go index 621747f..84bb578 100644 --- a/utils/serve-channel.go +++ b/utils/serve-channel.go @@ -10,7 +10,7 @@ import ( "runtime/debug" "strconv" - "github.com/snail007/goproxy/services/kcpcfg" + "github.com/snail007/goproxy/core/lib/kcpcfg" kcp "github.com/xtaci/kcp-go" )