mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-11-16 03:32:33 +08:00
fix: geoip wrong matching logic in fallback-filter
https://github.com/MetaCubeX/mihomo/issues/1478
This commit is contained in:
parent
4fecf68b8b
commit
a96f72ade4
|
@ -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()
|
||||
|
|
|
@ -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() ||
|
||||
|
|
Loading…
Reference in New Issue
Block a user