From 2e44d79db8c2e6e178246f3bcd75b168e23e01cd Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Thu, 7 Mar 2019 23:34:29 +0800 Subject: [PATCH] reject: add a virtual proxy reject --- go.mod | 2 +- go.sum | 2 ++ main.go | 1 + proxy/forwarder.go | 2 +- proxy/http/http.go | 4 ++-- proxy/mixed/mixed.go | 2 +- proxy/redir/redir_linux.go | 2 +- proxy/reject/reject.go | 40 ++++++++++++++++++++++++++++++++++++++ proxy/socks5/socks5.go | 2 +- proxy/ss/ss.go | 2 +- proxy/tcptun/tcptun.go | 7 +++---- 11 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 proxy/reject/reject.go diff --git a/go.mod b/go.mod index 6584b55..a0054e7 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/xtaci/kcp-go v5.0.7+incompatible golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 golang.org/x/net v0.0.0-20190301231341-16b79f2e4e95 // indirect - golang.org/x/sys v0.0.0-20190306155319-3e9a981b8ddb // indirect + golang.org/x/sys v0.0.0-20190306220723-b294cbcfc56d // indirect ) // Replace dependency modules with local developing copy diff --git a/go.sum b/go.sum index 5e1d109..e618779 100644 --- a/go.sum +++ b/go.sum @@ -49,3 +49,5 @@ golang.org/x/sys v0.0.0-20190306071516-a98ae47d97a5 h1:x+Ampnh9f/zE3phqz3m2ExO+t golang.org/x/sys v0.0.0-20190306071516-a98ae47d97a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190306155319-3e9a981b8ddb h1:xIUJ1YHSR/6NhHkg597Yw0jPKhHGJmQfc8CzOmXgEco= golang.org/x/sys v0.0.0-20190306155319-3e9a981b8ddb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190306220723-b294cbcfc56d h1:4Ew1XHJYjwX6RiE8SgSymqS1zCRQyGpcAnVfbpEuXfE= +golang.org/x/sys v0.0.0-20190306220723-b294cbcfc56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index 9dccf2f..5b1f4ad 100644 --- a/main.go +++ b/main.go @@ -17,6 +17,7 @@ import ( _ "github.com/nadoo/glider/proxy/kcp" _ "github.com/nadoo/glider/proxy/mixed" _ "github.com/nadoo/glider/proxy/obfs" + _ "github.com/nadoo/glider/proxy/reject" _ "github.com/nadoo/glider/proxy/socks5" _ "github.com/nadoo/glider/proxy/ss" _ "github.com/nadoo/glider/proxy/ssr" diff --git a/proxy/forwarder.go b/proxy/forwarder.go index e25041a..366b9ea 100644 --- a/proxy/forwarder.go +++ b/proxy/forwarder.go @@ -91,7 +91,7 @@ func (f *Forwarder) Dial(network, addr string) (c net.Conn, err error) { c, err = f.Dialer.Dial(network, addr) if err != nil { f.IncFailures() - if f.Failures() >= f.MaxFailures() { + if f.Failures() >= f.MaxFailures() && f.Enabled() { f.Disable() log.F("[forwarder] %s reaches maxfailures.", f.addr) } diff --git a/proxy/http/http.go b/proxy/http/http.go index e37d704..e69d9af 100644 --- a/proxy/http/http.go +++ b/proxy/http/http.go @@ -145,7 +145,7 @@ func (s *HTTP) Serve(c net.Conn) { rc, err := s.dialer.Dial("tcp", tgt) if err != nil { fmt.Fprintf(c, "%s 502 ERROR\r\n\r\n", proto) - log.F("[http] failed to dial: %v", err) + log.F("[http] %s <-> %s, error in dial: %v", c.RemoteAddr(), tgt, err) return } defer rc.Close() @@ -204,7 +204,7 @@ func (s *HTTP) servHTTPS(method, requestURI, proto string, c net.Conn) { if err != nil { c.Write([]byte(proto)) c.Write([]byte(" 502 ERROR\r\n\r\n")) - log.F("[http] failed to dial: %v", err) + log.F("[http] %s <-> %s [c], error in dial: %v", c.RemoteAddr(), requestURI, err) return } diff --git a/proxy/mixed/mixed.go b/proxy/mixed/mixed.go index 64f26ad..215b35c 100644 --- a/proxy/mixed/mixed.go +++ b/proxy/mixed/mixed.go @@ -98,7 +98,7 @@ func (p *MixedProxy) Serve(c net.Conn) { if p.socks5 != nil { head, err := cc.Peek(1) if err != nil { - log.F("[mixed] socks5 peek error: %s", err) + // log.F("[mixed] socks5 peek error: %s", err) return } diff --git a/proxy/redir/redir_linux.go b/proxy/redir/redir_linux.go index 06f2fc9..0ad21ae 100644 --- a/proxy/redir/redir_linux.go +++ b/proxy/redir/redir_linux.go @@ -106,7 +106,7 @@ func (s *RedirProxy) Serve(c net.Conn) { rc, err := s.dialer.Dial("tcp", tgt.String()) if err != nil { - log.F("[redir] failed to connect to target: %v", err) + log.F("[redir] %s <-> %s, error in dial: %v", c.RemoteAddr(), tgt, err) return } defer rc.Close() diff --git a/proxy/reject/reject.go b/proxy/reject/reject.go new file mode 100644 index 0000000..b210354 --- /dev/null +++ b/proxy/reject/reject.go @@ -0,0 +1,40 @@ +// Package reject implements a virtual proxy which always reject requests. +package reject + +import ( + "errors" + "net" + + "github.com/nadoo/glider/proxy" +) + +// A Reject represents the base struct of a reject proxy. +type Reject struct{} + +func init() { + proxy.RegisterDialer("reject", NewRejectDialer) +} + +// NewReject returns a reject proxy, reject:// +func NewReject(s string, dialer proxy.Dialer) (*Reject, error) { + return &Reject{}, nil +} + +// NewRejectDialer returns a reject proxy dialer. +func NewRejectDialer(s string, dialer proxy.Dialer) (proxy.Dialer, error) { + return NewReject(s, dialer) +} + +// Addr returns forwarder's address. +func (s *Reject) Addr() string { return "reject" } + +// NextDialer returns the next dialer. +func (s *Reject) NextDialer(dstAddr string) proxy.Dialer { return s } + +// Dial connects to the address addr on the network net via the proxy. +func (s *Reject) Dial(network, addr string) (net.Conn, error) { return nil, errors.New("reject") } + +// DialUDP connects to the given address via the proxy. +func (s *Reject) DialUDP(network, addr string) (net.PacketConn, net.Addr, error) { + return nil, nil, errors.New("reject") +} diff --git a/proxy/socks5/socks5.go b/proxy/socks5/socks5.go index 224196b..c714560 100644 --- a/proxy/socks5/socks5.go +++ b/proxy/socks5/socks5.go @@ -132,7 +132,7 @@ func (s *SOCKS5) Serve(c net.Conn) { rc, err := s.dialer.Dial("tcp", tgt.String()) if err != nil { - log.F("[socks5] failed to connect to target: %v", err) + log.F("[socks5] %s <-> %s, error in dial: %v", c.RemoteAddr(), tgt, err) return } defer rc.Close() diff --git a/proxy/ss/ss.go b/proxy/ss/ss.go index 5cacb8b..34a4a10 100644 --- a/proxy/ss/ss.go +++ b/proxy/ss/ss.go @@ -149,7 +149,7 @@ func (s *SS) Serve(c net.Conn) { rc, err := dialer.Dial(network, tgt.String()) if err != nil { - log.F("[ss] failed to connect to target: %v", err) + log.F("[ss] %s <-> %s, error in dial: %v", c.RemoteAddr(), tgt, err) return } defer rc.Close() diff --git a/proxy/tcptun/tcptun.go b/proxy/tcptun/tcptun.go index e04b191..b57aa3f 100644 --- a/proxy/tcptun/tcptun.go +++ b/proxy/tcptun/tcptun.go @@ -55,12 +55,12 @@ func (s *TCPTun) ListenAndServe() { return } - log.F("listening TCP on %s", s.addr) + log.F("[tcptun] listening TCP on %s", s.addr) for { c, err := l.Accept() if err != nil { - log.F("failed to accept: %v", err) + log.F("[tcptun] failed to accept: %v", err) continue } @@ -78,8 +78,7 @@ func (s *TCPTun) Serve(c net.Conn) { rc, err := s.dialer.Dial("tcp", s.raddr) if err != nil { - - log.F("failed to connect to target: %v", err) + log.F("[tcptun] %s <-> %s, error in dial: %v", c.RemoteAddr(), s.addr, err) return } defer rc.Close()