From 2c24f6606055739a2b200599f9a8d867f1305acd Mon Sep 17 00:00:00 2001 From: zema1 Date: Tue, 27 Aug 2024 23:37:32 +0800 Subject: [PATCH] feat: support glob in exclude domain related to: https://github.com/zema1/suo5/pull/62 --- ctrl/config.go | 18 +++++++++++++----- ctrl/ctrl.go | 5 ++--- ctrl/handler.go | 10 +++++++--- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/ctrl/config.go b/ctrl/config.go index 1a52d2a..3f7c2bd 100644 --- a/ctrl/config.go +++ b/ctrl/config.go @@ -2,6 +2,7 @@ package ctrl import ( "fmt" + "github.com/gobwas/glob" "io" "net/http" "strings" @@ -27,7 +28,7 @@ type Suo5Config struct { ExcludeDomain []string `json:"exclude_domain"` TestExit string `json:"-"` - ExcludeDomainMap map[string]bool `json:"-"` + ExcludeGlobs []glob.Glob `json:"-"` Offset int `json:"-"` Header http.Header `json:"-"` OnRemoteConnected func(e *ConnectedEvent) `json:"-"` @@ -37,15 +38,22 @@ type Suo5Config struct { } func (s *Suo5Config) Parse() error { - s.parseExcludeDomain() + if err := s.parseExcludeDomain(); err != nil { + return err + } return s.parseHeader() } -func (s *Suo5Config) parseExcludeDomain() { - s.ExcludeDomainMap = make(map[string]bool) +func (s *Suo5Config) parseExcludeDomain() error { + s.ExcludeGlobs = make([]glob.Glob, 0) for _, domain := range s.ExcludeDomain { - s.ExcludeDomainMap[strings.ToLower(strings.TrimSpace(domain))] = true + g, err := glob.Compile(domain) + if err != nil { + return err + } + s.ExcludeGlobs = append(s.ExcludeGlobs, g) } + return nil } func (s *Suo5Config) parseHeader() error { diff --git a/ctrl/ctrl.go b/ctrl/ctrl.go index 356f2a3..0b8193f 100644 --- a/ctrl/ctrl.go +++ b/ctrl/ctrl.go @@ -25,7 +25,6 @@ import ( utls "github.com/refraction-networking/utls" "github.com/zema1/rawhttp" "github.com/zema1/suo5/netrans" - "golang.org/x/exp/maps" ) var rander = rand.New(rand.NewSource(time.Now().UnixNano())) @@ -49,8 +48,8 @@ func Run(ctx context.Context, config *Suo5Config) error { config.Header.Set("Accept-Encoding", "identity") } - if len(config.ExcludeDomainMap) != 0 { - log.Infof("exclude domains: %v", maps.Keys(config.ExcludeDomainMap)) + if len(config.ExcludeDomain) != 0 { + log.Infof("exclude domains: %v", config.ExcludeDomain) } tr := &http.Transport{ diff --git a/ctrl/handler.go b/ctrl/handler.go index 09b3947..b31d39f 100644 --- a/ctrl/handler.go +++ b/ctrl/handler.go @@ -54,9 +54,13 @@ func (m *socks5Handler) Handle(conn net.Conn) error { return err } - if m.config.ExcludeDomainMap[req.Addr.Host] { - log.Infof("drop connection to %s", req.Addr.Host) - return nil + if len(m.config.ExcludeGlobs) != 0 { + for _, g := range m.config.ExcludeGlobs { + if g.Match(req.Addr.Host) { + log.Debugf("drop connection to %s", req.Addr.Host) + return nil + } + } } log.Infof("start connection to %s", req.Addr.String()) diff --git a/go.mod b/go.mod index 655912d..f07a078 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( github.com/go-gost/gosocks5 v0.3.0 + github.com/gobwas/glob v0.2.3 github.com/kataras/golog v0.1.8 github.com/kataras/pio v0.0.11 github.com/pkg/errors v0.9.1 @@ -11,7 +12,6 @@ require ( github.com/stretchr/testify v1.8.4 github.com/urfave/cli/v2 v2.27.4 github.com/zema1/rawhttp v0.1.1 - golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 ) require ( diff --git a/go.sum b/go.sum index 5398882..3cf6d6a 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-gost/gosocks5 v0.3.0 h1:Hkmp9YDRBSCJd7xywW6dBPT6B9aQTkuWd+3WCheJiJA= github.com/go-gost/gosocks5 v0.3.0/go.mod h1:1G6I7HP7VFVxveGkoK8mnprnJqSqJjdcASKsdUn4Pp4= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= @@ -44,8 +46,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=