respond/reject: use livedev in bridge mode

Clean up host mode tracking, which is used by reject to control how
rejects are sent. Before this patch there were 2 modes: sniffer only
and router. This patch introduces a bridge mode that is automatically
set by the bridge modes. In bridge mode the `Packet::livedev` is used.

Ticket: #8390.
pull/15398/head
Victor Julien 7 months ago
parent 3c46e36930
commit 943fa5f453

@ -92,8 +92,7 @@ static inline libnet_t *GetCtx(const Packet *p, int injection_type)
/* slow path: setup a new ctx */
bool store_ctx = false;
const char *devname = NULL;
extern uint8_t host_mode;
if (IS_SURI_HOST_MODE_SNIFFER_ONLY(host_mode)) {
if (EngineHostModeIsSniffer()) {
if (g_reject_dev != NULL) {
if (p->datalink == LINKTYPE_ETHERNET)
injection_type = t_inject_mode = LIBNET_LINK;
@ -102,6 +101,12 @@ static inline libnet_t *GetCtx(const Packet *p, int injection_type)
} else {
devname = p->livedev ? p->livedev->dev : NULL;
}
SCLogDebug("sniffer: devname %s", devname);
} else if (EngineHostModeIsBridge()) {
devname = p->livedev ? p->livedev->dev : NULL;
SCLogDebug("bridge: devname %s", devname);
} else {
SCLogDebug("router: devname %s", devname);
}
char ebuf[LIBNET_ERRBUF_SIZE];

@ -125,7 +125,7 @@ static int AFPRunModeEnableIPS(void)
bool r = AFPRunModeIsIPS();
if (r) {
SCLogInfo("Setting IPS mode");
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_BRIDGE);
}
return r;
}

@ -1961,7 +1961,7 @@ static int DPDKRunModeEnableIPS(void)
int r = DPDKRunModeIsIPS();
if (r == 1) {
SCLogInfo("Setting IPS mode");
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_BRIDGE);
}
return r;
}

@ -119,7 +119,7 @@ static int NetmapRunModeEnableIPS(void)
int r = NetmapRunModeIsIPS();
if (r == 1) {
SCLogInfo("Netmap: Setting IPS mode");
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_BRIDGE);
}
return r;
}

