Skip to content

Commit

Permalink
fix: geoip wrong matching logic in fallback-filter
Browse files Browse the repository at this point in the history
  • Loading branch information
wwqgtxx committed Aug 29, 2024
1 parent 4fecf68 commit a96f72a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
2 changes: 1 addition & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
31 changes: 30 additions & 1 deletion rules/common/geoip.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ type GEOIP struct {
adapter string
noResolveIP bool
isSourceIP bool
geodata bool
}

var _ C.Rule = (*GEOIP)(nil)
Expand Down Expand Up @@ -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() ||
Expand Down

0 comments on commit a96f72a

Please sign in to comment.