From a96f72ade4d395e96e94d24d9b2b6261e21e6f98 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Thu, 29 Aug 2024 22:00:55 +0800 Subject: [PATCH] fix: geoip wrong matching logic in fallback-filter https://github.com/MetaCubeX/mihomo/issues/1478 --- config/config.go | 2 +- rules/common/geoip.go | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index cd8eb469b..370506d4c 100644 --- a/config/config.go +++ b/config/config.go @@ -1473,7 +1473,7 @@ func parseDNS(rawCfg *RawConfig, hosts *trie.DomainTrie[resolver.HostValue], rul if err != nil { return nil, fmt.Errorf("load GeoIP dns fallback filter error, %w", err) } - dnsCfg.FallbackIPFilter = append(dnsCfg.FallbackIPFilter, matcher) + dnsCfg.FallbackIPFilter = append(dnsCfg.FallbackIPFilter, matcher.DnsFallbackFilter()) } if len(cfg.FallbackFilter.IPCIDR) > 0 { cidrSet := cidr.NewIpCidrSet() diff --git a/rules/common/geoip.go b/rules/common/geoip.go index c4f7ecf32..7d6871c7e 100644 --- a/rules/common/geoip.go +++ b/rules/common/geoip.go @@ -22,7 +22,6 @@ type GEOIP struct { adapter string noResolveIP bool isSourceIP bool - geodata bool } var _ C.Rule = (*GEOIP)(nil) @@ -115,6 +114,36 @@ func (g *GEOIP) MatchIp(ip netip.Addr) bool { return slices.Contains(codes, g.country) } +// MatchIp implements C.IpMatcher +func (g dnsFallbackFilter) MatchIp(ip netip.Addr) bool { + if !ip.IsValid() { + return false + } + + if g.isLan(ip) { // compatible with original behavior + return false + } + + if C.GeodataMode { + matcher, err := g.getIPMatcher() + if err != nil { + return false + } + return !matcher.Match(ip) + } + + codes := mmdb.IPInstance().LookupCode(ip.AsSlice()) + return !slices.Contains(codes, g.country) +} + +type dnsFallbackFilter struct { + *GEOIP +} + +func (g *GEOIP) DnsFallbackFilter() C.IpMatcher { // for dns.fallback-filter.geoip + return dnsFallbackFilter{GEOIP: g} +} + func (g *GEOIP) isLan(ip netip.Addr) bool { return ip.IsPrivate() || ip.IsUnspecified() ||