From 89114e678b4782a0a8e434b02cb71b8b53b924df Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Mon, 14 Sep 2020 20:56:37 +0800 Subject: [PATCH] proxy: record failures of remote connection only --- main.go | 4 ++-- proxy/http/server.go | 8 ++++++-- proxy/redir/redir_linux.go | 8 ++++++-- proxy/socks5/socks5.go | 8 ++++++-- proxy/ss/ss.go | 7 +++++-- proxy/tcptun/tcptun.go | 7 +++++-- proxy/ws/frame.go | 6 +++--- 7 files changed, 33 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index 85af223..539b1ea 100644 --- a/main.go +++ b/main.go @@ -41,8 +41,8 @@ func main() { confInit() // setup a log func - log.F = func(f string, v ...interface{}) { - if conf.Verbose { + if conf.Verbose { + log.F = func(f string, v ...interface{}) { stdlog.Output(2, fmt.Sprintf(f, v...)) } } diff --git a/proxy/http/server.go b/proxy/http/server.go index 773e336..e69a7a4 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -6,6 +6,7 @@ import ( "io" "net" "net/textproto" + "strings" "time" "github.com/nadoo/glider/common/conn" @@ -103,8 +104,11 @@ func (s *HTTP) servHTTPS(r *request, c net.Conn) { log.F("[http] %s <-> %s [c] via %s", c.RemoteAddr(), r.uri, dialer.Addr()) if err = conn.Relay(c, rc); err != nil { - log.F("[http] relay error: %v", err) - s.proxy.Record(dialer, false) + log.F("[http] %s <-> %s via %s, relay error: %v", c.RemoteAddr(), r.uri, dialer.Addr(), err) + // record remote conn failure only + if !strings.Contains(err.Error(), s.addr) { + s.proxy.Record(dialer, false) + } } } diff --git a/proxy/redir/redir_linux.go b/proxy/redir/redir_linux.go index 8dc0aea..c91390c 100644 --- a/proxy/redir/redir_linux.go +++ b/proxy/redir/redir_linux.go @@ -7,6 +7,7 @@ import ( "errors" "net" "net/url" + "strings" "syscall" "unsafe" @@ -114,8 +115,11 @@ func (s *RedirProxy) Serve(c net.Conn) { log.F("[redir] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr()) if err = conn.Relay(c, rc); err != nil { - log.F("[redir] relay error: %v", err) - s.proxy.Record(dialer, false) + log.F("[redir] %s <-> %s via %s, relay error: %v", c.RemoteAddr(), tgt, dialer.Addr(), err) + // record remote conn failure only + if !strings.Contains(err.Error(), s.addr) { + s.proxy.Record(dialer, false) + } } } diff --git a/proxy/socks5/socks5.go b/proxy/socks5/socks5.go index a018d45..8442f27 100644 --- a/proxy/socks5/socks5.go +++ b/proxy/socks5/socks5.go @@ -15,6 +15,7 @@ import ( "net" "net/url" "strconv" + "strings" "sync" "time" @@ -142,8 +143,11 @@ func (s *Socks5) Serve(c net.Conn) { log.F("[socks5] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr()) if err = conn.Relay(c, rc); err != nil { - log.F("[socks5] relay error: %v", err) - s.proxy.Record(dialer, false) + log.F("[socks5] %s <-> %s via %s, relay error: %v", c.RemoteAddr(), tgt, dialer.Addr(), err) + // record remote conn failure only + if !strings.Contains(err.Error(), s.addr) { + s.proxy.Record(dialer, false) + } } } diff --git a/proxy/ss/ss.go b/proxy/ss/ss.go index a6694f7..8baded1 100644 --- a/proxy/ss/ss.go +++ b/proxy/ss/ss.go @@ -161,8 +161,11 @@ func (s *SS) Serve(c net.Conn) { log.F("[ss] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr()) if err = conn.Relay(c, rc); err != nil { - log.F("[ss] relay error: %v", err) - s.proxy.Record(dialer, false) + log.F("[ss] %s <-> %s via %s, relay error: %v", c.RemoteAddr(), tgt, dialer.Addr(), err) + // record remote conn failure only + if !strings.Contains(err.Error(), s.addr) { + s.proxy.Record(dialer, false) + } } } diff --git a/proxy/tcptun/tcptun.go b/proxy/tcptun/tcptun.go index 4ade827..7aa2ae6 100644 --- a/proxy/tcptun/tcptun.go +++ b/proxy/tcptun/tcptun.go @@ -91,7 +91,10 @@ func (s *TCPTun) Serve(c net.Conn) { log.F("[tcptun] %s <-> %s via %s", c.RemoteAddr(), s.raddr, dialer.Addr()) if err = conn.Relay(c, rc); err != nil { - log.F("[tcptun] relay error: %v", err) - s.proxy.Record(dialer, false) + log.F("[tcptun] %s <-> %s via %s, relay error: %v", c.RemoteAddr(), s.raddr, dialer.Addr(), err) + // record remote conn failure only + if !strings.Contains(err.Error(), s.addr) { + s.proxy.Record(dialer, false) + } } } diff --git a/proxy/ws/frame.go b/proxy/ws/frame.go index e28cbc0..df1777c 100644 --- a/proxy/ws/frame.go +++ b/proxy/ws/frame.go @@ -42,7 +42,7 @@ const ( type frameWriter struct { io.Writer buf []byte - maskKey []byte + maskKey [maskKeyLen]byte } // FrameWriter returns a frame writer. @@ -51,7 +51,7 @@ func FrameWriter(w io.Writer) io.Writer { return &frameWriter{ Writer: w, buf: make([]byte, maxFrameHeaderSize+defaultFrameSize), - maskKey: []byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}, + maskKey: [...]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}, } } @@ -93,7 +93,7 @@ func (w *frameWriter) ReadFrom(r io.Reader) (n int64, err error) { } // maskkey - _, ew = w.Writer.Write(w.maskKey) + _, ew = w.Writer.Write(w.maskKey[:]) if ew != nil { err = ew break