From 39ca66f6214755f287ca68a37056bac646975a37 Mon Sep 17 00:00:00 2001 From: SunBK201 Date: Fri, 15 Dec 2023 01:26:42 +0800 Subject: [PATCH] feat: pass unimportant ua --- build.sh | 2 +- clash.yaml | 2 +- cmd/ua3f.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++----- go.mod | 5 +++- go.sum | 10 +++++-- install.sh | 2 +- 6 files changed, 83 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index 67da683..fd00e74 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/sh project_name="ua3f" -release_version="0.1.2" +release_version="0.1.3" target=cmd/ua3f.go release_dir=./bin diff --git a/clash.yaml b/clash.yaml index 08944ee..ae67f0f 100644 --- a/clash.yaml +++ b/clash.yaml @@ -1,7 +1,7 @@ --- #--------------------------------------------------------------------------------------# # Written by SunBK201 -# https://github.com/SunBK201/MyProfiles +# https://github.com/SunBK201/UA3F #--------------------------------------------------------------------------------------# # Port of HTTP(S) proxy server on the local end port: 7890 diff --git a/cmd/ua3f.go b/cmd/ua3f.go index be7e247..43f65ee 100644 --- a/cmd/ua3f.go +++ b/cmd/ua3f.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "net" + "slices" "strings" "time" "ua3f/http" @@ -16,12 +17,26 @@ import ( "github.com/sirupsen/logrus" ) -var version = "0.1.2" +var version = "0.1.3" var payloadByte []byte var cache *expirable.LRU[string, string] -func main() { +var whitelist = []string{ + "MicroMessenger Client", + "ByteDancePcdn", + "Go-http-client/1.1", +} +// var dpool *ants.PoolWithFunc +// var gpool *ants.PoolWithFunc +// +// type RelayConn struct { +// src net.Conn +// dst net.Conn +// destAddrPort string +// } + +func main() { var payload string var addr string var port int @@ -40,7 +55,12 @@ func main() { logrus.Info(fmt.Sprintf("User-Agent: %s", payload)) logrus.Info(fmt.Sprintf("Log level: %s", loglevel)) - cache = expirable.NewLRU[string, string](100, nil, time.Second*600) + cache = expirable.NewLRU[string, string](300, nil, time.Second*600) + + // dpool, _ = ants.NewPoolWithFunc(1000, forward) + // gpool, _ = ants.NewPoolWithFunc(500, gforward) + // defer dpool.Release() + // defer gpool.Release() payloadByte = []byte(payload) @@ -74,6 +94,7 @@ func process(client net.Conn) { return } Socks5Forward(client, target, destAddrPort) + // Socks5Relay(client, target, destAddrPort) } func Socks5Auth(client net.Conn) (err error) { @@ -151,6 +172,39 @@ func Socks5Connect(client net.Conn) (net.Conn, string, error) { return dest, destAddrPort, nil } +/* +func forward(i interface{}) { + rc := i.(*RelayConn) + defer rc.src.Close() + defer rc.dst.Close() + io.Copy(rc.src, rc.dst) +} + +func gforward(i interface{}) { + rc := i.(*RelayConn) + defer rc.dst.Close() + defer rc.src.Close() + CopyPileline(rc.dst, rc.src, rc.destAddrPort) +} + +func Socks5Relay(client, target net.Conn, destAddrPort string) { + rc := &RelayConn{ + src: client, + dst: target, + destAddrPort: destAddrPort, + } + logrus.Debug(fmt.Sprintf("dpool: %d left: %d, gpool: %d left: %d", dpool.Running(), dpool.Free(), gpool.Running(), gpool.Free())) + dpool.Invoke(rc) + if cache.Contains(destAddrPort) { + logrus.Debug(fmt.Sprintf("Hit LRU Relay Cache: %s", destAddrPort)) + rc.src, rc.dst = rc.dst, rc.src + dpool.Invoke(rc) + } else { + gpool.Invoke(rc) + } +} +*/ + func Socks5Forward(client, target net.Conn, destAddrPort string) { forward := func(src, dest net.Conn) { defer src.Close() @@ -168,9 +222,9 @@ func Socks5Forward(client, target net.Conn, destAddrPort string) { if cache.Contains(destAddrPort) { logrus.Debug(fmt.Sprintf("Hit LRU Relay Cache: %s", destAddrPort)) go forward(target, client) - return + } else { + go gforward(target, client) } - go gforward(target, client) } func CopyPileline(dst io.Writer, src io.Reader, destAddrPort string) { @@ -203,7 +257,7 @@ func CopyPileline(dst io.Writer, src io.Reader, destAddrPort string) { dst.Write(buf[0:nr]) io.Copy(dst, src) cache.Add(destAddrPort, destAddrPort) - logrus.Debug(fmt.Sprintf("Not HTTP, Hint: %v, Add LRU Relay Cache: %s", buf[0:7], destAddrPort)) + logrus.Debug(fmt.Sprintf("Not HTTP, Hint: %v, Add LRU Relay Cache: %s, Cache Len: %d", buf[0:7], destAddrPort, cache.Len())) return } for { @@ -221,6 +275,13 @@ func CopyPileline(dst io.Writer, src io.Reader, destAddrPort string) { } value, start, end := parser.FindHeader([]byte("User-Agent")) if value != nil && end > start { + if slices.Contains(whitelist, string(value)) { + logrus.Debug(fmt.Sprintf("[%s][%s] Hit User-Agent Whitelist: %s, Add LRU Relay Cache, Cache Len: %d", destAddrPort, src.(*net.TCPConn).RemoteAddr().String(), string(value), cache.Len())) + dst.Write(buf[0:nr]) + io.Copy(dst, src) + cache.Add(destAddrPort, destAddrPort) + return + } 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 @@ -232,7 +293,7 @@ func CopyPileline(dst io.Writer, src io.Reader, destAddrPort string) { buf[start+i] = payloadByte[i] } } else { - logrus.Debug(fmt.Sprintf("[%s] Not found User-Agent, Add LRU Relay Cache", destAddrPort)) + logrus.Debug(fmt.Sprintf("[%s] Not found User-Agent, Add LRU Relay Cache, Cache Len: %d", destAddrPort, cache.Len())) dst.Write(buf[0:nr]) io.Copy(dst, src) cache.Add(destAddrPort, destAddrPort) diff --git a/go.mod b/go.mod index 4bbacfc..efbbbd0 100644 --- a/go.mod +++ b/go.mod @@ -7,4 +7,7 @@ require ( github.com/sirupsen/logrus v1.9.3 ) -require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +require ( + github.com/stretchr/testify v1.8.2 // indirect + golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +) diff --git a/go.sum b/go.sum index 5ca2774..917861d 100644 --- a/go.sum +++ b/go.sum @@ -8,10 +8,16 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/install.sh b/install.sh index 31d4c2d..c130d13 100755 --- a/install.sh +++ b/install.sh @@ -16,7 +16,7 @@ getcpucore() { cd /root getcpucore -version=0.1.2 +version=0.1.3 ua3f_tar=ua3f-$version-$cpucore.tar.gz if id -u shellclash &> /dev/null; then