mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 01:15:41 +08:00
general: optimize domain parts operations
This commit is contained in:
parent
3a6fd63bc0
commit
a118ec5837
@ -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
|
||||
}
|
||||
|
||||
|
4
go.mod
4
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
|
||||
)
|
||||
|
||||
|
8
go.sum
8
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=
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
2
main.go
2
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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
26
rule/rule.go
26
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user