diff --git a/.gitignore b/.gitignore index 85c7536..e0f3776 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,11 @@ .idea .vscode +# dev test only +*/dev/* +dev*.go + + dist *.zip @@ -30,4 +35,3 @@ config/rules.d/*.list glider /bak/ /rules.d/ -*/dev/* \ No newline at end of file diff --git a/README.md b/README.md index 79c50a7..c0251d9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ glider -h click to see details ```bash -glider 0.10.1 usage: +glider 0.10.2 usage: -checkdisabledonly check disabled fowarders only -checkinterval int diff --git a/dev.go b/dev.go deleted file mode 100644 index 538890a..0000000 --- a/dev.go +++ /dev/null @@ -1,18 +0,0 @@ -//+build dev - -package main - -import ( - "fmt" - "net/http" - _ "net/http/pprof" -) - -func init() { - go func() { - err := http.ListenAndServe(":6060", nil) - if err != nil { - fmt.Printf("Create pprof server error: %s\n", err) - } - }() -} diff --git a/dev_linux.go b/dev_linux.go deleted file mode 100644 index 52e7dd3..0000000 --- a/dev_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -//+build dev - -package main - -import ( - _ "github.com/nadoo/glider/proxy/tproxy" -) diff --git a/go.mod b/go.mod index e666f12..2f0ee04 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,15 @@ module github.com/nadoo/glider go 1.15 require ( - github.com/mzz2017/shadowsocksR v0.0.0-20200809233203-ce9fb439e579 + github.com/mzz2017/shadowsocksR v1.0.0 github.com/nadoo/conflag v0.2.3 github.com/nadoo/go-shadowsocks2 v0.1.2 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/xtaci/kcp-go/v5 v5.5.15 golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de + golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d // indirect - golang.org/x/tools v0.0.0-20200812231640-9176cd30088c // indirect + golang.org/x/tools v0.0.0-20200813231717-0a73ddcff9b8 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect ) diff --git a/go.sum b/go.sum index 9ea40a8..a795d0c 100644 --- a/go.sum +++ b/go.sum @@ -28,8 +28,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 h1:ULR/QWMgcgRiZLUjSSJMU+fW+RDMstRdmnDWj9Q+AsA= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= github.com/mzz2017/shadowsocksR v0.0.0-20200126130347-721f53a7b15a/go.mod h1:1SJEvxD2Y+N7SK2NpCC4wSatvfGGTUo2rhPdthUFsCU= -github.com/mzz2017/shadowsocksR v0.0.0-20200809233203-ce9fb439e579 h1:vz7wDwSpkurhD36VzgObl/t0IZR6PRGQsh20zcE68dA= -github.com/mzz2017/shadowsocksR v0.0.0-20200809233203-ce9fb439e579/go.mod h1:5A4hA1y7oP4SoAqcc7gZvjFF63KpKpI5aCUIMrXV1UI= +github.com/mzz2017/shadowsocksR v1.0.0 h1:F/CdugIPUJYasqsRK4qWTo+8/mJgZHGXkwXhf67zJx0= +github.com/mzz2017/shadowsocksR v1.0.0/go.mod h1:5A4hA1y7oP4SoAqcc7gZvjFF63KpKpI5aCUIMrXV1UI= github.com/nadoo/conflag v0.2.2 h1:xywuyaevdBnA3+4g9S11ng+Nby725WN1LXargWnAXpM= github.com/nadoo/conflag v0.2.2/go.mod h1:dzFfDUpXdr2uS2oV+udpy5N2vfNOu/bFzjhX1WI52co= github.com/nadoo/conflag v0.2.3 h1:/+rTaN0bHTIiQbPl1WZK78JRoqjlNqJ9Zf05ep0o5jI= @@ -99,6 +99,8 @@ golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -120,8 +122,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU= golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812231640-9176cd30088c h1:ZSTOUQugXA1i88foZV5ck1FrcnEYhGmlpiPXgDWmhG0= -golang.org/x/tools v0.0.0-20200812231640-9176cd30088c/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200813231717-0a73ddcff9b8 h1:+hbnCVs7yJ18cZmTc/aRTUmFIr+z6I1lnMjyeMJJGEM= +golang.org/x/tools v0.0.0-20200813231717-0a73ddcff9b8/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= diff --git a/main.go b/main.go index daed2d2..bea6e06 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "github.com/nadoo/glider/rule" "github.com/nadoo/glider/strategy" + // comment out the protocol you don't need to make the compiled binary smaller. _ "github.com/nadoo/glider/proxy/http" _ "github.com/nadoo/glider/proxy/kcp" _ "github.com/nadoo/glider/proxy/mixed" @@ -33,7 +34,7 @@ import ( _ "github.com/nadoo/glider/proxy/ws" ) -var version = "0.10.1" +var version = "0.10.2" func main() { // read configs diff --git a/proxy/tproxy/tproxy_linux.go b/proxy/tproxy/tproxy_linux.go deleted file mode 100644 index 6c3149e..0000000 --- a/proxy/tproxy/tproxy_linux.go +++ /dev/null @@ -1,177 +0,0 @@ -// ref: https://www.kernel.org/doc/Documentation/networking/tproxy.txt -// @LiamHaworth: https://github.com/LiamHaworth/go-tproxy/blob/master/tproxy_udp.go - -package tproxy - -import ( - "bytes" - "encoding/binary" - "fmt" - "net" - "net/url" - "strconv" - "syscall" - "unsafe" - - "github.com/nadoo/glider/common/log" - "github.com/nadoo/glider/proxy" -) - -// TProxy struct. -type TProxy struct { - proxy proxy.Proxy - addr string -} - -func init() { - proxy.RegisterServer("tproxy", NewTProxyServer) -} - -// NewTProxy returns a tproxy. -func NewTProxy(s string, p proxy.Proxy) (*TProxy, error) { - u, err := url.Parse(s) - if err != nil { - log.F("parse err: %s", err) - return nil, err - } - - addr := u.Host - - tp := &TProxy{ - proxy: p, - addr: addr, - } - - return tp, nil -} - -// NewTProxyServer returns a udp tunnel server. -func NewTProxyServer(s string, p proxy.Proxy) (proxy.Server, error) { - return NewTProxy(s, p) -} - -// ListenAndServe listens on server's addr and serves connections. -func (s *TProxy) ListenAndServe() { - // go s.ListenAndServeTCP() - s.ListenAndServeUDP() -} - -// ListenAndServeTCP . -func (s *TProxy) ListenAndServeTCP() { - log.F("[tproxy] tcp mode not supported now, please use 'redir' instead") -} - -// ListenAndServeUDP . -func (s *TProxy) ListenAndServeUDP() { - laddr, err := net.ResolveUDPAddr("udp", s.addr) - if err != nil { - log.F("[tproxy] failed to resolve addr %s: %v", s.addr, err) - return - } - - lc, err := net.ListenUDP("udp", laddr) - if err != nil { - log.F("[tproxy] failed to listen on %s: %v", s.addr, err) - return - } - - fd, err := lc.File() - if err != nil { - log.F("[tproxy] failed to get file descriptor: %v", err) - return - } - defer fd.Close() - - fileDescriptor := int(fd.Fd()) - if err = syscall.SetsockoptInt(fileDescriptor, syscall.SOL_IP, syscall.IP_TRANSPARENT, 1); err != nil { - syscall.Close(fileDescriptor) - log.F("[tproxy] failed to set socket option IP_TRANSPARENT: %v", err) - return - } - - if err = syscall.SetsockoptInt(fileDescriptor, syscall.SOL_IP, syscall.IP_RECVORIGDSTADDR, 1); err != nil { - syscall.Close(fileDescriptor) - log.F("[tproxy] failed to set socket option IP_RECVORIGDSTADDR: %v", err) - return - } - - for { - buf := make([]byte, 1024) - _, srcAddr, dstAddr, err := ReadFromUDP(lc, buf) - if err != nil { - if netErr, ok := err.(net.Error); ok && netErr.Temporary() { - log.F("[tproxy] temporary reading data error: %s", netErr) - continue - } - - log.F("[tproxy] Unrecoverable error while reading data: %s", err) - continue - } - - log.F("[tproxy] Accepting UDP connection from %s with destination of %s", srcAddr.String(), dstAddr.String()) - - } - -} - -// Serve . -func (s *TProxy) Serve(c net.Conn) { - log.F("[tproxy] func Serve: can not be called directly") -} - -// ReadFromUDP reads a UDP packet from c, copying the payload into b. -// It returns the number of bytes copied into b and the return address -// that was on the packet. -// -// Out-of-band data is also read in so that the original destination -// address can be identified and parsed. -func ReadFromUDP(conn *net.UDPConn, b []byte) (int, *net.UDPAddr, *net.UDPAddr, error) { - oob := make([]byte, 1024) - n, oobn, _, addr, err := conn.ReadMsgUDP(b, oob) - if err != nil { - return 0, nil, nil, err - } - - msgs, err := syscall.ParseSocketControlMessage(oob[:oobn]) - if err != nil { - return 0, nil, nil, fmt.Errorf("parsing socket control message: %s", err) - } - - var originalDst *net.UDPAddr - for _, msg := range msgs { - if msg.Header.Level == syscall.SOL_IP && msg.Header.Type == syscall.IP_RECVORIGDSTADDR { - originalDstRaw := &syscall.RawSockaddrInet4{} - if err = binary.Read(bytes.NewReader(msg.Data), binary.LittleEndian, originalDstRaw); err != nil { - return 0, nil, nil, fmt.Errorf("reading original destination address: %s", err) - } - - switch originalDstRaw.Family { - case syscall.AF_INET: - pp := (*syscall.RawSockaddrInet4)(unsafe.Pointer(originalDstRaw)) - p := (*[2]byte)(unsafe.Pointer(&pp.Port)) - originalDst = &net.UDPAddr{ - IP: net.IPv4(pp.Addr[0], pp.Addr[1], pp.Addr[2], pp.Addr[3]), - Port: int(p[0])<<8 + int(p[1]), - } - - case syscall.AF_INET6: - pp := (*syscall.RawSockaddrInet6)(unsafe.Pointer(originalDstRaw)) - p := (*[2]byte)(unsafe.Pointer(&pp.Port)) - originalDst = &net.UDPAddr{ - IP: net.IP(pp.Addr[:]), - Port: int(p[0])<<8 + int(p[1]), - Zone: strconv.Itoa(int(pp.Scope_id)), - } - - default: - return 0, nil, nil, fmt.Errorf("original destination is an unsupported network family") - } - } - } - - if originalDst == nil { - return 0, nil, nil, fmt.Errorf("unable to obtain original destination: %s", err) - } - - return n, addr, originalDst, nil -}