mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-06-24 23:29:55 +00:00
44d8a14629
Some checks are pending
Build / build (map[goamd64:v1 goarch:amd64 goos:darwin output:amd64-compatible]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:freebsd output:amd64-compatible]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:linux goversion:1.20 output:amd64-compatible-go120 test:test]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:linux output:amd64-compatible test:test]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:windows goversion:1.20 output:amd64-compatible-go120]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:windows output:amd64-compatible]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:darwin goversion:1.20 output:amd64-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:darwin output:amd64]) (push) Waiting to run
Build / build (map[abi:1 goarch:loong64 goos:linux output:loong64-abi1]) (push) Waiting to run
Build / build (map[abi:2 goarch:loong64 goos:linux output:loong64-abi2]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:darwin goversion:1.20 output:amd64-compatible-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:freebsd output:amd64]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:linux goversion:1.20 output:amd64-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:linux output:amd64]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:windows goversion:1.20 output:amd64-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:windows output:amd64]) (push) Waiting to run
Build / build (map[goarch:386 goos:android ndk:i686-linux-android34 output:386]) (push) Waiting to run
Build / build (map[goarch:386 goos:freebsd output:386]) (push) Waiting to run
Build / build (map[goarch:386 goos:linux goversion:1.20 output:386-go120]) (push) Waiting to run
Build / build (map[goarch:386 goos:linux output:386]) (push) Waiting to run
Build / build (map[goarch:386 goos:windows goversion:1.20 output:386-go120]) (push) Waiting to run
Build / build (map[goarch:386 goos:windows output:386]) (push) Waiting to run
Build / build (map[goarch:amd64 goos:android ndk:x86_64-linux-android34 output:amd64]) (push) Waiting to run
Build / build (map[goarch:arm goarm:7 goos:linux output:armv7]) (push) Waiting to run
Build / build (map[goarch:arm goarm:7 goos:windows output:armv7]) (push) Waiting to run
Build / build (map[goarch:arm goos:android ndk:armv7a-linux-androideabi34 output:armv7]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:android ndk:aarch64-linux-android34 output:arm64-v8]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:darwin goversion:1.20 output:arm64-go120]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:darwin output:arm64]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:freebsd output:arm64]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:linux output:arm64]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:windows output:arm64]) (push) Waiting to run
Build / build (map[goarch:mips goos:linux mips:hardfloat output:mips-hardfloat]) (push) Waiting to run
Build / build (map[goarch:mips goos:linux mips:softfloat output:mips-softfloat]) (push) Waiting to run
Build / build (map[goarch:mips64 goos:linux output:mips64]) (push) Waiting to run
Build / build (map[goarch:mips64le goos:linux output:mips64le]) (push) Waiting to run
Build / build (map[goarch:mipsle goos:linux mips:hardfloat output:mipsle-hardfloat]) (push) Waiting to run
Build / build (map[goarch:mipsle goos:linux mips:softfloat output:mipsle-softfloat]) (push) Waiting to run
Build / build (map[goarch:riscv64 goos:linux output:riscv64]) (push) Waiting to run
Build / build (map[goarch:s390x goos:linux output:s390x]) (push) Waiting to run
Build / Upload-Prerelease (push) Blocked by required conditions
Build / Upload-Release (push) Blocked by required conditions
Build / Docker (push) Blocked by required conditions
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
103 lines
2.1 KiB
Go
103 lines
2.1 KiB
Go
package dns
|
|
|
|
import (
|
|
"net/netip"
|
|
"strings"
|
|
|
|
"github.com/metacubex/mihomo/component/geodata"
|
|
"github.com/metacubex/mihomo/component/geodata/router"
|
|
"github.com/metacubex/mihomo/component/mmdb"
|
|
"github.com/metacubex/mihomo/component/trie"
|
|
C "github.com/metacubex/mihomo/constant"
|
|
"github.com/metacubex/mihomo/log"
|
|
)
|
|
|
|
type fallbackIPFilter interface {
|
|
Match(netip.Addr) bool
|
|
}
|
|
|
|
type geoipFilter struct {
|
|
code string
|
|
}
|
|
|
|
var geoIPMatcher *router.GeoIPMatcher
|
|
|
|
func (gf *geoipFilter) Match(ip netip.Addr) bool {
|
|
if !C.GeodataMode {
|
|
codes := mmdb.IPInstance().LookupCode(ip.AsSlice())
|
|
for _, code := range codes {
|
|
if !strings.EqualFold(code, gf.code) && !ip.IsPrivate() {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
if geoIPMatcher == nil {
|
|
var err error
|
|
geoIPMatcher, _, err = geodata.LoadGeoIPMatcher("CN")
|
|
if err != nil {
|
|
log.Errorln("[GeoIPFilter] LoadGeoIPMatcher error: %s", err.Error())
|
|
return false
|
|
}
|
|
}
|
|
return !geoIPMatcher.Match(ip)
|
|
}
|
|
|
|
type ipnetFilter struct {
|
|
ipnet netip.Prefix
|
|
}
|
|
|
|
func (inf *ipnetFilter) Match(ip netip.Addr) bool {
|
|
return inf.ipnet.Contains(ip)
|
|
}
|
|
|
|
type fallbackDomainFilter interface {
|
|
Match(domain string) bool
|
|
}
|
|
|
|
type domainFilter struct {
|
|
tree *trie.DomainTrie[struct{}]
|
|
}
|
|
|
|
func NewDomainFilter(domains []string) *domainFilter {
|
|
df := domainFilter{tree: trie.New[struct{}]()}
|
|
for _, domain := range domains {
|
|
_ = df.tree.Insert(domain, struct{}{})
|
|
}
|
|
df.tree.Optimize()
|
|
return &df
|
|
}
|
|
|
|
func (df *domainFilter) Match(domain string) bool {
|
|
return df.tree.Search(domain) != nil
|
|
}
|
|
|
|
type geoSiteFilter struct {
|
|
matchers []router.DomainMatcher
|
|
}
|
|
|
|
func NewGeoSite(group string) (fallbackDomainFilter, error) {
|
|
if err := geodata.InitGeoSite(); err != nil {
|
|
log.Errorln("can't initial GeoSite: %s", err)
|
|
return nil, err
|
|
}
|
|
matcher, _, err := geodata.LoadGeoSiteMatcher(group)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
filter := &geoSiteFilter{
|
|
matchers: []router.DomainMatcher{matcher},
|
|
}
|
|
return filter, nil
|
|
}
|
|
|
|
func (gsf *geoSiteFilter) Match(domain string) bool {
|
|
for _, matcher := range gsf.matchers {
|
|
if matcher.ApplyDomain(domain) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|