Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 27 additions & 15 deletions doc/userguide/firewall/firewall-design.rst
Original file line number Diff line number Diff line change
Expand Up @@ -327,35 +327,47 @@ of :ref:`engine analysis<config:engine-analysis>`.
Default policies
================

Each hook has a default policy. By default ``packet.filter`` enforces a ``drop:packet`` policy and the
``app`` hooks apply ``drop:flow``.
Each hook has a default policy applied to traffic that no firewall rule handled.
By default ``packet.filter`` enforces ``drop:packet``, ``packet.pre-flow`` and
``packet.pre-stream`` enforce ``accept:hook``, and every ``app`` hook enforces
``drop:flow``.

The policies can be configured in ``firewall`` block in the config. Packet hooks
live under ``packet`` and app-layer hooks under ``app``, keyed by protocol.

Example for ``packet.filter``, to use reject instead of drop::
Defaults are configured in the ``firewall.policies`` block. A ``default-policy``
for any hook may be given at several levels and the most specific present
setting wins::

firewall:
policies:
default-policy: ["accept:hook"] # global fallback (all hooks)
packet:
filter: [ "reject:packet" ]


Example for DNS::

firewall:
policies:
default-policy: ["drop:packet"] # fallback for packet hooks
filter: ["reject:packet"]
pre-flow: ["accept:hook"]
pre-stream: ["accept:hook"]
app:
default-policy: ["drop:flow"] # fallback for all app hooks
dns:
default-policy: ["drop:flow"] # fallback for dns hooks
request-started: ["accept:hook"]

# Drop and alert on all DNS requests that are not allowed in
# firewall.rules.
request-complete: ["drop:flow", "alert"]

# Accept all responses.
response-started: ["accept:tx"]

Precedence:

* packet hook: ``packet.<hook>`` > ``packet.default-policy`` >
``policies.default-policy`` > built-in (``drop:packet`` or ``accept:hook``)
* app hook: ``app.<proto>.<hook>`` > ``app.<proto>.default-policy`` >
``app.default-policy`` > ``policies.default-policy`` > built-in (``drop:flow``)

An action scope must be valid for the hook it is applied to. For example,
defining ``accept:tx`` as a global default policy will fail to start Suricata,
because ``packet`` policies do not accept ``tx``.
Cover such hooks with a more specific setting so the incompatible default never
reaches them.


ARP handling in bridge mode
---------------------------
Expand Down
14 changes: 4 additions & 10 deletions src/detect-engine-analyzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2110,11 +2110,8 @@ int FirewallAnalyzer(const DetectEngineCtx *de_ctx)
const char *name =
AppLayerParserGetStateNameById(IPPROTO_TCP, a, state, STREAM_TOSERVER);
if (name == NULL) {
if (state == 0)
name = "request-started";
else if (state == complete_state_ts)
name = "request-complete";
else
name = DetectFirewallAppGenericHookName(state, complete_state_ts, STREAM_TOSERVER);
if (name == NULL)
name = "unknown";
}

Expand All @@ -2136,11 +2133,8 @@ int FirewallAnalyzer(const DetectEngineCtx *de_ctx)
const char *name =
AppLayerParserGetStateNameById(IPPROTO_TCP, a, state, STREAM_TOCLIENT);
if (name == NULL) {
if (state == 0)
name = "response-started";
else if (state == complete_state_tc)
name = "response-complete";
else
name = DetectFirewallAppGenericHookName(state, complete_state_tc, STREAM_TOCLIENT);
if (name == NULL)
name = "unknown";
}
char table_name[128];
Expand Down
Loading
Loading