diff --git a/bin/sha1sum.txt b/bin/sha1sum.txt index 44dd801..b12527f 100644 --- a/bin/sha1sum.txt +++ b/bin/sha1sum.txt @@ -1,10 +1,10 @@ -5a75ec8000a8b3593a853c12863e2b46 ./ua3f-0.1.1-386.tar.gz -85cce8bd5d2aef5d8481cfe6f1f9b099 ./ua3f-0.1.1-amd64.tar.gz -4bfe414dd58e2eeb57e3381cbada7a2b ./ua3f-0.1.1-arm.tar.gz -da1d3a054e66d5680a38a3ffcb67862a ./ua3f-0.1.1-arm64.tar.gz -da1d3a054e66d5680a38a3ffcb67862a ./ua3f-0.1.1-armv8.tar.gz -02fe1c3c18115dcecf4bf38f62e5de83 ./ua3f-0.1.1-mips64.tar.gz -69d64e2f443859418f74749e7d02e018 ./ua3f-0.1.1-mipsle-hardfloat.tar.gz -23781cf6da653e6bfd40c91ccb258885 ./ua3f-0.1.1-mipsle-softfloat.tar.gz -41b823964a881b5e2c429e785287e4e4 ./ua3f-0.1.1-mipsle.tar.gz -4319b5e0e69bf2637a33ca6aee3ed284 ./ua3f-0.1.1-riscv64.tar.gz +69348631c2d1bf17768dcbeac972b63f ./ua3f-0.1.2-386.tar.gz +06b14787b948906ce42372ab656d2078 ./ua3f-0.1.2-amd64.tar.gz +b53f3b49d42b4d93800e4665e525f26c ./ua3f-0.1.2-arm.tar.gz +3497c75d7f53085b8d34d148059831f8 ./ua3f-0.1.2-arm64.tar.gz +3497c75d7f53085b8d34d148059831f8 ./ua3f-0.1.2-armv8.tar.gz +7a19c7e1539294b2fe18244bab9ad12e ./ua3f-0.1.2-mips64.tar.gz +8034fb13e48c836793dfbc3f1d213c2f ./ua3f-0.1.2-mipsle-hardfloat.tar.gz +b386e9b12c94413f53bdf7e8bcc232d7 ./ua3f-0.1.2-mipsle-softfloat.tar.gz +8034fb13e48c836793dfbc3f1d213c2f ./ua3f-0.1.2-mipsle.tar.gz +5f6870e9f7b8d4c0e4ffc56eff1c37d4 ./ua3f-0.1.2-riscv64.tar.gz diff --git a/bin/ua3f-0.1.1-386.tar.gz b/bin/ua3f-0.1.1-386.tar.gz deleted file mode 100644 index c1e3403..0000000 Binary files a/bin/ua3f-0.1.1-386.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-amd64.tar.gz b/bin/ua3f-0.1.1-amd64.tar.gz deleted file mode 100644 index a1c020f..0000000 Binary files a/bin/ua3f-0.1.1-amd64.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-arm.tar.gz b/bin/ua3f-0.1.1-arm.tar.gz deleted file mode 100644 index 35b12d9..0000000 Binary files a/bin/ua3f-0.1.1-arm.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-arm64.tar.gz b/bin/ua3f-0.1.1-arm64.tar.gz deleted file mode 100644 index f3a7746..0000000 Binary files a/bin/ua3f-0.1.1-arm64.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-armv8.tar.gz b/bin/ua3f-0.1.1-armv8.tar.gz deleted file mode 100644 index f3a7746..0000000 Binary files a/bin/ua3f-0.1.1-armv8.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-mips64.tar.gz b/bin/ua3f-0.1.1-mips64.tar.gz deleted file mode 100644 index aaff66c..0000000 Binary files a/bin/ua3f-0.1.1-mips64.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-mipsle-hardfloat.tar.gz b/bin/ua3f-0.1.1-mipsle-hardfloat.tar.gz deleted file mode 100644 index 6b95f70..0000000 Binary files a/bin/ua3f-0.1.1-mipsle-hardfloat.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-mipsle-softfloat.tar.gz b/bin/ua3f-0.1.1-mipsle-softfloat.tar.gz deleted file mode 100644 index 8f9486e..0000000 Binary files a/bin/ua3f-0.1.1-mipsle-softfloat.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-mipsle.tar.gz b/bin/ua3f-0.1.1-mipsle.tar.gz deleted file mode 100644 index 04742b5..0000000 Binary files a/bin/ua3f-0.1.1-mipsle.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.1-riscv64.tar.gz b/bin/ua3f-0.1.1-riscv64.tar.gz deleted file mode 100644 index a200dbf..0000000 Binary files a/bin/ua3f-0.1.1-riscv64.tar.gz and /dev/null differ diff --git a/bin/ua3f-0.1.2-386.tar.gz b/bin/ua3f-0.1.2-386.tar.gz new file mode 100644 index 0000000..b14142e Binary files /dev/null and b/bin/ua3f-0.1.2-386.tar.gz differ diff --git a/bin/ua3f-0.1.2-amd64.tar.gz b/bin/ua3f-0.1.2-amd64.tar.gz new file mode 100644 index 0000000..2b9e577 Binary files /dev/null and b/bin/ua3f-0.1.2-amd64.tar.gz differ diff --git a/bin/ua3f-0.1.2-arm.tar.gz b/bin/ua3f-0.1.2-arm.tar.gz new file mode 100644 index 0000000..f165909 Binary files /dev/null and b/bin/ua3f-0.1.2-arm.tar.gz differ diff --git a/bin/ua3f-0.1.2-arm64.tar.gz b/bin/ua3f-0.1.2-arm64.tar.gz new file mode 100644 index 0000000..9b0c673 Binary files /dev/null and b/bin/ua3f-0.1.2-arm64.tar.gz differ diff --git a/bin/ua3f-0.1.2-armv8.tar.gz b/bin/ua3f-0.1.2-armv8.tar.gz new file mode 100644 index 0000000..9b0c673 Binary files /dev/null and b/bin/ua3f-0.1.2-armv8.tar.gz differ diff --git a/bin/ua3f-0.1.2-mips64.tar.gz b/bin/ua3f-0.1.2-mips64.tar.gz new file mode 100644 index 0000000..387d476 Binary files /dev/null and b/bin/ua3f-0.1.2-mips64.tar.gz differ diff --git a/bin/ua3f-0.1.2-mipsle-hardfloat.tar.gz b/bin/ua3f-0.1.2-mipsle-hardfloat.tar.gz new file mode 100644 index 0000000..2418d24 Binary files /dev/null and b/bin/ua3f-0.1.2-mipsle-hardfloat.tar.gz differ diff --git a/bin/ua3f-0.1.2-mipsle-softfloat.tar.gz b/bin/ua3f-0.1.2-mipsle-softfloat.tar.gz new file mode 100644 index 0000000..d61c7d5 Binary files /dev/null and b/bin/ua3f-0.1.2-mipsle-softfloat.tar.gz differ diff --git a/bin/ua3f-0.1.2-mipsle.tar.gz b/bin/ua3f-0.1.2-mipsle.tar.gz new file mode 100644 index 0000000..2418d24 Binary files /dev/null and b/bin/ua3f-0.1.2-mipsle.tar.gz differ diff --git a/bin/ua3f-0.1.2-riscv64.tar.gz b/bin/ua3f-0.1.2-riscv64.tar.gz new file mode 100644 index 0000000..6025de4 Binary files /dev/null and b/bin/ua3f-0.1.2-riscv64.tar.gz differ diff --git a/build.sh b/build.sh index 79a5784..67da683 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/sh project_name="ua3f" -release_version="0.1.1" +release_version="0.1.2" target=cmd/ua3f.go release_dir=./bin diff --git a/cmd/ua3f.go b/cmd/ua3f.go index 316846d..be7e247 100644 --- a/cmd/ua3f.go +++ b/cmd/ua3f.go @@ -16,7 +16,7 @@ import ( "github.com/sirupsen/logrus" ) -var version = "0.1.1" +var version = "0.1.2" var payloadByte []byte var cache *expirable.LRU[string, string] @@ -67,13 +67,13 @@ func process(client net.Conn) { client.Close() return } - target, err := Socks5Connect(client) + target, destAddrPort, err := Socks5Connect(client) if err != nil { logrus.Error("Connect failed: ", err) client.Close() return } - Socks5Forward(client, target) + Socks5Forward(client, target, destAddrPort) } func Socks5Auth(client net.Conn) (err error) { @@ -97,61 +97,61 @@ func Socks5Auth(client net.Conn) (err error) { return nil } -func Socks5Connect(client net.Conn) (net.Conn, error) { +func Socks5Connect(client net.Conn) (net.Conn, string, error) { buf := make([]byte, 256) n, err := io.ReadFull(client, buf[:4]) if n != 4 { - return nil, errors.New("read header:" + err.Error()) + return nil, "", errors.New("read header:" + err.Error()) } ver, cmd, _, atyp := buf[0], buf[1], buf[2], buf[3] if ver != 5 || cmd != 1 { - return nil, errors.New("invalid ver/cmd") + return nil, "", errors.New("invalid ver/cmd") } addr := "" switch atyp { case 1: n, err = io.ReadFull(client, buf[:4]) if n != 4 { - return nil, errors.New("invalid IPv4:" + err.Error()) + return nil, "", errors.New("invalid IPv4:" + err.Error()) } addr = fmt.Sprintf("%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]) case 3: n, err = io.ReadFull(client, buf[:1]) if n != 1 { - return nil, errors.New("invalid hostname:" + err.Error()) + return nil, "", errors.New("invalid hostname:" + err.Error()) } addrLen := int(buf[0]) n, err = io.ReadFull(client, buf[:addrLen]) if n != addrLen { - return nil, errors.New("invalid hostname:" + err.Error()) + return nil, "", errors.New("invalid hostname:" + err.Error()) } addr = string(buf[:addrLen]) case 4: - return nil, errors.New("IPv6: no supported yet") + return nil, "", errors.New("IPv6: no supported yet") default: - return nil, errors.New("invalid atyp") + return nil, "", errors.New("invalid atyp") } n, err = io.ReadFull(client, buf[:2]) if n != 2 { - return nil, errors.New("read port:" + err.Error()) + return nil, "", errors.New("read port:" + err.Error()) } port := binary.BigEndian.Uint16(buf[:2]) destAddrPort := fmt.Sprintf("%s:%d", addr, port) logrus.Debug(fmt.Sprintf("Connecting %s", destAddrPort)) dest, err := net.Dial("tcp", destAddrPort) if err != nil { - return nil, errors.New("dial dst:" + err.Error()) + return nil, destAddrPort, errors.New("dial dst:" + err.Error()) } logrus.Debug(fmt.Sprintf("Connected %s", destAddrPort)) _, err = client.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0}) if err != nil { dest.Close() - return nil, errors.New("write rsp:" + err.Error()) + return nil, destAddrPort, errors.New("write rsp:" + err.Error()) } - return dest, nil + return dest, destAddrPort, nil } -func Socks5Forward(client, target net.Conn) { +func Socks5Forward(client, target net.Conn, destAddrPort string) { forward := func(src, dest net.Conn) { defer src.Close() defer dest.Close() @@ -161,22 +161,33 @@ func Socks5Forward(client, target net.Conn) { gforward := func(dst, src net.Conn) { defer dst.Close() defer src.Close() - CopyPileline(dst, src) + CopyPileline(dst, src, destAddrPort) } go forward(client, target) - if cache.Contains(string(target.RemoteAddr().String())) { + if cache.Contains(destAddrPort) { + logrus.Debug(fmt.Sprintf("Hit LRU Relay Cache: %s", destAddrPort)) go forward(target, client) return } go gforward(target, client) } -func CopyPileline(dst io.Writer, src io.Reader) { +func CopyPileline(dst io.Writer, src io.Reader, destAddrPort string) { buf := make([]byte, 1024*8) nr, err := src.Read(buf) - if err != nil && err != io.EOF { - logrus.Error("read error: ", err) + if err != nil { + if err == io.EOF { + logrus.Debug(fmt.Sprintf("[%s][%s] read EOF in first phase", destAddrPort, src.(*net.TCPConn).RemoteAddr().String())) + } else if strings.Contains(err.Error(), "use of closed network connection") { + logrus.Debug(fmt.Sprintf("[%s][%s] read closed in first phase: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), err.Error())) + } else { + logrus.Error(fmt.Sprintf("[%s][%s] read error in first phase: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), err.Error())) + } + return + } + if nr == 0 { + logrus.Debug(fmt.Sprintf("[%s][%s] read 0 in first phase", destAddrPort, src.(*net.TCPConn).RemoteAddr().String())) return } hint := string(buf[0:7]) @@ -191,7 +202,8 @@ func CopyPileline(dst io.Writer, src io.Reader) { if !is_http { dst.Write(buf[0:nr]) io.Copy(dst, src) - cache.Add(string(dst.(*net.TCPConn).RemoteAddr().String()), string(dst.(*net.TCPConn).RemoteAddr().String())) + cache.Add(destAddrPort, destAddrPort) + logrus.Debug(fmt.Sprintf("Not HTTP, Hint: %v, Add LRU Relay Cache: %s", buf[0:7], destAddrPort)) return } for { @@ -201,7 +213,7 @@ func CopyPileline(dst io.Writer, src io.Reader) { var m int m, err = src.Read(buf[nr:]) if err != nil { - logrus.Error("read error in http accumulation: ", err) + logrus.Error(fmt.Sprintf("[%s] read error in http accumulation: %v", destAddrPort, err)) break } nr += m @@ -209,7 +221,7 @@ func CopyPileline(dst io.Writer, src io.Reader) { } value, start, end := parser.FindHeader([]byte("User-Agent")) if value != nil && end > start { - logrus.Debug(fmt.Sprintf("[%s] Hit User-Agent: %s", string(parser.Host()), string(value))) + logrus.Debug(fmt.Sprintf("[%s][%s] Hit User-Agent: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), string(value))) for i := start; i < end; i++ { buf[i] = 32 } @@ -220,10 +232,10 @@ func CopyPileline(dst io.Writer, src io.Reader) { buf[start+i] = payloadByte[i] } } else { - logrus.Debug(fmt.Sprintf("[%s] Not found User-Agent, Add LRU Relay Cache", string(parser.Host()))) + logrus.Debug(fmt.Sprintf("[%s] Not found User-Agent, Add LRU Relay Cache", destAddrPort)) dst.Write(buf[0:nr]) io.Copy(dst, src) - cache.Add(string(dst.(*net.TCPConn).RemoteAddr().String()), string(dst.(*net.TCPConn).RemoteAddr().String())) + cache.Add(destAddrPort, destAddrPort) return } bodyLen := int(parser.ContentLength()) @@ -233,7 +245,7 @@ func CopyPileline(dst io.Writer, src io.Reader) { _, ew := dst.Write(buf[0:min(httpBodyOffset+bodyLen, nr)]) if ew != nil { - logrus.Error("write error: ", ew) + logrus.Error(fmt.Sprintf("[%s][%s] write error: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), ew.Error())) break } if httpBodyOffset+bodyLen > nr { @@ -241,12 +253,12 @@ func CopyPileline(dst io.Writer, src io.Reader) { for left > 0 { m, err := src.Read(buf[0:left]) if err != nil { - logrus.Error("read error in large body: ", err) + logrus.Error(fmt.Sprintf("[%s][%s] read error in large body: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), err.Error())) break } _, ew := dst.Write(buf[0:m]) if ew != nil { - logrus.Error("write error in large body: ", ew) + logrus.Error(fmt.Sprintf("[%s][%s] write error in large body: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), ew.Error())) break } left -= m @@ -263,11 +275,11 @@ func CopyPileline(dst io.Writer, src io.Reader) { nr += m if err != nil { if err == io.EOF { - logrus.Debug("read EOF in next phase") + logrus.Debug(fmt.Sprintf("[%s][%s] read EOF in next phase", destAddrPort, src.(*net.TCPConn).RemoteAddr().String())) } else if strings.Contains(err.Error(), "use of closed network connection") { - logrus.Debug("read closed in next phase: ", err) + logrus.Debug(fmt.Sprintf("[%s][%s] read closed in next phase: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), err.Error())) } else { - logrus.Error("read error in next phase: ", err) + logrus.Error(fmt.Sprintf("[%s][%s] read error in next phase: %s", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), err.Error())) } break } diff --git a/install.sh b/install.sh index cf2455f..31d4c2d 100755 --- a/install.sh +++ b/install.sh @@ -16,7 +16,7 @@ getcpucore() { cd /root getcpucore -version=0.1.1 +version=0.1.2 ua3f_tar=ua3f-$version-$cpucore.tar.gz if id -u shellclash &> /dev/null; then