Signed-off-by: arraykeys@gmail.com <arraykeys@gmail.com>

This commit is contained in:
arraykeys@gmail.com
2017-11-03 12:50:50 +08:00
parent cc24cfc26f
commit 9e9a9ac6de
10 changed files with 39 additions and 42 deletions

View File

@ -1,10 +1,10 @@
proxy更新日志 proxy更新日志
v3.5 v3.5
1.优化了kcp参数,速度有所提升. 1.优化了kcp参数,速度有所提升.
2.修复了socks无法正常工作的问题.
v3.4 3.修正了文档中的一些描述.
1.tcp代理增加了kcp协议传输数据. 4.tcp代理增加了kcp协议传输数据.
2.优化了死循环检查,增加了添加本地IP参数,当VPS在nat设备后面, 5.优化了死循环检查,增加了添加本地IP参数,当VPS在nat设备后面,
vps上网卡IP都是内网IP,这个时候可以通过-g参数添加vps的外网ip防止死循环. vps上网卡IP都是内网IP,这个时候可以通过-g参数添加vps的外网ip防止死循环.
v3.4 v3.4

View File

@ -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 下载地址:https://github.com/snail007/goproxy/releases
```shell ```shell
cd /root/proxy/ 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.下载自动安装脚本** #### **3.下载自动安装脚本**
```shell ```shell

View File

@ -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 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 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

View File

@ -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) 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) log.Printf("conn %s - %s connected [%s]", inAddr, outAddr, req.Host)

View File

@ -293,8 +293,8 @@ func (s *Socks) socksConnCallback(inConn net.Conn) {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
log.Printf("socks conn handler crashed with err : %s \nstack: %s", err, string(debug.Stack())) 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) { func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, request socks.Request) {
var outConn net.Conn var outConn net.Conn
defer utils.CloseConn(&outConn)
var err interface{} var err interface{}
useProxy := true useProxy := true
tryCount := 0 tryCount := 0
@ -428,7 +427,7 @@ func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
} }
} }
tryCount++ tryCount++
if err == nil || tryCount > maxTryCount { if err == nil || tryCount > maxTryCount || *s.cfg.Parent == "" {
break break
} else { } else {
log.Printf("get out conn fail,%s,retrying...", err) 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() //inLocalAddr := (*inConn).LocalAddr().String()
log.Printf("conn %s - %s connected", inAddr, request.Addr()) log.Printf("conn %s - %s connected", inAddr, request.Addr())
utils.IoBind(*inConn, outConn, func(err error) { utils.IoBind(*inConn, outConn, func(err interface{}) {
log.Printf("conn %s - %s released %s", inAddr, request.Addr(), err) log.Printf("conn %s - %s released", inAddr, request.Addr())
utils.CloseConn(inConn)
utils.CloseConn(&outConn)
}) })
} }
func (s *Socks) getOutConn(methodBytes, reqBytes []byte, host string) (outConn net.Conn, err interface{}) { func (s *Socks) getOutConn(methodBytes, reqBytes []byte, host string) (outConn net.Conn, err interface{}) {

View File

@ -110,10 +110,8 @@ func (s *TCP) OutToTCP(inConn *net.Conn) (err error) {
//inLocalAddr := (*inConn).LocalAddr().String() //inLocalAddr := (*inConn).LocalAddr().String()
outAddr := outConn.RemoteAddr().String() outAddr := outConn.RemoteAddr().String()
//outLocalAddr := outConn.LocalAddr().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) log.Printf("conn %s - %s released", inAddr, outAddr)
utils.CloseConn(inConn)
utils.CloseConn(&outConn)
}) })
log.Printf("conn %s - %s connected", inAddr, outAddr) log.Printf("conn %s - %s connected", inAddr, outAddr)
return return

View File

@ -112,9 +112,7 @@ func (s *TunnelBridge) Start(args interface{}) (err error) {
return return
} }
serverConn := serverConnItem.(ServerConn).Conn serverConn := serverConnItem.(ServerConn).Conn
utils.IoBind(*serverConn, inConn, func(err error) { utils.IoBind(*serverConn, inConn, func(err interface{}) {
(*serverConn).Close()
utils.CloseConn(&inConn)
s.serverConns.Remove(ID) s.serverConns.Remove(ID)
s.cmClient.RemoveOne(key, ID) s.cmClient.RemoveOne(key, ID)
s.cmServer.RemoveOne(serverID, ID) s.cmServer.RemoveOne(serverID, ID)

View File

@ -273,10 +273,8 @@ func (s *TunnelClient) ServeConn(localAddr, ID, serverID string) {
log.Printf("build connection error, err: %s", err) log.Printf("build connection error, err: %s", err)
return return
} }
utils.IoBind(inConn, outConn, func(err error) { utils.IoBind(inConn, outConn, func(err interface{}) {
log.Printf("conn %s released", ID) log.Printf("conn %s released", ID)
utils.CloseConn(&inConn)
utils.CloseConn(&outConn)
s.cm.RemoveOne(*s.cfg.Key, ID) s.cm.RemoveOne(*s.cfg.Key, ID)
}) })
s.cm.Add(*s.cfg.Key, ID, &inConn) s.cm.Add(*s.cfg.Key, ID, &inConn)

View File

@ -240,9 +240,7 @@ func (s *TunnelServer) Start(args interface{}) (err error) {
break break
} }
} }
utils.IoBind(inConn, outConn, func(err error) { utils.IoBind(inConn, outConn, func(err interface{}) {
utils.CloseConn(&outConn)
utils.CloseConn(&inConn)
s.cfg.Mgr.cm.RemoveOne(s.cfg.Mgr.serverID, ID) s.cfg.Mgr.cm.RemoveOne(s.cfg.Mgr.serverID, ID)
log.Printf("%s conn %s released", *s.cfg.Key, ID) log.Printf("%s conn %s released", *s.cfg.Key, ID)
}) })

View File

@ -20,7 +20,6 @@ import (
"golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/pbkdf2"
"runtime/debug"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -28,37 +27,42 @@ import (
kcp "github.com/xtaci/kcp-go" 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)
go func() { go func() {
defer func() { defer func() {
if e := recover(); e != nil { if err := recover(); err != nil {
log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) log.Printf("bind crashed %s", err)
} }
}() }()
e := ioCopy(dst, src) e1 := make(chan interface{}, 1)
//_, e := io.Copy(dst, src) e2 := make(chan interface{}, 1)
e1 <- e go func() {
defer func() {
if err := recover(); err != nil {
log.Printf("bind crashed %s", err)
}
}()
_, err := io.Copy(dst, src)
e1 <- err
}() }()
go func() { go func() {
defer func() { defer func() {
if e := recover(); e != nil { if err := recover(); err != nil {
log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) log.Printf("bind crashed %s", err)
} }
}() }()
//_, e := io.Copy(src, dst) _, err := io.Copy(src, dst)
e := ioCopy(src, dst) e2 <- err
e2 <- e
}() }()
var err error var err interface{}
select { select {
case err = <-e1: case err = <-e1:
//log.Printf("e1") //log.Printf("e1")
case err = <-e2: case err = <-e2:
//log.Printf("e2") //log.Printf("e2")
} }
src.Close()
dst.Close()
fn(err) fn(err)
}() }()
} }