Feature: support IPSET rule (#2693)
This commit is contained in:
54
rule/ipset.go
Normal file
54
rule/ipset.go
Normal file
@ -0,0 +1,54 @@
|
||||
package rules
|
||||
|
||||
import (
|
||||
"github.com/Dreamacro/clash/component/ipset"
|
||||
C "github.com/Dreamacro/clash/constant"
|
||||
"github.com/Dreamacro/clash/log"
|
||||
)
|
||||
|
||||
type IPSet struct {
|
||||
name string
|
||||
adapter string
|
||||
noResolveIP bool
|
||||
}
|
||||
|
||||
func (f *IPSet) RuleType() C.RuleType {
|
||||
return C.IPSet
|
||||
}
|
||||
|
||||
func (f *IPSet) Match(metadata *C.Metadata) bool {
|
||||
exist, err := ipset.Test(f.name, metadata.DstIP)
|
||||
if err != nil {
|
||||
log.Warnln("check ipset '%s' failed: %s", f.name, err.Error())
|
||||
return false
|
||||
}
|
||||
return exist
|
||||
}
|
||||
|
||||
func (f *IPSet) Adapter() string {
|
||||
return f.adapter
|
||||
}
|
||||
|
||||
func (f *IPSet) Payload() string {
|
||||
return f.name
|
||||
}
|
||||
|
||||
func (f *IPSet) ShouldResolveIP() bool {
|
||||
return !f.noResolveIP
|
||||
}
|
||||
|
||||
func (f *IPSet) ShouldFindProcess() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func NewIPSet(name string, adapter string, noResolveIP bool) (*IPSet, error) {
|
||||
if err := ipset.Verify(name); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &IPSet{
|
||||
name: name,
|
||||
adapter: adapter,
|
||||
noResolveIP: noResolveIP,
|
||||
}, nil
|
||||
}
|
@ -35,6 +35,9 @@ func ParseRule(tp, payload, target string, params []string) (C.Rule, error) {
|
||||
parsed, parseErr = NewProcess(payload, target, true)
|
||||
case "PROCESS-PATH":
|
||||
parsed, parseErr = NewProcess(payload, target, false)
|
||||
case "IPSET":
|
||||
noResolve := HasNoResolve(params)
|
||||
parsed, parseErr = NewIPSet(payload, target, noResolve)
|
||||
case "MATCH":
|
||||
parsed = NewMatch(target)
|
||||
default:
|
||||
|
Reference in New Issue
Block a user