mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +08:00 
			
		
		
		
	proxy: record failures of remote connection only
This commit is contained in:
		
							parent
							
								
									b3b11b4188
								
							
						
					
					
						commit
						89114e678b
					
				
							
								
								
									
										2
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.go
									
									
									
									
									
								
							@ -41,8 +41,8 @@ func main() {
 | 
				
			|||||||
	confInit()
 | 
						confInit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// setup a log func
 | 
						// 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...))
 | 
								stdlog.Output(2, fmt.Sprintf(f, v...))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/textproto"
 | 
						"net/textproto"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/nadoo/glider/common/conn"
 | 
						"github.com/nadoo/glider/common/conn"
 | 
				
			||||||
@ -103,10 +104,13 @@ func (s *HTTP) servHTTPS(r *request, c net.Conn) {
 | 
				
			|||||||
	log.F("[http] %s <-> %s [c] via %s", c.RemoteAddr(), r.uri, dialer.Addr())
 | 
						log.F("[http] %s <-> %s [c] via %s", c.RemoteAddr(), r.uri, dialer.Addr())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = conn.Relay(c, rc); err != nil {
 | 
						if err = conn.Relay(c, rc); err != nil {
 | 
				
			||||||
		log.F("[http] relay error: %v", err)
 | 
							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)
 | 
								s.proxy.Record(dialer, false)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *HTTP) servHTTP(req *request, c *conn.Conn) {
 | 
					func (s *HTTP) servHTTP(req *request, c *conn.Conn) {
 | 
				
			||||||
	rc, dialer, err := s.proxy.Dial("tcp", req.target)
 | 
						rc, dialer, err := s.proxy.Dial("tcp", req.target)
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@ import (
 | 
				
			|||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -114,10 +115,13 @@ func (s *RedirProxy) Serve(c net.Conn) {
 | 
				
			|||||||
	log.F("[redir] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr())
 | 
						log.F("[redir] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = conn.Relay(c, rc); err != nil {
 | 
						if err = conn.Relay(c, rc); err != nil {
 | 
				
			||||||
		log.F("[redir] relay error: %v", err)
 | 
							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)
 | 
								s.proxy.Record(dialer, false)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get the original destination of a TCP connection.
 | 
					// Get the original destination of a TCP connection.
 | 
				
			||||||
func getOrigDst(conn net.Conn, ipv6 bool) (socks.Addr, error) {
 | 
					func getOrigDst(conn net.Conn, ipv6 bool) (socks.Addr, error) {
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,7 @@ import (
 | 
				
			|||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -142,10 +143,13 @@ func (s *Socks5) Serve(c net.Conn) {
 | 
				
			|||||||
	log.F("[socks5] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr())
 | 
						log.F("[socks5] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = conn.Relay(c, rc); err != nil {
 | 
						if err = conn.Relay(c, rc); err != nil {
 | 
				
			||||||
		log.F("[socks5] relay error: %v", err)
 | 
							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)
 | 
								s.proxy.Record(dialer, false)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ListenAndServeUDP serves udp requests.
 | 
					// ListenAndServeUDP serves udp requests.
 | 
				
			||||||
func (s *Socks5) ListenAndServeUDP() {
 | 
					func (s *Socks5) ListenAndServeUDP() {
 | 
				
			||||||
 | 
				
			|||||||
@ -161,10 +161,13 @@ func (s *SS) Serve(c net.Conn) {
 | 
				
			|||||||
	log.F("[ss] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr())
 | 
						log.F("[ss] %s <-> %s via %s", c.RemoteAddr(), tgt, dialer.Addr())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = conn.Relay(c, rc); err != nil {
 | 
						if err = conn.Relay(c, rc); err != nil {
 | 
				
			||||||
		log.F("[ss] relay error: %v", err)
 | 
							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)
 | 
								s.proxy.Record(dialer, false)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ListenAndServeUDP serves udp ss requests.
 | 
					// ListenAndServeUDP serves udp ss requests.
 | 
				
			||||||
func (s *SS) ListenAndServeUDP() {
 | 
					func (s *SS) ListenAndServeUDP() {
 | 
				
			||||||
 | 
				
			|||||||
@ -91,7 +91,10 @@ func (s *TCPTun) Serve(c net.Conn) {
 | 
				
			|||||||
	log.F("[tcptun] %s <-> %s via %s", c.RemoteAddr(), s.raddr, dialer.Addr())
 | 
						log.F("[tcptun] %s <-> %s via %s", c.RemoteAddr(), s.raddr, dialer.Addr())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = conn.Relay(c, rc); err != nil {
 | 
						if err = conn.Relay(c, rc); err != nil {
 | 
				
			||||||
		log.F("[tcptun] relay error: %v", err)
 | 
							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)
 | 
								s.proxy.Record(dialer, false)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -42,7 +42,7 @@ const (
 | 
				
			|||||||
type frameWriter struct {
 | 
					type frameWriter struct {
 | 
				
			||||||
	io.Writer
 | 
						io.Writer
 | 
				
			||||||
	buf     []byte
 | 
						buf     []byte
 | 
				
			||||||
	maskKey []byte
 | 
						maskKey [maskKeyLen]byte
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FrameWriter returns a frame writer.
 | 
					// FrameWriter returns a frame writer.
 | 
				
			||||||
@ -51,7 +51,7 @@ func FrameWriter(w io.Writer) io.Writer {
 | 
				
			|||||||
	return &frameWriter{
 | 
						return &frameWriter{
 | 
				
			||||||
		Writer:  w,
 | 
							Writer:  w,
 | 
				
			||||||
		buf:     make([]byte, maxFrameHeaderSize+defaultFrameSize),
 | 
							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
 | 
								// maskkey
 | 
				
			||||||
			_, ew = w.Writer.Write(w.maskKey)
 | 
								_, ew = w.Writer.Write(w.maskKey[:])
 | 
				
			||||||
			if ew != nil {
 | 
								if ew != nil {
 | 
				
			||||||
				err = ew
 | 
									err = ew
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user