diff --git a/CHANGELOG b/CHANGELOG index 58eff61..c99396b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ proxy更新日志 v6.4 1.http(s)代理增加了--jumper参数,可以穿透外部代理连接上级. +2.sps代理增加了--jumper参数,可以穿透外部代理连接上级. v6.3 1.fixed #156 diff --git a/config.go b/config.go index 73cfa0d..01cd782 100755 --- a/config.go +++ b/config.go @@ -116,7 +116,7 @@ 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.LoadBalanceMethod = http.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").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() @@ -252,7 +252,7 @@ func initConfig() (err error) { 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.LoadBalanceMethod = socks.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").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() @@ -293,12 +293,13 @@ func initConfig() (err error) { 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.LoadBalanceMethod = sps.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").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.Jumper = sps.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() spsArgs.Debug = isDebug //########dns######### diff --git a/sdk/android-ios/sdk.go b/sdk/android-ios/sdk.go index 1f809ad..f05b701 100644 --- a/sdk/android-ios/sdk.go +++ b/sdk/android-ios/sdk.go @@ -134,7 +134,7 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) 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.LoadBalanceMethod = http.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").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() @@ -270,7 +270,7 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) 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.LoadBalanceMethod = socks.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").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() @@ -317,6 +317,7 @@ func StartWithLog(serviceID, serviceArgsStr string, loggerCallback LogCallback) 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.Jumper = sps.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").Default("").String() spsArgs.Debug = debug //########dns######### diff --git a/services/http/http.go b/services/http/http.go index 3c3d52a..16ca2c4 100644 --- a/services/http/http.go +++ b/services/http/http.go @@ -166,6 +166,19 @@ func (s *HTTP) CheckArgs() (err error) { } s.cfg.RateLimitBytes = float64(size) } + if *s.cfg.Jumper != "" { + if *s.cfg.ParentType != "tls" && *s.cfg.ParentType != "tcp" { + err = fmt.Errorf("jumper only worked of -T is tls or tcp") + return + } + var j jumper.Jumper + j, err = jumper.New(*s.cfg.Jumper, time.Millisecond*time.Duration(*s.cfg.Timeout)) + if err != nil { + err = fmt.Errorf("parse jumper fail, err %s", err) + return + } + s.jumper = &j + } return } func (s *HTTP) InitService() (err error) { @@ -234,6 +247,7 @@ func (s *HTTP) StopService() { s.lb = nil s.lockChn = nil s.log = nil + s.jumper = nil s.serverChannels = nil s.sshClient = nil s.userConns = nil diff --git a/services/sps/sps.go b/services/sps/sps.go index b1e5c91..e9d40e3 100644 --- a/services/sps/sps.go +++ b/services/sps/sps.go @@ -23,6 +23,7 @@ import ( "github.com/snail007/goproxy/utils/datasize" "github.com/snail007/goproxy/utils/dnsx" "github.com/snail007/goproxy/utils/iolimiter" + "github.com/snail007/goproxy/utils/jumper" "github.com/snail007/goproxy/utils/lb" "github.com/snail007/goproxy/utils/mapx" "github.com/snail007/goproxy/utils/sni" @@ -74,6 +75,7 @@ type SPSArgs struct { RateLimit *string RateLimitBytes float64 Debug *bool + Jumper *string } type SPS struct { cfg SPSArgs @@ -88,6 +90,7 @@ type SPS struct { lb *lb.Group udpLocalKey []byte udpParentKey []byte + jumper *jumper.Jumper } func NewSPS() services.Service { @@ -141,6 +144,19 @@ func (s *SPS) CheckArgs() (err error) { } s.udpLocalKey = s.LocalUDPKey() s.udpParentKey = s.ParentUDPKey() + if *s.cfg.Jumper != "" { + if *s.cfg.ParentType != "tls" && *s.cfg.ParentType != "tcp" { + err = fmt.Errorf("jumper only worked of -T is tls or tcp") + return + } + var j jumper.Jumper + j, err = jumper.New(*s.cfg.Jumper, time.Millisecond*time.Duration(*s.cfg.Timeout)) + if err != nil { + err = fmt.Errorf("parse jumper fail, err %s", err) + return + } + s.jumper = &j + } return } func (s *SPS) InitService() (err error) { @@ -184,6 +200,7 @@ func (s *SPS) StopService() { s.domainResolver = dnsx.DomainResolver{} s.lb = nil s.localCipher = nil + s.jumper = nil s.log = nil s.parentCipher = nil s.serverChannels = nil @@ -635,15 +652,32 @@ func (s *SPS) Resolve(address string) string { } func (s *SPS) GetParentConn(address string) (conn net.Conn, err error) { if *s.cfg.ParentType == "tls" { - var _conn tls.Conn - _conn, err = utils.TlsConnectHost(address, *s.cfg.Timeout, s.cfg.CertBytes, s.cfg.KeyBytes, s.cfg.CaCertBytes) - if err == nil { - conn = net.Conn(&_conn) + if s.jumper == nil { + var _conn tls.Conn + _conn, err = utils.TlsConnectHost(address, *s.cfg.Timeout, s.cfg.CertBytes, s.cfg.KeyBytes, s.cfg.CaCertBytes) + if err == nil { + conn = net.Conn(&_conn) + } + } else { + conf, err := utils.TlsConfig(s.cfg.CertBytes, s.cfg.KeyBytes, s.cfg.CaCertBytes) + if err != nil { + return nil, err + } + var _c net.Conn + _c, err = s.jumper.Dial(address, time.Millisecond*time.Duration(*s.cfg.Timeout)) + if err == nil { + conn = net.Conn(tls.Client(_c, conf)) + } } + } else if *s.cfg.ParentType == "kcp" { conn, err = utils.ConnectKCPHost(address, s.cfg.KCP) } else { - conn, err = utils.ConnectHost(address, *s.cfg.Timeout) + if s.jumper == nil { + conn, err = utils.ConnectHost(address, *s.cfg.Timeout) + } else { + conn, err = s.jumper.Dial(address, time.Millisecond*time.Duration(*s.cfg.Timeout)) + } } if err == nil { if *s.cfg.ParentCompress {