detect: add flow drop by firewall as drop reason

To track flow drops triggered by the firewall.
Add flow drop by firewall as drop reason.

As part of
Ticket #7699

(cherry picked from commit 312967f291)
pull/15572/head
Juliana Fajardini 2 months ago committed by Victor Julien
parent 680b54fa6f
commit a261229aaf

@ -7382,24 +7382,28 @@
"default_app_policy": { "default_app_policy": {
"type": "integer", "type": "integer",
"description": "description":
"Number of packets dropped due to firewall's mode default app policy" "Count of packets dropped due to firewall's mode default app policy"
}, },
"default_packet_policy": { "default_packet_policy": {
"type": "integer", "type": "integer",
"description": "description":
"Number of packets dropped due to firewall's mode default packet policy" "Count of packets dropped due to firewall's mode default packet policy"
},
"flow_drop": {
"type": "integer",
"description": "Count of packets dropped due to a firewall policy that led to flow drop"
}, },
"pre_flow_hook": { "pre_flow_hook": {
"type": "integer", "type": "integer",
"description": "Number of packets dropped due to pre-flow hook" "description": "Count of packets dropped due to pre-flow hook"
}, },
"pre_stream_hook": { "pre_stream_hook": {
"type": "integer", "type": "integer",
"description": "Number of packets dropped due to pre-stream hook" "description": "Count of packets dropped due to pre-stream hook"
}, },
"rules": { "rules": {
"type": "integer", "type": "integer",
"description": "Number of packets dropped due to firewall rules" "description": "Count of packets dropped due to firewall rules"
} }
} }
}, },

@ -949,6 +949,8 @@ const char *PacketDropReasonToString(enum PacketDropReason r)
return "firewall pre stream hook"; return "firewall pre stream hook";
case PKT_DROP_REASON_FW_FLOW_PRE_HOOK: case PKT_DROP_REASON_FW_FLOW_PRE_HOOK:
return "firewall pre flow hook"; return "firewall pre flow hook";
case PKT_DROP_REASON_FW_FLOW_DROP:
return "firewall flow drop";
case PKT_DROP_REASON_NOT_SET: case PKT_DROP_REASON_NOT_SET:
case PKT_DROP_REASON_MAX: case PKT_DROP_REASON_MAX:
return NULL; return NULL;
@ -997,6 +999,8 @@ static const char *PacketDropReasonToJsonString(enum PacketDropReason r)
return "firewall.drop_reason.pre_stream_hook"; return "firewall.drop_reason.pre_stream_hook";
case PKT_DROP_REASON_FW_FLOW_PRE_HOOK: case PKT_DROP_REASON_FW_FLOW_PRE_HOOK:
return "firewall.drop_reason.pre_flow_hook"; return "firewall.drop_reason.pre_flow_hook";
case PKT_DROP_REASON_FW_FLOW_DROP:
return "firewall.drop_reason.flow_drop";
case PKT_DROP_REASON_FW_DEFAULT_PACKET_POLICY: case PKT_DROP_REASON_FW_DEFAULT_PACKET_POLICY:
return "firewall.drop_reason.default_packet_policy"; return "firewall.drop_reason.default_packet_policy";
case PKT_DROP_REASON_FW_DEFAULT_APP_POLICY: case PKT_DROP_REASON_FW_DEFAULT_APP_POLICY:
@ -1039,6 +1043,7 @@ void CaptureStatsUpdate(ThreadVars *tv, const Packet *p)
return; return;
CaptureStats *s = &t_capture_stats; CaptureStats *s = &t_capture_stats;
if (EngineModeIsFirewall()) { if (EngineModeIsFirewall()) {
/** The firewall mode and its stats counters should work as when there are two different /** The firewall mode and its stats counters should work as when there are two different
* devices for the firewall control and the IPS control. * devices for the firewall control and the IPS control.

@ -406,6 +406,7 @@ enum PacketDropReason {
PKT_DROP_REASON_FW_DEFAULT_APP_POLICY, /**< drop issued by default app policy */ PKT_DROP_REASON_FW_DEFAULT_APP_POLICY, /**< drop issued by default app policy */
PKT_DROP_REASON_FW_STREAM_PRE_HOOK, /**< drop issued in the pre_stream hook */ PKT_DROP_REASON_FW_STREAM_PRE_HOOK, /**< drop issued in the pre_stream hook */
PKT_DROP_REASON_FW_FLOW_PRE_HOOK, /**< drop issued in the pre_flow hook */ PKT_DROP_REASON_FW_FLOW_PRE_HOOK, /**< drop issued in the pre_flow hook */
PKT_DROP_REASON_FW_FLOW_DROP,
PKT_DROP_REASON_MAX, PKT_DROP_REASON_MAX,
}; };

