Skip to content

Commit d1a7858

Browse files
committed
支持DST-MAC
1 parent fa91973 commit d1a7858

File tree

3 files changed

+39
-22
lines changed

3 files changed

+39
-22
lines changed

constant/rule.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ const (
99
GEOSITE
1010
GEOIP
1111
SrcGEOIP
12-
IPASN
1312
SrcMAC
13+
DstMAC
14+
IPASN
1415
SrcIPASN
1516
IPCIDR
1617
SrcIPCIDR
@@ -55,10 +56,12 @@ func (rt RuleType) String() string {
5556
return "GeoIP"
5657
case SrcGEOIP:
5758
return "SrcGeoIP"
58-
case IPASN:
59-
return "IPASN"
6059
case SrcMAC:
6160
return "SrcMAC"
61+
case DstMAC:
62+
return "DstMAC"
63+
case IPASN:
64+
return "IPASN"
6265
case SrcIPASN:
6366
return "SrcIPASN"
6467
case IPCIDR:

rules/common/mac.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,27 @@ var arpTable = make(map[string]string)
1919
const reloadInterval = 5 * time.Minute
2020

2121
var startOnce sync.Once
22+
2223
func init() {
2324
}
2425

25-
type SrcMAC struct {
26+
type MacAddr struct {
2627
*Base
27-
mac string
28-
adapter string
28+
mac string
29+
adapter string
30+
isSourceIP bool
2931
}
3032

31-
func (d *SrcMAC) RuleType() C.RuleType {
32-
return C.SrcMAC
33+
func (d *MacAddr) RuleType() C.RuleType {
34+
if d.isSourceIP {
35+
return C.SrcMAC
36+
} else {
37+
return C.DstMAC
38+
}
3339
}
3440

3541
func getLoadArpTableFunc() func() (string, error) {
36-
const ipv6Error = "can't load ipv6 arp table, SRC-MAC rule can't match src ipv6 address"
42+
const ipv6Error = "can't load ipv6 arp table, SRC-MAC/DST-MAC rule can't match src ipv6 address"
3743

3844
getIpv4Only := func() (string, error) {
3945
return cmd.ExecCmd("arp -a")
@@ -95,39 +101,45 @@ func getLoadArpTableFunc() func() (string, error) {
95101
}
96102
}
97103

98-
func (d *SrcMAC) Match(metadata *C.Metadata) (bool, string) {
104+
func (d *MacAddr) Match(metadata *C.Metadata) (bool, string) {
99105
table := getArpTable()
100-
srcIP := metadata.SrcIP.String()
101-
mac, exists := table[srcIP]
106+
var ip string
107+
if d.isSourceIP {
108+
ip = metadata.SrcIP.String()
109+
} else {
110+
ip = metadata.DstIP.String()
111+
}
112+
mac, exists := table[ip]
102113
if exists {
103114
if mac == d.mac {
104115
return true, d.adapter
105116
}
106117
} else {
107-
log.Warnln("can't find the IP address in arp table: %s", srcIP)
118+
log.Infoln("can't find the IP address in arp table: %s", ip)
108119
}
109120
return false, d.adapter
110121
}
111122

112-
func (d *SrcMAC) Adapter() string {
123+
func (d *MacAddr) Adapter() string {
113124
return d.adapter
114125
}
115126

116-
func (d *SrcMAC) Payload() string {
127+
func (d *MacAddr) Payload() string {
117128
return d.mac
118129
}
119130

120131
var macRegex = regexp.MustCompile(`^([0-9a-f]{2}:){5}[0-9a-f]{2}$`)
121132

122-
func NewMAC(mac string, adapter string) (*SrcMAC, error) {
133+
func NewMAC(mac string, adapter string, isSrc bool) (*MacAddr, error) {
123134
macAddr := strings.ReplaceAll(strings.ToLower(mac), "-", ":")
124135
if !macRegex.MatchString(macAddr) {
125136
return nil, errors.New("mac address format error: " + mac)
126137
}
127-
return &SrcMAC{
128-
Base: &Base{},
129-
mac: macAddr,
130-
adapter: adapter,
138+
return &MacAddr{
139+
Base: &Base{},
140+
mac: macAddr,
141+
adapter: adapter,
142+
isSourceIP: isSrc,
131143
}, nil
132144
}
133145

rules/parser.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ func ParseRule(tp, payload, target string, params []string, subRules map[string]
2626
parsed, parseErr = RC.NewGEOIP(payload, target, false, noResolve)
2727
case "SRC-GEOIP":
2828
parsed, parseErr = RC.NewGEOIP(payload, target, true, true)
29+
case "SRC-MAC":
30+
parsed, parseErr = RC.NewMAC(payload, target, true)
31+
case "DST-MAC":
32+
parsed, parseErr = RC.NewMAC(payload, target, false)
2933
case "IP-ASN":
3034
noResolve := RC.HasNoResolve(params)
3135
parsed, parseErr = RC.NewIPASN(payload, target, false, noResolve)
32-
case "SRC-MAC":
33-
parsed, parseErr = RC.NewMAC(payload, target)
3436
case "SRC-IP-ASN":
3537
parsed, parseErr = RC.NewIPASN(payload, target, true, true)
3638
case "IP-CIDR", "IP-CIDR6":

0 commit comments

Comments
 (0)