diff --git a/bypass.go b/bypass.go index 0c8fa42..6608fb5 100644 --- a/bypass.go +++ b/bypass.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "net" + "strings" glob "github.com/gobwas/glob" ) @@ -83,11 +84,16 @@ type domainMatcher struct { } // DomainMatcher creates a Matcher for a specific domain pattern, -// the pattern can be a plain domain such as 'example.com' -// or a wildcard such as '*.exmaple.com'. +// the pattern can be a plain domain such as 'example.com', +// a wildcard such as '*.exmaple.com' or a special wildcard '.example.com'. func DomainMatcher(pattern string) Matcher { + p := pattern + if strings.HasPrefix(pattern, ".") { + p = pattern[1:] // trim the prefix '.' + pattern = "*" + pattern + } return &domainMatcher{ - pattern: pattern, + pattern: p, glob: glob.MustCompile(pattern), } } @@ -96,6 +102,10 @@ func (m *domainMatcher) Match(domain string) bool { if m == nil || m.glob == nil { return false } + + if domain == m.pattern { + return true + } return m.glob.Match(domain) } diff --git a/cmd/gost/main.go b/cmd/gost/main.go index 46eb902..df91498 100644 --- a/cmd/gost/main.go +++ b/cmd/gost/main.go @@ -317,6 +317,7 @@ func parseChainNode(ns string) (nodes []gost.Node, err error) { node.Addr = ip // override the default node address node.HandshakeOptions = append(handshakeOptions, gost.AddrHandshakeOption(ip)) + // One node per IP nodes = append(nodes, node) } if len(ips) == 0 {