From 397c5e08f81a5466c38c4cf40229f461468ed371 Mon Sep 17 00:00:00 2001 From: "arraykeys@gmail.com" Date: Tue, 4 Sep 2018 16:06:44 +0800 Subject: [PATCH] merge enterprise --- README_ZH.md | 6 +-- config.go | 100 ++++++++++++++++++++++++++++-------------------- install_auto.sh | 2 +- main.go | 14 ++++++- release.sh | 2 +- 5 files changed, 75 insertions(+), 49 deletions(-) diff --git a/README_ZH.md b/README_ZH.md index c917335..0fce0ba 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -1,5 +1,5 @@ -Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务器,支持正向代理、反向代理、透明代理、内网穿透、TCP/UDP端口映射、SSH中转、TLS加密传输、协议转换、防污染DNS代理。 +Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5,ss代理服务器,支持正向代理、反向代理、透明代理、内网穿透、TCP/UDP端口映射、SSH中转、TLS加密传输、协议转换、防污染DNS代理。 [点击下载](https://github.com/snail007/goproxy/releases) 官方QQ交流群:189618940 @@ -182,7 +182,7 @@ curl -L https://raw.githubusercontent.com/snail007/goproxy/master/install_auto.s 下载地址:https://github.com/snail007/goproxy/releases ```shell cd /root/proxy/ -wget https://github.com/snail007/goproxy/releases/download/v5.5/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v6.0/proxy-linux-amd64.tar.gz ``` #### **2.下载自动安装脚本** ```shell @@ -1059,7 +1059,7 @@ SOCKS5支持级联认证,-A可以设置上级认证信息. #### **6.4 SS转HTTP(S)+SOCKS5+SS** SPS上级和本地支持ss协议,上级可以是SPS或者标准的ss服务. -SPS本地默认提供HTTP(S)\SOCKS5\SPS三种代理,当上级是SOCKS5时SOCKS5和SS支持UDP功能. +SPS本地默认提供HTTP(S)\SOCKS5\SPS三种代理,当上级是SOCKS5时转换后的SOCKS5和SS支持UDP功能. 假设已经存在一个普通的SS或者SPS代理(开启了ss,加密方式:aes-256-cfb,密码:demo):127.0.0.1:8080,现在我们把它转为同时支持http(s)和socks5和ss的普通代理,转换后的本地端口为18080,转换后的ss加密方式:aes-192-cfb,ss密码:pass。 命令如下: `./proxy sps -S ss -H aes-256-cfb -J pass -T tcp -P 127.0.0.1:8080 -t tcp -p :18080 -h aes-192-cfb -j pass`. diff --git a/config.go b/config.go index 0e9da16..7ceab35 100755 --- a/config.go +++ b/config.go @@ -13,20 +13,19 @@ import ( "runtime/pprof" "time" - sdk "github.com/snail007/goproxy/sdk/android-ios" - "github.com/snail007/goproxy/services" - "github.com/snail007/goproxy/services/kcpcfg" - - httpx "github.com/snail007/goproxy/services/http" - keygenx "github.com/snail007/goproxy/services/keygen" - mux "github.com/snail007/goproxy/services/mux" - socksx "github.com/snail007/goproxy/services/socks" - spsx "github.com/snail007/goproxy/services/sps" - tcpx "github.com/snail007/goproxy/services/tcp" - tunnel "github.com/snail007/goproxy/services/tunnel" - udpx "github.com/snail007/goproxy/services/udp" - + sdk "bitbucket.org/snail/proxy/sdk/android-ios" + services "bitbucket.org/snail/proxy/services" + httpx "bitbucket.org/snail/proxy/services/http" + "bitbucket.org/snail/proxy/services/kcpcfg" + keygenx "bitbucket.org/snail/proxy/services/keygen" + mux "bitbucket.org/snail/proxy/services/mux" + socksx "bitbucket.org/snail/proxy/services/socks" + spsx "bitbucket.org/snail/proxy/services/sps" + tcpx "bitbucket.org/snail/proxy/services/tcp" + tunnelx "bitbucket.org/snail/proxy/services/tunnel" + udpx "bitbucket.org/snail/proxy/services/udp" kcp "github.com/xtaci/kcp-go" + "golang.org/x/crypto/pbkdf2" kingpin "gopkg.in/alecthomas/kingpin.v2" ) @@ -43,9 +42,9 @@ func initConfig() (err error) { //define args tcpArgs := tcpx.TCPArgs{} httpArgs := httpx.HTTPArgs{} - tunnelServerArgs := tunnel.TunnelServerArgs{} - tunnelClientArgs := tunnel.TunnelClientArgs{} - tunnelBridgeArgs := tunnel.TunnelBridgeArgs{} + tunnelServerArgs := tunnelx.TunnelServerArgs{} + tunnelClientArgs := tunnelx.TunnelClientArgs{} + tunnelBridgeArgs := tunnelx.TunnelBridgeArgs{} muxServerArgs := mux.MuxServerArgs{} muxClientArgs := mux.MuxClientArgs{} muxBridgeArgs := mux.MuxBridgeArgs{} @@ -55,10 +54,9 @@ func initConfig() (err error) { dnsArgs := sdk.DNSArgs{} keygenArgs := keygenx.KeygenArgs{} kcpArgs := kcpcfg.KCPConfigArgs{} - //build srvice args app = kingpin.New("proxy", "happy with proxy") - app.Author("snail").Version(APP_VERSION) + app.Author("snail").Version("v" + APP_VERSION + " enterprise version") debug := app.Flag("debug", "debug log output").Default("false").Bool() daemon := app.Flag("daemon", "run proxy in background").Default("false").Bool() forever := app.Flag("forever", "run proxy in forever,fail and retry").Default("false").Bool() @@ -84,7 +82,7 @@ func initConfig() (err error) { //########http######### http := app.Command("http", "proxy on http mode") - httpArgs.Parent = http.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() + httpArgs.Parent = http.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').Strings() httpArgs.CaCertFile = http.Flag("ca", "ca cert file for tls").Default("").String() httpArgs.CertFile = http.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() httpArgs.KeyFile = http.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() @@ -115,21 +113,29 @@ func initConfig() (err error) { httpArgs.ParentKey = http.Flag("parent-key", "the password for auto encrypt/decrypt parent connection data").Short('Z').Default("").String() httpArgs.LocalCompress = http.Flag("local-compress", "auto compress/decompress data on local connection").Short('m').Default("false").Bool() httpArgs.ParentCompress = http.Flag("parent-compress", "auto compress/decompress data on parent connection").Short('M').Default("false").Bool() - + httpArgs.LoadBalanceMethod = http.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("hash").Enum("roundrobin", "weight", "leastconn", "leasttime", "hash") + httpArgs.LoadBalanceTimeout = http.Flag("lb-timeout", "tcp milliseconds timeout of connecting to parent").Default("500").Int() + httpArgs.LoadBalanceRetryTime = http.Flag("lb-retrytime", "sleep time milliseconds after checking").Default("1000").Int() + httpArgs.LoadBalanceHashTarget = http.Flag("lb-hashtarget", "use target address to choose parent for LB").Default("false").Bool() + httpArgs.LoadBalanceOnlyHA = http.Flag("lb-onlyha", "use only `high availability mode` to choose parent for LB").Default("false").Bool() + httpArgs.RateLimit = http.Flag("rate-limit", "rate limit (bytes/second) of each connection, such as: 100K 1.5M . 0 means no limitation").Short('l').Default("0").String() + httpArgs.BindListen = http.Flag("bind-listen", "using listener binding IP when connect to target").Short('B').Default("false").Bool() + httpArgs.Debug = debug //########tcp######### tcp := app.Command("tcp", "proxy on tcp mode") - tcpArgs.Parent = tcp.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() + tcpArgs.Parent = tcp.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("[]").Short('P').String() tcpArgs.CertFile = tcp.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() tcpArgs.KeyFile = tcp.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() tcpArgs.Timeout = tcp.Flag("timeout", "tcp timeout milliseconds when connect to real server or parent proxy").Short('e').Default("2000").Int() tcpArgs.ParentType = tcp.Flag("parent-type", "parent protocol type ").Short('T').Enum("tls", "tcp", "udp", "kcp") tcpArgs.LocalType = tcp.Flag("local-type", "local protocol type ").Default("tcp").Short('t').Enum("tls", "tcp", "kcp") + tcpArgs.CheckParentInterval = tcp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int() tcpArgs.Local = tcp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String() tcpArgs.Jumper = tcp.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() //########udp######### udp := app.Command("udp", "proxy on udp mode") - udpArgs.Parent = udp.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() + udpArgs.Parent = udp.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("[]").Short('P').String() udpArgs.CertFile = udp.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() udpArgs.KeyFile = udp.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() udpArgs.Timeout = udp.Flag("timeout", "tcp timeout milliseconds when connect to parent proxy").Short('t').Default("2000").Int() @@ -200,7 +206,7 @@ func initConfig() (err error) { //########ssh######### socks := app.Command("socks", "proxy on ssh mode") - socksArgs.Parent = socks.Flag("parent", "parent ssh address, such as: \"23.32.32.19:22\"").Default("").Short('P').String() + socksArgs.Parent = socks.Flag("parent", "parent ssh address, such as: \"23.32.32.19:22\"").Default("").Short('P').Strings() socksArgs.ParentType = socks.Flag("parent-type", "parent protocol type ").Default("tcp").Short('T').Enum("tls", "tcp", "kcp", "ssh") socksArgs.LocalType = socks.Flag("local-type", "local protocol type ").Default("tcp").Short('t').Enum("tls", "tcp", "kcp") socksArgs.Local = socks.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String() @@ -210,7 +216,7 @@ func initConfig() (err error) { socksArgs.SSHUser = socks.Flag("ssh-user", "user for ssh").Short('u').Default("").String() socksArgs.SSHKeyFile = socks.Flag("ssh-key", "private key file for ssh").Short('S').Default("").String() socksArgs.SSHKeyFileSalt = socks.Flag("ssh-keysalt", "salt of ssh private key").Short('s').Default("").String() - socksArgs.SSHPassword = socks.Flag("ssh-password", "password for ssh").Short('A').Default("").String() + socksArgs.SSHPassword = socks.Flag("ssh-password", "password for ssh").Short('D').Default("").String() socksArgs.Always = socks.Flag("always", "always use parent proxy").Default("false").Bool() socksArgs.Timeout = socks.Flag("timeout", "tcp timeout milliseconds when connect to real server or parent proxy").Default("5000").Int() socksArgs.Interval = socks.Flag("interval", "check domain if blocked every interval seconds").Default("10").Int() @@ -223,16 +229,25 @@ func initConfig() (err error) { socksArgs.AuthURLTimeout = socks.Flag("auth-timeout", "access 'auth-url' timeout milliseconds").Default("3000").Int() socksArgs.AuthURLOkCode = socks.Flag("auth-code", "access 'auth-url' success http code").Default("204").Int() socksArgs.AuthURLRetry = socks.Flag("auth-retry", "access 'auth-url' fail and retry count").Default("0").Int() + socksArgs.ParentAuth = socks.Flag("parent-auth", "parent socks auth username and password, such as: -A user1:pass1").Short('A').String() socksArgs.DNSAddress = socks.Flag("dns-address", "if set this, proxy will use this dns for resolve doamin").Short('q').Default("").String() socksArgs.DNSTTL = socks.Flag("dns-ttl", "caching seconds of dns query result").Short('e').Default("300").Int() socksArgs.LocalKey = socks.Flag("local-key", "the password for auto encrypt/decrypt local connection data").Short('z').Default("").String() socksArgs.ParentKey = socks.Flag("parent-key", "the password for auto encrypt/decrypt parent connection data").Short('Z').Default("").String() socksArgs.LocalCompress = socks.Flag("local-compress", "auto compress/decompress data on local connection").Short('m').Default("false").Bool() socksArgs.ParentCompress = socks.Flag("parent-compress", "auto compress/decompress data on parent connection").Short('M').Default("false").Bool() + socksArgs.LoadBalanceMethod = socks.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("hash").Enum("roundrobin", "weight", "leastconn", "leasttime", "hash") + socksArgs.LoadBalanceTimeout = socks.Flag("lb-timeout", "tcp milliseconds timeout of connecting to parent").Default("500").Int() + socksArgs.LoadBalanceRetryTime = socks.Flag("lb-retrytime", "sleep time milliseconds after checking").Default("1000").Int() + socksArgs.LoadBalanceHashTarget = socks.Flag("lb-hashtarget", "use target address to choose parent for LB").Default("false").Bool() + socksArgs.LoadBalanceOnlyHA = socks.Flag("lb-onlyha", "use only `high availability mode` to choose parent for LB").Default("false").Bool() + socksArgs.RateLimit = socks.Flag("rate-limit", "rate limit (bytes/second) of each connection, such as: 100K 1.5M . 0 means no limitation").Short('l').Default("0").String() + socksArgs.BindListen = socks.Flag("bind-listen", "using listener binding IP when connect to target").Short('B').Default("false").Bool() + socksArgs.Debug = debug //########socks+http(s)######### sps := app.Command("sps", "proxy on socks+http(s) mode") - spsArgs.Parent = sps.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').String() + spsArgs.Parent = sps.Flag("parent", "parent address, such as: \"23.32.32.19:28008\"").Default("").Short('P').Strings() spsArgs.CertFile = sps.Flag("cert", "cert file for tls").Short('C').Default("proxy.crt").String() spsArgs.KeyFile = sps.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() spsArgs.CaCertFile = sps.Flag("ca", "ca cert file for tls").Default("").String() @@ -240,7 +255,7 @@ func initConfig() (err error) { spsArgs.ParentType = sps.Flag("parent-type", "parent protocol type ").Short('T').Enum("tls", "tcp", "kcp") spsArgs.LocalType = sps.Flag("local-type", "local protocol type ").Default("tcp").Short('t').Enum("tls", "tcp", "kcp") spsArgs.Local = sps.Flag("local", "local ip:port to listen,multiple address use comma split,such as: 0.0.0.0:80,0.0.0.0:443").Short('p').Default(":33080").String() - spsArgs.ParentServiceType = sps.Flag("parent-service-type", "parent service type ").Short('S').Enum("http", "socks") + spsArgs.ParentServiceType = sps.Flag("parent-service-type", "parent service type ").Short('S').Enum("http", "socks", "ss") spsArgs.DNSAddress = sps.Flag("dns-address", "if set this, proxy will use this dns for resolve doamin").Short('q').Default("").String() spsArgs.DNSTTL = sps.Flag("dns-ttl", "caching seconds of dns query result").Short('e').Default("300").Int() spsArgs.AuthFile = sps.Flag("auth-file", "http basic auth file,\"username:password\" each line in file").Short('F').String() @@ -255,8 +270,20 @@ func initConfig() (err error) { spsArgs.ParentKey = sps.Flag("parent-key", "the password for auto encrypt/decrypt parent connection data").Short('Z').Default("").String() spsArgs.LocalCompress = sps.Flag("local-compress", "auto compress/decompress data on local connection").Short('m').Default("false").Bool() spsArgs.ParentCompress = sps.Flag("parent-compress", "auto compress/decompress data on parent connection").Short('M').Default("false").Bool() + spsArgs.SSMethod = sps.Flag("ss-method", "the following methods are supported: aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb, rc4-md5, rc4-md5-6, chacha20, salsa20, rc4, table, des-cfb, chacha20-ietf; if you use ss client , \"-t tcp\" is required").Short('h').Default("aes-256-cfb").String() + spsArgs.SSKey = sps.Flag("ss-key", "if you use ss client , \"-t tcp\" is required").Short('j').Default("sspassword").String() + spsArgs.ParentSSMethod = sps.Flag("parent-ss-method", "the following methods are supported: aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb, rc4-md5, rc4-md5-6, chacha20, salsa20, rc4, table, des-cfb, chacha20-ietf; if you use ss server as parent, \"-T tcp\" is required").Short('H').Default("aes-256-cfb").String() + spsArgs.ParentSSKey = sps.Flag("parent-ss-key", "if you use ss server as parent, \"-T tcp\" is required").Short('J').Default("sspassword").String() spsArgs.DisableHTTP = sps.Flag("disable-http", "disable http(s) proxy").Default("false").Bool() spsArgs.DisableSocks5 = sps.Flag("disable-socks", "disable socks proxy").Default("false").Bool() + spsArgs.DisableSS = sps.Flag("disable-ss", "disable ss proxy").Default("false").Bool() + spsArgs.LoadBalanceMethod = sps.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("hash").Enum("roundrobin", "weight", "leastconn", "leasttime", "hash") + spsArgs.LoadBalanceTimeout = sps.Flag("lb-timeout", "tcp milliseconds timeout of connecting to parent").Default("500").Int() + spsArgs.LoadBalanceRetryTime = sps.Flag("lb-retrytime", "sleep time milliseconds after checking").Default("1000").Int() + spsArgs.LoadBalanceHashTarget = sps.Flag("lb-hashtarget", "use target address to choose parent for LB").Default("false").Bool() + spsArgs.LoadBalanceOnlyHA = sps.Flag("lb-onlyha", "use only `high availability mode` to choose parent for LB").Default("false").Bool() + spsArgs.RateLimit = sps.Flag("rate-limit", "rate limit (bytes/second) of each connection, such as: 100K 1.5M . 0 means no limitation").Short('l').Default("0").String() + spsArgs.Debug = debug //########dns######### dns := app.Command("dns", "proxy on dns server mode") @@ -357,7 +384,6 @@ func initConfig() (err error) { flags |= logger.Ltime } log.SetFlags(flags) - if *nolog { log.SetOutput(ioutil.Discard) } else if *logfile != "" { @@ -444,7 +470,7 @@ func initConfig() (err error) { log.Println("[profiling] threadcreate profiling save to file : threadcreate.prof") } } - //regist services and run service + //regist services and run service switch serviceName { case "http": @@ -454,11 +480,11 @@ func initConfig() (err error) { case "udp": services.Regist(serviceName, udpx.NewUDP(), udpArgs, log) case "tserver": - services.Regist(serviceName, tunnel.NewTunnelServerManager(), tunnelServerArgs, log) + services.Regist(serviceName, tunnelx.NewTunnelServerManager(), tunnelServerArgs, log) case "tclient": - services.Regist(serviceName, tunnel.NewTunnelClient(), tunnelClientArgs, log) + services.Regist(serviceName, tunnelx.NewTunnelClient(), tunnelClientArgs, log) case "tbridge": - services.Regist(serviceName, tunnel.NewTunnelBridge(), tunnelBridgeArgs, log) + services.Regist(serviceName, tunnelx.NewTunnelBridge(), tunnelBridgeArgs, log) case "server": services.Regist(serviceName, mux.NewMuxServerManager(), muxServerArgs, log) case "client": @@ -474,7 +500,6 @@ func initConfig() (err error) { case "keygen": services.Regist(serviceName, keygenx.NewKeygen(), keygenArgs, log) } - service, err = services.Run(serviceName, nil) if err != nil { log.Fatalf("run service [%s] fail, ERR:%s", serviceName, err) @@ -483,16 +508,7 @@ func initConfig() (err error) { } func poster() { - fmt.Printf(` - ######## ######## ####### ## ## ## ## - ## ## ## ## ## ## ## ## ## ## - ## ## ## ## ## ## ## ## #### - ######## ######## ## ## ### ## - ## ## ## ## ## ## ## ## - ## ## ## ## ## ## ## ## - ## ## ## ####### ## ## ## - - v%s`+" by snail , blog : http://www.host900.com/\n\n", APP_VERSION) + fmt.Printf(`Proxy Enterprise Version v%s`+" by snail , blog : http://www.host900.com/\n\n", APP_VERSION) } func saveProfiling() { goroutine := pprof.Lookup("goroutine") diff --git a/install_auto.sh b/install_auto.sh index ab1eb11..32bf059 100755 --- a/install_auto.sh +++ b/install_auto.sh @@ -5,7 +5,7 @@ if [ -e /tmp/proxy ]; then fi mkdir /tmp/proxy cd /tmp/proxy -wget https://github.com/snail007/goproxy/releases/download/v5.5/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v6.0/proxy-linux-amd64.tar.gz # #install proxy tar zxvf proxy-linux-amd64.tar.gz diff --git a/main.go b/main.go index 6ba262f..6df5fac 100644 --- a/main.go +++ b/main.go @@ -6,12 +6,22 @@ import ( "os/signal" "syscall" - "github.com/snail007/goproxy/services" + "bitbucket.org/snail/certverify/check" + "bitbucket.org/snail/proxy/services" ) -const APP_VERSION = "5.5" +const APP_VERSION = "6.0" func main() { + isForever := false + for _, v := range os.Args[1:] { + if v == "--forever" { + isForever = true + } + } + if !isForever { + check.Init("proxy") + } err := initConfig() if err != nil { log.Fatalf("err : %s", err) diff --git a/release.sh b/release.sh index ac0a83c..e25bce4 100755 --- a/release.sh +++ b/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -VER="5.5" +VER="6.0" RELEASE="release-${VER}" rm -rf .cert mkdir .cert