add ip range matcher for bypass

This commit is contained in:
ginuerzh
2024-12-23 21:06:55 +08:00
parent be8e0555e5
commit a5d4774682
3 changed files with 92 additions and 1 deletions
+35
View File
@@ -2,6 +2,7 @@ package matcher
import (
"net"
"net/netip"
"strconv"
"strings"
@@ -177,6 +178,7 @@ type wildcardMatcherPattern struct {
glob glob.Glob
pr *xnet.PortRange
}
type wildcardMatcher struct {
patterns []wildcardMatcherPattern
}
@@ -224,3 +226,36 @@ func (m *wildcardMatcher) Match(addr string) bool {
return false
}
type ipRangeMatcher struct {
ranges []xnet.IPRange
}
func IPRangeMatcher(ranges []xnet.IPRange) Matcher {
matcher := &ipRangeMatcher{
ranges: ranges,
}
return matcher
}
func (m *ipRangeMatcher) Match(addr string) bool {
if m == nil || len(m.ranges) == 0 {
return false
}
host, _, _ := net.SplitHostPort(addr)
if host == "" {
host = addr
}
adr, err := netip.ParseAddr(host)
if err != nil {
return false
}
for _, ra := range m.ranges {
if ra.Contains(adr) {
return true
}
}
return false
}
+41 -1
View File
@@ -3,6 +3,7 @@ package net
import (
"fmt"
"net"
"net/netip"
"strconv"
"strings"
)
@@ -146,7 +147,7 @@ func (pr *PortRange) Parse(s string) error {
return nil
default:
return fmt.Errorf("invalid range: %s", s)
return fmt.Errorf("invalid port range: %s", s)
}
}
@@ -154,6 +155,45 @@ func (pr *PortRange) Contains(port int) bool {
return port >= pr.Min && port <= pr.Max
}
type IPRange struct {
Min netip.Addr
Max netip.Addr
}
func (r *IPRange) Parse(s string) error {
minmax := strings.Split(s, "-")
switch len(minmax) {
case 1:
addr, err := netip.ParseAddr(strings.TrimSpace(s))
if err != nil {
return err
}
r.Min, r.Max = addr, addr
return nil
case 2:
min, err := netip.ParseAddr(strings.TrimSpace(minmax[0]))
if err != nil {
return err
}
max, err := netip.ParseAddr(strings.TrimSpace(minmax[1]))
if err != nil {
return err
}
r.Min, r.Max = min, max
return nil
default:
return fmt.Errorf("invalid ip range: %s", s)
}
}
func (r *IPRange) Contains(addr netip.Addr) bool {
return !(addr.Less(r.Min) || r.Max.Less(addr))
}
type ClientAddr interface {
ClientAddr() net.Addr
}