Skip to content

What the Intrusion Detection sees of a connection in hardware, measured - and the pages that say so, 2026-10-24

Suricata, OPNsense's Intrusion Detection, listens on this host. A connection the flow maker hands to the coprocessor no longer crosses it, so in IDS mode - which only listens - and in IPS mode without "Inspect, then hardware" running, Suricata sees how each connection starts and nothing after it. No page said so until today; asked about on the OPNsense forum. Since this change XGS: Overview and XGS: Settings say it whenever it is the case (what it cannot do).

Measured on both appliances, Suricata in IDS mode (pcap) on the interface a 10-second TCP stream came in on, started fresh before the stream and stopped after it - a stopped Suricata says how many packets it captured on each interface:

the flow maker on: the stream in hardware the flow maker off: the host carries it all
XGS 3300, octep.ko 970b38db 4.24 GB at 3.64 Gbit/s, 63 packets captured 2.86 GB at 2.46 Gbit/s, 2,148,522 packets
XGS 136, npuep.ko 55df8238 1.08 GB at 928 Mbit/s, 92,123 packets captured 1.10 GB at 941 Mbit/s, 1,613,702 packets

On the XGS 3300 the connection was in hardware after its first few dozen packets. On the XGS 136 the flow maker makes connections in a sweep once a second, so the host - and Suricata - carried about the first second of the stream at the link's rate, about 94,000 frames each way, and then nothing: counted on the same port with tcpdump -Q in and -Q out in a run of its own, 94,134 and 94,348 frames. Either way, what Suricata sees is how the connection starts.

In each state the pages' flag (status.py, intrusion_detection.uninspected) was read: false with the Intrusion Detection off, true with it on in IDS mode and the flow maker on, false again with the flow maker off.

XGS 3300: the Intrusion Detection in IDS mode on F1; with the flow maker on, a 10 s stream of 4.24 GB in hardware and 63 packets captured by Suricata; with it off, 2,148,522

XGS 136: the same on Port8; with the flow maker on, 92,123 packets captured - about the first second of the stream; with it off, 1,613,702

What the pages say

A warning above the page, on XGS: Overview and on XGS: Settings, while the Intrusion Detection is on, the flow maker is on, and "Inspect, then hardware" is not running in Netmap mode: which interfaces it listens on and in which mode, that Suricata sees how each connection starts and nothing after it, and what to do - in IPS mode, "Inspect, then hardware"; in either mode, Never offloaded for what it must see, or the flow maker off. In Arabic from the opnsense-arabic catalogue.

XGS 3300, XGS: Overview: the Intrusion Detection listens on F1 in IDS mode, and the warning above the page says what Suricata does not see and what to do

The same in Arabic

XGS 3300, XGS: Settings: the same warning above the tabs, over the settings it names

XGS 136, XGS: Overview: the warning for its Port8

Why a warning and not the connections kept with the host

The other way was to keep the connections of the interfaces the Intrusion Detection listens on with the host, as an enabled Traffic Shaper rule or Captive Portal zone already does (ipfw_keeps() in src/opnsense/scripts/xgs/flow_exclude.php). Not taken, for two reasons:

  • IDS mode with the offload is used on purpose. XGS: Settings "Cut connections by TLS fingerprint" needs only the Intrusion Detection's TLS log, in IDS mode, and takes the fingerprint from a connection's first message before it goes into hardware. Keeping everything with the host while the Intrusion Detection runs would take the offload away from every such owner without asking.
  • An interface's networks are not what crosses it. The exclusion matches either end of a connection; traffic routed through a WAN without NAT has neither end on the WAN's network, and a WAN by DHCP has no fixed network at all. Doing it properly needs an exclusion by interface in both drivers - work of its own.

So the owner is told, on the two pages an owner of this plugin reads, with the two ways to have Suricata see everything.

How it was measured

images/deploy/lab-ids-note.sh (local), photographed by lab-ids-note-series.ps1; the GUI and its scripts on both appliances were brought to this tree as a set first, every tracked file that differed. The Intrusion Detection was set through its own model, as its page sets it, and put back afterwards: off, Netmap mode, its interface as before. The log is kept as measurements/ids-note-2026-10-24.log.

Discussion

The discussion of this page is held in the project's GitHub Discussions. Showing it here loads giscus from giscus.app and GitHub, and writing in it needs a GitHub account - what that means.