From dd56b2584b8f91d8daa8d529b5fbaa7c3d4f7edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sun, 3 Jul 2022 15:57:09 +0800 Subject: [PATCH] Add internal private geoip rule --- adapter/route/router.go | 6 +++++- adapter/route/rule_geoip.go | 29 +++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/adapter/route/router.go b/adapter/route/router.go index 6992abd6..9d700f6e 100644 --- a/adapter/route/router.go +++ b/adapter/route/router.go @@ -71,7 +71,11 @@ func hasGeoRule(rules []option.Rule) bool { } func isGeoRule(rule option.DefaultRule) bool { - return len(rule.SourceGeoIP) > 0 || len(rule.GeoIP) > 0 + return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode) +} + +func notPrivateNode(code string) bool { + return code == "private" } func (r *Router) UpdateOutbounds(outbounds []adapter.Outbound) { diff --git a/adapter/route/rule_geoip.go b/adapter/route/rule_geoip.go index fce1c54e..283288be 100644 --- a/adapter/route/rule_geoip.go +++ b/adapter/route/rule_geoip.go @@ -5,6 +5,7 @@ import ( "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/log" + N "github.com/sagernet/sing/common/network" ) var _ RuleItem = (*GeoIPItem)(nil) @@ -34,7 +35,7 @@ func NewGeoIPItem(router adapter.Router, logger log.Logger, isSource bool, codes func (r *GeoIPItem) Match(metadata *adapter.InboundContext) bool { geoReader := r.router.GeoIPReader() if geoReader == nil { - return false + return r.match(metadata) } if r.isSource { if metadata.SourceGeoIPCode == "" { @@ -43,9 +44,8 @@ func (r *GeoIPItem) Match(metadata *adapter.InboundContext) bool { r.logger.Error("query geoip for ", metadata.Source.Addr, ": ", err) return false } - metadata.SourceGeoIPCode = country.Country.IsoCode + metadata.SourceGeoIPCode = strings.ToLower(country.Country.IsoCode) } - return r.codeMap[metadata.SourceGeoIPCode] } else { if metadata.Destination.IsFqdn() { return false @@ -56,7 +56,28 @@ func (r *GeoIPItem) Match(metadata *adapter.InboundContext) bool { r.logger.Error("query geoip for ", metadata.Destination.Addr, ": ", err) return false } - metadata.GeoIPCode = country.Country.IsoCode + metadata.GeoIPCode = strings.ToLower(country.Country.IsoCode) + } + } + return r.match(metadata) +} + +func (r *GeoIPItem) match(metadata *adapter.InboundContext) bool { + if r.isSource { + if metadata.SourceGeoIPCode == "" { + if !N.IsPublicAddr(metadata.Source.Addr) { + metadata.SourceGeoIPCode = "private" + } + } + return r.codeMap[metadata.SourceGeoIPCode] + } else { + if metadata.Destination.IsFqdn() { + return false + } + if metadata.GeoIPCode == "" { + if !N.IsPublicAddr(metadata.Destination.Addr) { + metadata.GeoIPCode = "private" + } } return r.codeMap[metadata.GeoIPCode] }