From 5c3fd53fab66d12f9f8e9a5acb694d905940d4c5 Mon Sep 17 00:00:00 2001 From: "arraykeys@gmail.com" Date: Mon, 21 Jan 2019 16:58:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86socks5=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG | 1 + core/proxy/server/socks5/server.go | 18 +++++++++--------- utils/socks/server.go | 20 ++++++++++---------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f45291c..1e5d283 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,6 +11,7 @@ v6.9 # 是间隔符号,如果有认证信息,必须有#,没有认证信息可以省略#. 2.2.2.2:33080 是上级地址 @1 是设置权重,可以参考手册权重部分. +4.修复了socks5代理错误处理超时的问题. v6.8 1.HTTP(S)\SOCKS5代理,API认证功能,发送给认证接口的参数增加了本地IP,local_ip字段, diff --git a/core/proxy/server/socks5/server.go b/core/proxy/server/socks5/server.go index f48e11a..25ac757 100644 --- a/core/proxy/server/socks5/server.go +++ b/core/proxy/server/socks5/server.go @@ -243,12 +243,12 @@ func (s *ServerConn) Handshake() (err error) { //协商开始 //method select request var methodReq MethodsRequest - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) methodReq, e := NewMethodsRequest((*s.conn), s.header) (*s.conn).SetReadDeadline(time.Time{}) if e != nil { - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) methodReq.Reply(socks5c.Method_NONE_ACCEPTABLE) (*s.conn).SetReadDeadline(time.Time{}) err = fmt.Errorf("new methods request fail,ERR: %s", e) @@ -265,7 +265,7 @@ func (s *ServerConn) Handshake() (err error) { // } s.method = socks5c.Method_NO_AUTH //method select reply - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) err = methodReq.Reply(socks5c.Method_NO_AUTH) (*s.conn).SetReadDeadline(time.Time{}) if err != nil { @@ -276,7 +276,7 @@ func (s *ServerConn) Handshake() (err error) { } else { //auth if !methodReq.Select(socks5c.Method_USER_PASS) { - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) methodReq.Reply(socks5c.Method_NONE_ACCEPTABLE) (*s.conn).SetReadDeadline(time.Time{}) err = fmt.Errorf("none method found : Method_USER_PASS") @@ -284,7 +284,7 @@ func (s *ServerConn) Handshake() (err error) { } s.method = socks5c.Method_USER_PASS //method reply need auth - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) err = methodReq.Reply(socks5c.Method_USER_PASS) (*s.conn).SetReadDeadline(time.Time{}) if err != nil { @@ -294,7 +294,7 @@ func (s *ServerConn) Handshake() (err error) { //read auth buf := make([]byte, 500) var n int - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) n, err = (*s.conn).Read(buf) (*s.conn).SetReadDeadline(time.Time{}) if err != nil { @@ -309,7 +309,7 @@ func (s *ServerConn) Handshake() (err error) { _userAddr := strings.Split(remoteAddr.String(), ":") _localAddr := strings.Split(localAddr.String(), ":") if s.auth == nil || (*s.auth).CheckUserPass(s.user, s.password, _userAddr[0], _localAddr[0], "") { - (*s.conn).SetDeadline(time.Now().Add(time.Millisecond * time.Duration(s.timeout))) + (*s.conn).SetDeadline(time.Now().Add(s.timeout)) _, err = (*s.conn).Write([]byte{0x01, 0x00}) (*s.conn).SetDeadline(time.Time{}) if err != nil { @@ -317,7 +317,7 @@ func (s *ServerConn) Handshake() (err error) { return } } else { - (*s.conn).SetDeadline(time.Now().Add(time.Millisecond * time.Duration(s.timeout))) + (*s.conn).SetDeadline(time.Now().Add(s.timeout)) _, err = (*s.conn).Write([]byte{0x01, 0x01}) (*s.conn).SetDeadline(time.Time{}) if err != nil { @@ -329,7 +329,7 @@ func (s *ServerConn) Handshake() (err error) { } } //request detail - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) request, e := NewRequest(*s.conn) (*s.conn).SetReadDeadline(time.Time{}) if e != nil { diff --git a/utils/socks/server.go b/utils/socks/server.go index a1c3210..52c66bc 100644 --- a/utils/socks/server.go +++ b/utils/socks/server.go @@ -110,12 +110,12 @@ func (s *ServerConn) Handshake() (err error) { //协商开始 //method select request var methodReq MethodsRequest - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) methodReq, e := NewMethodsRequest((*s.conn), s.header) (*s.conn).SetReadDeadline(time.Time{}) if e != nil { - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) methodReq.Reply(Method_NONE_ACCEPTABLE) (*s.conn).SetReadDeadline(time.Time{}) err = fmt.Errorf("new methods request fail,ERR: %s", e) @@ -124,7 +124,7 @@ func (s *ServerConn) Handshake() (err error) { //log.Printf("%v,s.auth == %v && methodReq.Select(Method_NO_AUTH) %v", methodReq.methods, s.auth, methodReq.Select(Method_NO_AUTH)) if s.auth == nil && methodReq.Select(Method_NO_AUTH) && !methodReq.Select(Method_USER_PASS) { // if !methodReq.Select(Method_NO_AUTH) { - // (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + // (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) // methodReq.Reply(Method_NONE_ACCEPTABLE) // (*s.conn).SetReadDeadline(time.Time{}) // err = fmt.Errorf("none method found : Method_NO_AUTH") @@ -132,7 +132,7 @@ func (s *ServerConn) Handshake() (err error) { // } s.method = Method_NO_AUTH //method select reply - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) err = methodReq.Reply(Method_NO_AUTH) (*s.conn).SetReadDeadline(time.Time{}) if err != nil { @@ -143,7 +143,7 @@ func (s *ServerConn) Handshake() (err error) { } else { //auth if !methodReq.Select(Method_USER_PASS) { - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) methodReq.Reply(Method_NONE_ACCEPTABLE) (*s.conn).SetReadDeadline(time.Time{}) err = fmt.Errorf("none method found : Method_USER_PASS") @@ -151,7 +151,7 @@ func (s *ServerConn) Handshake() (err error) { } s.method = Method_USER_PASS //method reply need auth - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) err = methodReq.Reply(Method_USER_PASS) (*s.conn).SetReadDeadline(time.Time{}) if err != nil { @@ -161,7 +161,7 @@ func (s *ServerConn) Handshake() (err error) { //read auth buf := make([]byte, 500) var n int - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) n, err = (*s.conn).Read(buf) (*s.conn).SetReadDeadline(time.Time{}) if err != nil { @@ -176,7 +176,7 @@ func (s *ServerConn) Handshake() (err error) { _userAddr := strings.Split(remoteAddr.String(), ":") _localAddr := strings.Split(localAddr.String(), ":") if s.auth == nil || s.auth.CheckUserPass(s.user, s.password, _userAddr[0], _localAddr[0], "") { - (*s.conn).SetDeadline(time.Now().Add(time.Millisecond * time.Duration(s.timeout))) + (*s.conn).SetDeadline(time.Now().Add(s.timeout)) _, err = (*s.conn).Write([]byte{0x01, 0x00}) (*s.conn).SetDeadline(time.Time{}) if err != nil { @@ -184,7 +184,7 @@ func (s *ServerConn) Handshake() (err error) { return } } else { - (*s.conn).SetDeadline(time.Now().Add(time.Millisecond * time.Duration(s.timeout))) + (*s.conn).SetDeadline(time.Now().Add(s.timeout)) _, err = (*s.conn).Write([]byte{0x01, 0x01}) (*s.conn).SetDeadline(time.Time{}) if err != nil { @@ -196,7 +196,7 @@ func (s *ServerConn) Handshake() (err error) { } } //request detail - (*s.conn).SetReadDeadline(time.Now().Add(time.Second * s.timeout)) + (*s.conn).SetReadDeadline(time.Now().Add(s.timeout)) request, e := NewRequest(*s.conn) (*s.conn).SetReadDeadline(time.Time{}) if e != nil {