mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-11-16 11:42:43 +08:00
Compare commits
5 Commits
0402a8c334
...
03645f842e
Author | SHA1 | Date | |
---|---|---|---|
|
03645f842e | ||
|
c9e273e856 | ||
|
9b4857649d | ||
|
c49cede02b | ||
|
088fdb2ddd |
|
@ -6,6 +6,28 @@ import (
|
||||||
"net/netip"
|
"net/netip"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Private IP CIDRs
|
||||||
|
var privateIPCIDRs = []string{
|
||||||
|
"0.0.0.0/8",
|
||||||
|
"10.0.0.0/8",
|
||||||
|
"100.64.0.0/10",
|
||||||
|
"127.0.0.0/8",
|
||||||
|
"169.254.0.0/16",
|
||||||
|
"172.16.0.0/12",
|
||||||
|
"192.0.0.0/24",
|
||||||
|
"192.0.2.0/24",
|
||||||
|
"192.88.99.0/24",
|
||||||
|
"192.168.0.0/16",
|
||||||
|
"198.18.0.0/15",
|
||||||
|
"198.51.100.0/24",
|
||||||
|
"203.0.113.0/24",
|
||||||
|
"224.0.0.0/3",
|
||||||
|
"::/127",
|
||||||
|
"fc00::/7",
|
||||||
|
"fe80::/10",
|
||||||
|
"ff00::/8",
|
||||||
|
}
|
||||||
|
|
||||||
// IpToAddr converts the net.IP to netip.Addr.
|
// IpToAddr converts the net.IP to netip.Addr.
|
||||||
// If slice's length is not 4 or 16, IpToAddr returns netip.Addr{}
|
// If slice's length is not 4 or 16, IpToAddr returns netip.Addr{}
|
||||||
func IpToAddr(slice net.IP) netip.Addr {
|
func IpToAddr(slice net.IP) netip.Addr {
|
||||||
|
@ -51,3 +73,18 @@ func UnMasked(p netip.Prefix) netip.Addr {
|
||||||
}
|
}
|
||||||
return addr
|
return addr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsPrivateIP returns whether IP is private
|
||||||
|
// If IP is private, return true, else return false
|
||||||
|
func IsPrivateIP(ip netip.Addr) bool {
|
||||||
|
for _, network := range privateIPCIDRs {
|
||||||
|
_, subnet, err := net.ParseCIDR(network)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if subnet.Contains(ip.AsSlice()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/metacubex/mihomo/common/nnip"
|
||||||
"github.com/metacubex/mihomo/component/geodata"
|
"github.com/metacubex/mihomo/component/geodata"
|
||||||
"github.com/metacubex/mihomo/component/geodata/router"
|
"github.com/metacubex/mihomo/component/geodata/router"
|
||||||
"github.com/metacubex/mihomo/component/mmdb"
|
"github.com/metacubex/mihomo/component/mmdb"
|
||||||
|
@ -26,7 +27,7 @@ func (gf *geoipFilter) Match(ip netip.Addr) bool {
|
||||||
if !C.GeodataMode {
|
if !C.GeodataMode {
|
||||||
codes := mmdb.IPInstance().LookupCode(ip.AsSlice())
|
codes := mmdb.IPInstance().LookupCode(ip.AsSlice())
|
||||||
for _, code := range codes {
|
for _, code := range codes {
|
||||||
if !strings.EqualFold(code, gf.code) && !ip.IsPrivate() {
|
if !strings.EqualFold(code, gf.code) && !nnip.IsPrivateIP(ip) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,13 +36,13 @@ func (gf *geoipFilter) Match(ip netip.Addr) bool {
|
||||||
|
|
||||||
if geoIPMatcher == nil {
|
if geoIPMatcher == nil {
|
||||||
var err error
|
var err error
|
||||||
geoIPMatcher, _, err = geodata.LoadGeoIPMatcher("CN")
|
geoIPMatcher, _, err = geodata.LoadGeoIPMatcher(gf.code)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorln("[GeoIPFilter] LoadGeoIPMatcher error: %s", err.Error())
|
log.Errorln("[GeoIPFilter] LoadGeoIPMatcher error: %s", err.Error())
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return !geoIPMatcher.Match(ip)
|
return !geoIPMatcher.Match(ip) && !nnip.IsPrivateIP(ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ipnetFilter struct {
|
type ipnetFilter struct {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user