Feature: process condition for rules

This commit is contained in:
yaling888
2022-02-23 14:01:53 +08:00
parent d876d6e74c
commit 2f234cf6bc
6 changed files with 55 additions and 12 deletions

View File

@ -3,6 +3,7 @@ package rules
import (
"errors"
"net"
"strings"
C "github.com/Dreamacro/clash/constant"
)
@ -24,9 +25,9 @@ func HasNoResolve(params []string) bool {
func findNetwork(params []string) C.NetWork {
for _, p := range params {
if p == "tcp" {
if strings.EqualFold(p, "tcp") {
return C.TCP
} else if p == "udp" {
} else if strings.EqualFold(p, "udp") {
return C.UDP
}
}
@ -51,3 +52,17 @@ func findSourceIPs(params []string) []*net.IPNet {
}
return nil
}
func findProcessName(params []string) []string {
var processNames []string
for _, p := range params {
if strings.HasPrefix(p, "P:") {
processNames = append(processNames, strings.TrimPrefix(p, "P:"))
}
}
if len(processNames) > 0 {
return processNames
}
return nil
}

View File

@ -24,9 +24,14 @@ func (g *GEOIP) Match(metadata *C.Metadata) bool {
return false
}
if strings.EqualFold(g.country, "LAN") || C.TunBroadcastAddr.Equal(ip) {
return ip.IsPrivate()
if strings.EqualFold(g.country, "LAN") {
return ip.IsPrivate() ||
ip.IsUnspecified() ||
ip.IsLoopback() ||
ip.IsMulticast() ||
C.TunBroadcastAddr.Equal(ip)
}
record, _ := mmdb.Instance().Country(ip)
return strings.EqualFold(record.Country.IsoCode, g.country)
}

View File

@ -13,8 +13,9 @@ func ParseRule(tp, payload, target string, params []string) (C.Rule, error) {
)
ruleExtra := &C.RuleExtra{
Network: findNetwork(params),
SourceIPs: findSourceIPs(params),
Network: findNetwork(params),
SourceIPs: findSourceIPs(params),
ProcessNames: findProcessName(params),
}
switch tp {