@ -181,7 +181,7 @@ static enum EngineMode g_engine_mode = ENGINE_MODE_UNKNOWN;
/** Host mode: set if box is sniffing only
* or is a router */
uint8_t host_mode = SURI_HOST_IS_SNIFFER_ONLY;
enum EngineHostMode g_engine_host_mode = ENGINE_HOST_IS_SNIFFER_ONLY;
/** Maximum packets to simultaneously process. */
uint32_t max_pending_packets;
@ -255,13 +255,15 @@ int EngineModeIsIDS(void)
return (g_engine_mode == ENGINE_MODE_IDS);
}
void EngineModeSetFirewall(void)
void EngineModeSetFirewall(const enum EngineHostMode mode)
{
g_engine_host_mode = mode;
g_engine_mode = ENGINE_MODE_FIREWALL;
}
void EngineModeSetIPS(void)
void EngineModeSetIPS(const enum EngineHostMode mode)
{
g_engine_host_mode = mode;
#ifndef UNITTESTS
if (g_engine_mode == ENGINE_MODE_UNKNOWN)
g_engine_mode = ENGINE_MODE_IPS;
@ -276,6 +278,16 @@ void EngineModeSetIDS(void)
g_engine_mode = ENGINE_MODE_IDS;
}
bool EngineHostModeIsSniffer(void)
{
return (g_engine_host_mode == ENGINE_HOST_IS_SNIFFER_ONLY);
}
bool EngineHostModeIsBridge(void)
{
return (g_engine_host_mode == ENGINE_HOST_IS_BRIDGE);
}
#ifdef UNITTESTS
int RunmodeIsUnittests(void)
{
@ -1647,7 +1659,7 @@ TmEcode SCParseCommandLine(int argc, char **argv)
}
} else if (strcmp((long_opts[option_index]).name, "simulate-ips") == 0) {
SCLogInfo("Setting IPS mode");
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_ROUTER);
} else if (strcmp((long_opts[option_index]).name, "init-errors-fatal") == 0) {
if (SCConfSetFinal("engine.init-failure-fatal", "1") != 1) {
SCLogError("failed to set engine init-failure-fatal");
@ -2007,7 +2019,7 @@ TmEcode SCParseCommandLine(int argc, char **argv)
#ifdef NFQ
if (suri->run_mode == RUNMODE_UNKNOWN) {
suri->run_mode = RUNMODE_NFQ;
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_ROUTER);
if (NFQParseAndRegisterQueues(optarg) == -1)
return TM_ECODE_FAILED;
} else if (suri->run_mode == RUNMODE_NFQ) {
@ -2029,7 +2041,7 @@ TmEcode SCParseCommandLine(int argc, char **argv)
#ifdef IPFW
if (suri->run_mode == RUNMODE_UNKNOWN) {
suri->run_mode = RUNMODE_IPFW;
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_ROUTER);
if (IPFWRegisterQueue(optarg) == -1)
return TM_ECODE_FAILED;
} else if (suri->run_mode == RUNMODE_IPFW) {
@ -2723,26 +2735,38 @@ static void PostConfLoadedSetupHostMode(void)
if (SCConfGet("host-mode", &hostmode) == 1) {
if (!strcmp(hostmode, "router")) {
host_mode = SURI_HOST_IS_ROUTER;
g_engine_host_mode = ENGINE_HOST_IS_ROUTER;
} else if (!strcmp(hostmode, "bridge")) {
g_engine_host_mode = ENGINE_HOST_IS_BRIDGE;
} else if (!strcmp(hostmode, "sniffer-only")) {
host_mode = SURI_HOST_IS_SNIFFER_ONLY;
g_engine_host_mode = ENGINE_HOST_IS_SNIFFER_ONLY;
} else {
if (strcmp(hostmode, "auto") != 0) {
WarnInvalidConfEntry("host-mode", "%s", "auto");
}
if (EngineModeIsIPS()) {
host_mode = SURI_HOST_IS_ROUTER;
/* only set if not already set by the runmode */
if (g_engine_host_mode == ENGINE_HOST_IS_SNIFFER_ONLY) {
SCLogDebug("host mode set to %u setting to %u", g_engine_host_mode,
ENGINE_HOST_IS_ROUTER);
g_engine_host_mode = ENGINE_HOST_IS_ROUTER;
}
} else {
host_mode = SURI_HOST_IS_SNIFFER_ONLY;
g_engine_host_mode = ENGINE_HOST_IS_SNIFFER_ONLY;
}
}
} else {
if (EngineModeIsIPS()) {
host_mode = SURI_HOST_IS_ROUTER;
SCLogInfo("No 'host-mode': suricata is in IPS mode, using "
"default setting 'router'");
/* only set if not already set by the runmode */
if (g_engine_host_mode == ENGINE_HOST_IS_SNIFFER_ONLY) {
SCLogDebug("host mode set to %u setting to %u", g_engine_host_mode,
ENGINE_HOST_IS_ROUTER);
g_engine_host_mode = ENGINE_HOST_IS_ROUTER;
SCLogInfo("No 'host-mode': suricata is in IPS mode, using "
"default setting 'router'");
}
} else {
host_mode = SURI_HOST_IS_SNIFFER_ONLY;
g_engine_host_mode = ENGINE_HOST_IS_SNIFFER_ONLY;
SCLogInfo("No 'host-mode': suricata is in IDS mode, using "
"default setting 'sniffer-only'");
}
@ -2786,7 +2810,7 @@ int PostConfLoadedSetup(SCInstance *suri)
}
if (suri->is_firewall) {
SCLogWarning("firewall mode is EXPERIMENTAL and subject to change");
EngineModeSetFirewall();
EngineModeSetFirewall(g_engine_host_mode);
}
/* load the pattern matchers */

@ -111,22 +111,23 @@ enum EngineMode {
ENGINE_MODE_FIREWALL,
};
/* Engine is acting as router */
enum EngineHostMode {
ENGINE_HOST_IS_SNIFFER_ONLY,
ENGINE_HOST_IS_ROUTER,
ENGINE_HOST_IS_BRIDGE,
};
/* superset of IPS mode */
void EngineModeSetFirewall(void);
void EngineModeSetIPS(void);
void EngineModeSetFirewall(const enum EngineHostMode);
void EngineModeSetIPS(const enum EngineHostMode);
void EngineModeSetIDS(void);
int EngineModeIsUnknown(void);
bool EngineModeIsFirewall(void);
int EngineModeIsIPS(void);
int EngineModeIsIDS(void);
/* Box is acting as router */
enum {
SURI_HOST_IS_SNIFFER_ONLY,
SURI_HOST_IS_ROUTER,
};
#define IS_SURI_HOST_MODE_SNIFFER_ONLY(host_mode) ((host_mode) == SURI_HOST_IS_SNIFFER_ONLY)
bool EngineHostModeIsSniffer(void);
bool EngineHostModeIsBridge(void);
#include "runmodes.h"

@ -93,7 +93,7 @@ static int RunTest(struct TestSteps *steps, const char *sig, const char *yaml)
SCConfYamlLoadString(yaml, strlen(yaml));
HTPConfigure();
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_ROUTER);
}
StreamTcpInitConfig(true);

@ -4276,7 +4276,7 @@ static int SigTestDropFlow03(void)
uint32_t http_buf2_len = sizeof(http_buf1) - 1;
/* Set the engine mode to IPS */
EngineModeSetIPS();
EngineModeSetIPS(ENGINE_HOST_IS_ROUTER);
TcpSession ssn;
Packet *p1 = NULL;

@ -1389,10 +1389,12 @@ security:
coredump:
max-dump: unlimited
# If the Suricata box is a router for the sniffed networks, set it to 'router'. If
# it is a pure sniffing setup, set it to 'sniffer-only'.
# If set to auto, the variable is internally switched to 'router' in IPS mode
# and 'sniffer-only' in IDS mode.
# If Suricata acts as a router for the network, set it to 'router'. If
# it is a pure sniffing setup, set it to 'sniffer-only'. For 'bridge' setups like
# AF_PACKET IPS, use 'bridge'.
# If set to auto, the mode is 'sniffer-only' in IDS mode, and 'router' or 'bridge'
# for IPS modes, depending on which is used. E.g. AF_PACKET IPS uses the bridge
# mode, while NFQ uses the router mode.
# This feature is currently only used by the reject* keywords.
host-mode: auto

Loading…
Cancel
Save