@ -153,7 +153,7 @@ int PacketAlertCheck(Packet *p, uint32_t sid)
} }
#endif #endif
static inline void RuleActionToFlow(const uint8_t action, Flow *f) static inline void RuleActionToFlow(const uint8_t action, Flow *f, const bool fw_rule)
{ {
if (action & ACTION_ACCEPT) { if (action & ACTION_ACCEPT) {
f->flags |= FLOW_ACTION_ACCEPT; f->flags |= FLOW_ACTION_ACCEPT;
@ -186,6 +186,10 @@ static inline void RuleActionToFlow(const uint8_t action, Flow *f)
} }
} }
} }
if (fw_rule) {
f->aux_flags |= FLOW_AUX_ACTION_BY_FIREWALL;
}
} }
/** \brief Apply action(s) and Set 'drop' sig info, /** \brief Apply action(s) and Set 'drop' sig info,
@ -222,7 +226,7 @@ static void PacketApplySignatureActions(Packet *p, const Signature *s, const Pac
p->alerts.drop.s = (Signature *)s; p->alerts.drop.s = (Signature *)s;
} }
if ((p->flow != NULL) && (pa->flags & PACKET_ALERT_FLAG_APPLY_ACTION_TO_FLOW)) { if ((p->flow != NULL) && (pa->flags & PACKET_ALERT_FLAG_APPLY_ACTION_TO_FLOW)) {
RuleActionToFlow(pa->action, p->flow); RuleActionToFlow(pa->action, p->flow, is_fw_rule);
} }
DEBUG_VALIDATE_BUG_ON(!PacketCheckAction(p, ACTION_DROP)); DEBUG_VALIDATE_BUG_ON(!PacketCheckAction(p, ACTION_DROP));
@ -247,7 +251,7 @@ static void PacketApplySignatureActions(Packet *p, const Signature *s, const Pac
if ((pa->action & (ACTION_PASS | ACTION_ACCEPT)) && (p->flow != NULL) && if ((pa->action & (ACTION_PASS | ACTION_ACCEPT)) && (p->flow != NULL) &&
(pa->flags & PACKET_ALERT_FLAG_APPLY_ACTION_TO_FLOW)) { (pa->flags & PACKET_ALERT_FLAG_APPLY_ACTION_TO_FLOW)) {
RuleActionToFlow(pa->action, p->flow); RuleActionToFlow(pa->action, p->flow, is_fw_rule);
} }
} }
} }

@ -1640,6 +1640,7 @@ static const struct DetectFirewallPolicy *DetectFirewallApplyDefaultAppPolicy(
if (policy->action_scope == ACTION_SCOPE_FLOW) { if (policy->action_scope == ACTION_SCOPE_FLOW) {
SCLogDebug("dropping flow"); SCLogDebug("dropping flow");
p->flow->flags |= FLOW_ACTION_DROP; p->flow->flags |= FLOW_ACTION_DROP;
p->flow->aux_flags |= FLOW_AUX_ACTION_BY_FIREWALL;
} }
} else if (policy->action & ACTION_ACCEPT) { } else if (policy->action & ACTION_ACCEPT) {
if (policy->action_scope == ACTION_SCOPE_FLOW) { if (policy->action_scope == ACTION_SCOPE_FLOW) {
@ -2321,6 +2322,7 @@ static void DetectRunTx(ThreadVars *tv,
if (s->action_scope == ACTION_SCOPE_FLOW) { if (s->action_scope == ACTION_SCOPE_FLOW) {
SCLogDebug("drop flow because of rule with drop action"); SCLogDebug("drop flow because of rule with drop action");
f->flags |= FLOW_ACTION_DROP; f->flags |= FLOW_ACTION_DROP;
f->aux_flags |= FLOW_AUX_ACTION_BY_FIREWALL;
} }
} }
} }

@ -425,7 +425,11 @@ static inline void FlowWorkerStreamTCPUpdate(ThreadVars *tv, FlowWorkerThreadDat
} }
if (FlowChangeProto(p->flow) && p->flow->flags & FLOW_ACTION_DROP) { if (FlowChangeProto(p->flow) && p->flow->flags & FLOW_ACTION_DROP) {
// in case f->flags & FLOW_ACTION_DROP was set by one of the dequeued packets // in case f->flags & FLOW_ACTION_DROP was set by one of the dequeued packets
PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FLOW_DROP); if (p->flow->aux_flags & FLOW_AUX_ACTION_BY_FIREWALL) {
PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FW_FLOW_DROP);
} else {
PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FLOW_DROP);
}
} }
} }

@ -519,7 +519,11 @@ void FlowHandlePacketUpdate(Flow *f, Packet *p, ThreadVars *tv, DecodeThreadVars
} }
if (f->flags & FLOW_ACTION_DROP) { if (f->flags & FLOW_ACTION_DROP) {
PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FLOW_DROP); if (f->aux_flags & FLOW_AUX_ACTION_BY_FIREWALL) {
PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FW_FLOW_DROP);
} else {
PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FLOW_DROP);
}
} }
if (f->flags & FLOW_NOPAYLOAD_INSPECTION) { if (f->flags & FLOW_NOPAYLOAD_INSPECTION) {

Loading…
Cancel
Save