diff --git a/dns/client.go b/dns/client.go index 5b57ae3..e280024 100644 --- a/dns/client.go +++ b/dns/client.go @@ -233,21 +233,18 @@ func (c *Client) exchangeUDP(rc net.Conn, reqBytes []byte) ([]byte, error) { // SetServers sets upstream dns servers for the given domain. func (c *Client) SetServers(domain string, servers []string) { - c.upStreamMap[domain] = NewUPStream(servers) + c.upStreamMap[strings.ToLower(domain)] = NewUPStream(servers) } // UpStream returns upstream dns server for the given domain. func (c *Client) UpStream(domain string) *UPStream { - domainParts := strings.Split(domain, ".") - length := len(domainParts) - for i := length - 1; i >= 0; i-- { - domain := strings.Join(domainParts[i:length], ".") - - if upstream, ok := c.upStreamMap[domain]; ok { + domain = strings.ToLower(domain) + for i := len(domain); i != -1; { + i = strings.LastIndexByte(domain[:i], '.') + if upstream, ok := c.upStreamMap[domain[i+1:]]; ok { return upstream } } - return c.upStream } diff --git a/go.mod b/go.mod index 2f0ee04..4a2edf2 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,8 @@ require ( 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-20200813231717-0a73ddcff9b8 // indirect + golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect + golang.org/x/tools v0.0.0-20200815165600-90abf76919f3 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect ) diff --git a/go.sum b/go.sum index a795d0c..18671e7 100644 --- a/go.sum +++ b/go.sum @@ -115,15 +115,15 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs= golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo= -golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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-20200813231717-0a73ddcff9b8 h1:+hbnCVs7yJ18cZmTc/aRTUmFIr+z6I1lnMjyeMJJGEM= -golang.org/x/tools v0.0.0-20200813231717-0a73ddcff9b8/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200815165600-90abf76919f3 h1:0aScV/0rLmANzEYIhjCOi2pTvDyhZNduBUMD2q3iqs4= +golang.org/x/tools v0.0.0-20200815165600-90abf76919f3/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/ipset/ipset_linux.go b/ipset/ipset_linux.go index 0009e8a..4be93dd 100644 --- a/ipset/ipset_linux.go +++ b/ipset/ipset_linux.go @@ -128,18 +128,13 @@ func (m *Manager) AddDomainIP(domain, ip string) error { if domain == "" || ip == "" { return errors.New("please specify the domain and ip address") } - - domainParts := strings.Split(domain, ".") - length := len(domainParts) - for i := length - 1; i >= 0; i-- { - domain := strings.Join(domainParts[i:length], ".") - - // find in domainMap - if ipset, ok := m.domainSet.Load(domain); ok { + domain = strings.ToLower(domain) + for i := len(domain); i != -1; { + i = strings.LastIndexByte(domain[:i], '.') + if ipset, ok := m.domainSet.Load(domain[i+1:]); ok { AddToSet(m.fd, m.lsa, ipset.(string), ip) } } - return nil } diff --git a/main.go b/main.go index bea6e06..db7d692 100644 --- a/main.go +++ b/main.go @@ -34,7 +34,7 @@ import ( _ "github.com/nadoo/glider/proxy/ws" ) -var version = "0.10.2" +var version = "0.10.3" func main() { // read configs diff --git a/proxy/socks5/packet.go b/proxy/socks5/packet.go index 432f364..593429f 100644 --- a/proxy/socks5/packet.go +++ b/proxy/socks5/packet.go @@ -21,7 +21,7 @@ type PktConn struct { ctrlConn net.Conn // tcp control conn } -// NewPktConn returns a PktConn +// NewPktConn returns a PktConn. func NewPktConn(c net.PacketConn, writeAddr net.Addr, tgtAddr socks.Addr, tgtHeader bool, ctrlConn net.Conn) *PktConn { pc := &PktConn{ PacketConn: c, @@ -48,7 +48,7 @@ func NewPktConn(c net.PacketConn, writeAddr net.Addr, tgtAddr socks.Addr, tgtHea return pc } -// ReadFrom overrides the original function from net.PacketConn +// ReadFrom overrides the original function from net.PacketConn. func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { if !pc.tgtHeader { return pc.PacketConn.ReadFrom(b) @@ -90,7 +90,7 @@ func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { return n - len(tgtAddr) - 3, raddr, err } -// WriteTo overrides the original function from net.PacketConn +// WriteTo overrides the original function from net.PacketConn. func (pc *PktConn) WriteTo(b []byte, addr net.Addr) (int, error) { if !pc.tgtHeader { return pc.PacketConn.WriteTo(b, addr) diff --git a/proxy/socks5/socks5.go b/proxy/socks5/socks5.go index 8a3ec9d..5354438 100644 --- a/proxy/socks5/socks5.go +++ b/proxy/socks5/socks5.go @@ -42,7 +42,7 @@ func init() { proxy.RegisterServer("socks5", NewSocks5Server) } -// NewSocks5 returns a Proxy that makes SOCKS v5 connections to the given address +// NewSocks5 returns a Proxy that makes SOCKS v5 connections to the given address. // with an optional username and password. (RFC 1928) func NewSocks5(s string, d proxy.Dialer, p proxy.Proxy) (*Socks5, error) { u, err := url.Parse(s) diff --git a/proxy/vmess/addr.go b/proxy/vmess/addr.go index dfc494d..4f6d5a0 100644 --- a/proxy/vmess/addr.go +++ b/proxy/vmess/addr.go @@ -5,7 +5,7 @@ import ( "strconv" ) -// Atyp is vmess addr type +// Atyp is vmess addr type. type Atyp byte // Atyp @@ -16,13 +16,13 @@ const ( AtypIP6 Atyp = 3 ) -// Addr is vmess addr +// Addr is vmess addr. type Addr []byte -// Port is vmess addr port +// Port is vmess addr port. type Port uint16 -// ParseAddr parses the address in string s +// ParseAddr parses the address in string s. func ParseAddr(s string) (Atyp, Addr, Port, error) { var atyp Atyp var addr Addr diff --git a/proxy/vmess/aead.go b/proxy/vmess/aead.go index b86b500..2309687 100644 --- a/proxy/vmess/aead.go +++ b/proxy/vmess/aead.go @@ -16,7 +16,7 @@ type aeadWriter struct { iv []byte } -// AEADWriter returns a aead writer +// AEADWriter returns a aead writer. func AEADWriter(w io.Writer, aead cipher.AEAD, iv []byte) io.Writer { return &aeadWriter{ Writer: w, @@ -79,7 +79,7 @@ type aeadReader struct { iv []byte } -// AEADReader returns a aead reader +// AEADReader returns a aead reader. func AEADReader(r io.Reader, aead cipher.AEAD, iv []byte) io.Reader { return &aeadReader{ Reader: r, diff --git a/proxy/vmess/chunk.go b/proxy/vmess/chunk.go index 04f62ff..828869b 100644 --- a/proxy/vmess/chunk.go +++ b/proxy/vmess/chunk.go @@ -16,7 +16,7 @@ type chunkedWriter struct { io.Writer } -// ChunkedWriter returns a chunked writer +// ChunkedWriter returns a chunked writer. func ChunkedWriter(w io.Writer) io.Writer { return &chunkedWriter{Writer: w} } @@ -52,7 +52,7 @@ type chunkedReader struct { left int } -// ChunkedReader returns a chunked reader +// ChunkedReader returns a chunked reader. func ChunkedReader(r io.Reader) io.Reader { return &chunkedReader{Reader: r} } diff --git a/proxy/vmess/client.go b/proxy/vmess/client.go index f391f94..370cde1 100644 --- a/proxy/vmess/client.go +++ b/proxy/vmess/client.go @@ -39,7 +39,7 @@ const ( CmdUDP byte = 2 ) -// Client is a vmess client +// Client is a vmess client. type Client struct { users []*User count int @@ -47,7 +47,7 @@ type Client struct { security byte } -// Conn is a connection to vmess server +// Conn is a connection to vmess server. type Conn struct { user *User opt byte @@ -142,7 +142,7 @@ func (c *Client) NewConn(rc net.Conn, target string) (*Conn, error) { return conn, nil } -// Auth send auth info: HMAC("md5", UUID, UTC) +// Auth send auth info: HMAC("md5", UUID, UTC). func (c *Conn) Auth() error { ts := pool.GetBuffer(8) defer pool.PutBuffer(ts) diff --git a/proxy/vmess/user.go b/proxy/vmess/user.go index 6a43da7..957355a 100644 --- a/proxy/vmess/user.go +++ b/proxy/vmess/user.go @@ -12,13 +12,13 @@ import ( "github.com/nadoo/glider/common/pool" ) -// User of vmess client +// User of vmess client. type User struct { UUID [16]byte CmdKey [16]byte } -// NewUser . +// NewUser returns a new user. func NewUser(uuid [16]byte) *User { u := &User{UUID: uuid} copy(u.CmdKey[:], GetKey(uuid)) @@ -38,7 +38,7 @@ func nextID(oldID [16]byte) (newID [16]byte) { } } -// GenAlterIDUsers generates users according to primary user's id and alterID +// GenAlterIDUsers generates users according to primary user's id and alterID. func (u *User) GenAlterIDUsers(alterID int) []*User { users := make([]*User, alterID) preID := u.UUID @@ -63,7 +63,7 @@ func StrToUUID(s string) (uuid [16]byte, err error) { return } -// GetKey returns the key of AES-128-CFB encrypter +// GetKey returns the key of AES-128-CFB encrypter. // Key:MD5(UUID + []byte('c48619fe-8f02-49e0-b9e9-edf763e17e21')) func GetKey(uuid [16]byte) []byte { md5hash := md5.New() @@ -72,7 +72,7 @@ func GetKey(uuid [16]byte) []byte { return md5hash.Sum(nil) } -// TimestampHash returns the iv of AES-128-CFB encrypter +// TimestampHash returns the iv of AES-128-CFB encrypter. // IV:MD5(X + X + X + X),X = []byte(timestamp.now) (8 bytes, Big Endian) func TimestampHash(t time.Time) []byte { ts := pool.GetBuffer(8) diff --git a/rule/config.go b/rule/config.go index 6170a03..895b41b 100644 --- a/rule/config.go +++ b/rule/config.go @@ -11,7 +11,7 @@ import ( "github.com/nadoo/glider/strategy" ) -// Config , every rule dialer points to a rule file +// Config of rule dialer. type Config struct { Name string @@ -26,7 +26,7 @@ type Config struct { CIDR []string } -// NewConfFromFile . +// NewConfFromFile returns a new config from file. func NewConfFromFile(ruleFile string) (*Config, error) { p := &Config{Name: ruleFile} @@ -58,7 +58,7 @@ func NewConfFromFile(ruleFile string) (*Config, error) { return p, err } -// ListDir returns file list named with suffix in dirPth +// ListDir returns file list named with suffix in dirPth. func ListDir(dirPth string, suffix string) (files []string, err error) { files = make([]string, 0, 10) dir, err := ioutil.ReadDir(dirPth) @@ -66,12 +66,12 @@ func ListDir(dirPth string, suffix string) (files []string, err error) { return nil, err } PthSep := string(os.PathSeparator) - suffix = strings.ToUpper(suffix) + suffix = strings.ToLower(suffix) for _, fi := range dir { if fi.IsDir() { continue } - if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) { + if strings.HasSuffix(strings.ToLower(fi.Name()), suffix) { files = append(files, dirPth+PthSep+fi.Name()) } } diff --git a/rule/rule.go b/rule/rule.go index dfe9eea..07b3cdc 100644 --- a/rule/rule.go +++ b/rule/rule.go @@ -10,7 +10,7 @@ import ( "github.com/nadoo/glider/strategy" ) -// Proxy struct +// Proxy struct. type Proxy struct { proxy *strategy.Proxy proxies []*strategy.Proxy @@ -90,13 +90,10 @@ func (p *Proxy) nextProxy(dstAddr string) *strategy.Proxy { } - domainParts := strings.Split(host, ".") - length := len(domainParts) - for i := length - 1; i >= 0; i-- { - domain := strings.Join(domainParts[i:length], ".") - - // find in domainMap - if proxy, ok := p.domainMap.Load(domain); ok { + host = strings.ToLower(host) + for i := len(host); i != -1; { + i = strings.LastIndexByte(host[:i], '.') + if proxy, ok := p.domainMap.Load(host[i+1:]); ok { return proxy.(*strategy.Proxy) } } @@ -117,15 +114,12 @@ func (p *Proxy) Record(dialer proxy.Dialer, success bool) { // AddDomainIP used to update ipMap rules according to domainMap rule. func (p *Proxy) AddDomainIP(domain, ip string) error { if ip != "" { - domainParts := strings.Split(domain, ".") - length := len(domainParts) - for i := length - 1; i >= 0; i-- { - pDomain := strings.ToLower(strings.Join(domainParts[i:length], ".")) - - // find in domainMap - if dialer, ok := p.domainMap.Load(pDomain); ok { + domain = strings.ToLower(domain) + for i := len(domain); i != -1; { + i = strings.LastIndexByte(domain[:i], '.') + if dialer, ok := p.domainMap.Load(domain[i+1:]); ok { p.ipMap.Store(ip, dialer) - log.F("[rule] add ip=%s, based on rule: domain=%s & domain/ip: %s/%s\n", ip, pDomain, domain, ip) + log.F("[rule] add ip=%s, based on rule: domain=%s & domain/ip: %s/%s\n", ip, domain[i+1:], domain, ip) } } }