Don't track intercepted packets (#3448)

This commit is contained in:
Viktor Liu 2025-03-07 13:56:16 +01:00 committed by GitHub
parent 54be772ffd
commit 8b07f21c28
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -542,14 +542,12 @@ func (m *Manager) processOutgoingHooks(packetData []byte, size int) bool {
return false return false
} }
// Track all protocols if stateful mode is enabled if d.decoded[1] == layers.LayerTypeUDP && m.udpHooksDrop(uint16(d.udp.DstPort), dstIP, packetData) {
if m.stateful { return true
m.trackOutbound(d, srcIP, dstIP, size)
} }
// Process UDP hooks even if stateful mode is disabled if m.stateful {
if d.decoded[1] == layers.LayerTypeUDP { m.trackOutbound(d, srcIP, dstIP, size)
return m.checkUDPHooks(d, dstIP, packetData)
} }
return false return false
@ -619,19 +617,38 @@ func (m *Manager) trackInbound(d *decoder, srcIP, dstIP netip.Addr, size int) {
} }
} }
func (m *Manager) checkUDPHooks(d *decoder, dstIP netip.Addr, packetData []byte) bool { // udpHooksDrop checks if any UDP hooks should drop the packet
func (m *Manager) udpHooksDrop(dport uint16, dstIP netip.Addr, packetData []byte) bool {
m.mutex.RLock() m.mutex.RLock()
defer m.mutex.RUnlock() defer m.mutex.RUnlock()
for _, ipKey := range []netip.Addr{dstIP, netip.IPv4Unspecified(), netip.IPv6Unspecified()} { // Check specific destination IP first
if rules, exists := m.outgoingRules[ipKey]; exists { if rules, exists := m.outgoingRules[dstIP]; exists {
for _, rule := range rules { for _, rule := range rules {
if rule.udpHook != nil && portsMatch(rule.dPort, uint16(d.udp.DstPort)) { if rule.udpHook != nil && portsMatch(rule.dPort, dport) {
return rule.udpHook(packetData) return rule.udpHook(packetData)
}
} }
} }
} }
// Check IPv4 unspecified address
if rules, exists := m.outgoingRules[netip.IPv4Unspecified()]; exists {
for _, rule := range rules {
if rule.udpHook != nil && portsMatch(rule.dPort, dport) {
return rule.udpHook(packetData)
}
}
}
// Check IPv6 unspecified address
if rules, exists := m.outgoingRules[netip.IPv6Unspecified()]; exists {
for _, rule := range rules {
if rule.udpHook != nil && portsMatch(rule.dPort, dport) {
return rule.udpHook(packetData)
}
}
}
return false return false
} }