From 9e9a9ac6dea1f4e75188aa3d6b31fb53bc244cbb Mon Sep 17 00:00:00 2001 From: "arraykeys@gmail.com" Date: Fri, 3 Nov 2017 12:50:50 +0800 Subject: [PATCH] Signed-off-by: arraykeys@gmail.com --- CHANGELOG | 8 ++++---- README.md | 2 +- release.sh | 6 ++++++ services/http.go | 4 +--- services/socks.go | 11 ++++------- services/tcp.go | 4 +--- services/tunnel_bridge.go | 4 +--- services/tunnel_client.go | 4 +--- services/tunnel_server.go | 4 +--- utils/functions.go | 34 +++++++++++++++++++--------------- 10 files changed, 39 insertions(+), 42 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6c8313b..e43a010 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,10 +1,10 @@ proxy更新日志 v3.5 1.优化了kcp参数,速度有所提升. - -v3.4 -1.tcp代理增加了kcp协议传输数据. -2.优化了死循环检查,增加了添加本地IP参数,当VPS在nat设备后面, +2.修复了socks无法正常工作的问题. +3.修正了文档中的一些描述. +4.tcp代理增加了kcp协议传输数据. +5.优化了死循环检查,增加了添加本地IP参数,当VPS在nat设备后面, vps上网卡IP都是内网IP,这个时候可以通过-g参数添加vps的外网ip防止死循环. v3.4 diff --git a/README.md b/README.md index 1092efe..d268cf6 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ wget https://github.com/reddec/monexec/releases/download/v0.1.1/monexec_0.1.1_li 下载地址:https://github.com/snail007/goproxy/releases ```shell cd /root/proxy/ -wget https://github.com/snail007/goproxy/releases/download/v3.1fix/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v3.4/proxy-linux-amd64.tar.gz ``` #### **3.下载自动安装脚本** ```shell diff --git a/release.sh b/release.sh index cfc1aee..21447cb 100755 --- a/release.sh +++ b/release.sh @@ -61,3 +61,9 @@ GOOS=windows GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-windows-386.tar.g GOOS=windows GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-windows-amd64.tar.gz" proxy.exe direct blocked .cert/proxy.crt .cert/proxy.key rm -rf proxy proxy.exe .cert + +#todo +#1.release.sh VER="xxx" +#2.main.go APP_VERSION="xxx" +#3.install_auto.sh goproxy/releases/download/vxxx +#4.README goproxy/releases/download/vxxx \ No newline at end of file diff --git a/services/http.go b/services/http.go index 8931b6b..0a3fc3d 100644 --- a/services/http.go +++ b/services/http.go @@ -238,10 +238,8 @@ func (s *HTTP) OutToTCP(useProxy bool, address string, inConn *net.Conn, req *ut } } - utils.IoBind((*inConn), outConn, func(err error) { + utils.IoBind((*inConn), outConn, func(err interface{}) { log.Printf("conn %s - %s released [%s]", inAddr, outAddr, req.Host) - utils.CloseConn(inConn) - utils.CloseConn(&outConn) }) log.Printf("conn %s - %s connected [%s]", inAddr, outAddr, req.Host) diff --git a/services/socks.go b/services/socks.go index 3d20c1b..3ce80dd 100644 --- a/services/socks.go +++ b/services/socks.go @@ -293,8 +293,8 @@ func (s *Socks) socksConnCallback(inConn net.Conn) { defer func() { if err := recover(); err != nil { log.Printf("socks conn handler crashed with err : %s \nstack: %s", err, string(debug.Stack())) + inConn.Close() } - utils.CloseConn(&inConn) }() //协商开始 @@ -398,7 +398,6 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque } func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, request socks.Request) { var outConn net.Conn - defer utils.CloseConn(&outConn) var err interface{} useProxy := true tryCount := 0 @@ -428,7 +427,7 @@ func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, reque } } tryCount++ - if err == nil || tryCount > maxTryCount { + if err == nil || tryCount > maxTryCount || *s.cfg.Parent == "" { break } else { log.Printf("get out conn fail,%s,retrying...", err) @@ -447,10 +446,8 @@ func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, reque //inLocalAddr := (*inConn).LocalAddr().String() log.Printf("conn %s - %s connected", inAddr, request.Addr()) - utils.IoBind(*inConn, outConn, func(err error) { - log.Printf("conn %s - %s released %s", inAddr, request.Addr(), err) - utils.CloseConn(inConn) - utils.CloseConn(&outConn) + utils.IoBind(*inConn, outConn, func(err interface{}) { + log.Printf("conn %s - %s released", inAddr, request.Addr()) }) } func (s *Socks) getOutConn(methodBytes, reqBytes []byte, host string) (outConn net.Conn, err interface{}) { diff --git a/services/tcp.go b/services/tcp.go index d90f1f4..ad7ee86 100644 --- a/services/tcp.go +++ b/services/tcp.go @@ -110,10 +110,8 @@ func (s *TCP) OutToTCP(inConn *net.Conn) (err error) { //inLocalAddr := (*inConn).LocalAddr().String() outAddr := outConn.RemoteAddr().String() //outLocalAddr := outConn.LocalAddr().String() - utils.IoBind((*inConn), outConn, func(err error) { + utils.IoBind((*inConn), outConn, func(err interface{}) { log.Printf("conn %s - %s released", inAddr, outAddr) - utils.CloseConn(inConn) - utils.CloseConn(&outConn) }) log.Printf("conn %s - %s connected", inAddr, outAddr) return diff --git a/services/tunnel_bridge.go b/services/tunnel_bridge.go index 2dc4d0e..bc70886 100644 --- a/services/tunnel_bridge.go +++ b/services/tunnel_bridge.go @@ -112,9 +112,7 @@ func (s *TunnelBridge) Start(args interface{}) (err error) { return } serverConn := serverConnItem.(ServerConn).Conn - utils.IoBind(*serverConn, inConn, func(err error) { - (*serverConn).Close() - utils.CloseConn(&inConn) + utils.IoBind(*serverConn, inConn, func(err interface{}) { s.serverConns.Remove(ID) s.cmClient.RemoveOne(key, ID) s.cmServer.RemoveOne(serverID, ID) diff --git a/services/tunnel_client.go b/services/tunnel_client.go index d51f7df..b06a5a7 100644 --- a/services/tunnel_client.go +++ b/services/tunnel_client.go @@ -273,10 +273,8 @@ func (s *TunnelClient) ServeConn(localAddr, ID, serverID string) { log.Printf("build connection error, err: %s", err) return } - utils.IoBind(inConn, outConn, func(err error) { + utils.IoBind(inConn, outConn, func(err interface{}) { log.Printf("conn %s released", ID) - utils.CloseConn(&inConn) - utils.CloseConn(&outConn) s.cm.RemoveOne(*s.cfg.Key, ID) }) s.cm.Add(*s.cfg.Key, ID, &inConn) diff --git a/services/tunnel_server.go b/services/tunnel_server.go index 2f38136..d267fa9 100644 --- a/services/tunnel_server.go +++ b/services/tunnel_server.go @@ -240,9 +240,7 @@ func (s *TunnelServer) Start(args interface{}) (err error) { break } } - utils.IoBind(inConn, outConn, func(err error) { - utils.CloseConn(&outConn) - utils.CloseConn(&inConn) + utils.IoBind(inConn, outConn, func(err interface{}) { s.cfg.Mgr.cm.RemoveOne(s.cfg.Mgr.serverID, ID) log.Printf("%s conn %s released", *s.cfg.Key, ID) }) diff --git a/utils/functions.go b/utils/functions.go index b76370d..9842dd6 100755 --- a/utils/functions.go +++ b/utils/functions.go @@ -20,7 +20,6 @@ import ( "golang.org/x/crypto/pbkdf2" - "runtime/debug" "strconv" "strings" "time" @@ -28,37 +27,42 @@ import ( kcp "github.com/xtaci/kcp-go" ) -func IoBind(dst io.ReadWriter, src io.ReadWriter, fn func(err error)) { +func IoBind(dst io.ReadWriteCloser, src io.ReadWriteCloser, fn func(err interface{})) { go func() { - e1 := make(chan error, 1) - e2 := make(chan error, 1) + defer func() { + if err := recover(); err != nil { + log.Printf("bind crashed %s", err) + } + }() + e1 := make(chan interface{}, 1) + e2 := make(chan interface{}, 1) go func() { defer func() { - if e := recover(); e != nil { - log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + if err := recover(); err != nil { + log.Printf("bind crashed %s", err) } }() - e := ioCopy(dst, src) - //_, e := io.Copy(dst, src) - e1 <- e + _, err := io.Copy(dst, src) + e1 <- err }() go func() { defer func() { - if e := recover(); e != nil { - log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + if err := recover(); err != nil { + log.Printf("bind crashed %s", err) } }() - //_, e := io.Copy(src, dst) - e := ioCopy(src, dst) - e2 <- e + _, err := io.Copy(src, dst) + e2 <- err }() - var err error + var err interface{} select { case err = <-e1: //log.Printf("e1") case err = <-e2: //log.Printf("e2") } + src.Close() + dst.Close() fn(err) }() }