fix: geoip wrong matching logic in fallback-filter

https://github.com/MetaCubeX/mihomo/issues/1478
This commit is contained in:
wwqgtxx 2024-08-29 22:00:55 +08:00
parent 4fecf68b8b
commit a96f72ade4
2 changed files with 31 additions and 2 deletions

View File

@ -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()

View File

@ -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() ||