Skip to content

Run Zeek on a mirror port, and see the VLAN 30 traffic the firewall never will #437

Closed

Description

@Gerrrt

docs/security.md states Suricata's three limits plainly: alert-only, two
segments, and plaintext only
. ADR-0006
put it on morpheus because the firewall is the only device that sees IoT and
guest — which is right, and which is also why it cannot see the traffic this
issue is about.

Every technique ADR-0029
built the domain to exercise is layer 2 or intra-segment.
LLMNR and NBT-NS
poisoning, NTLM relay, Kerberoasting, ARP spoofing — none of it crosses the
router, so morpheus never sees a packet of it. This is
ADR-0014's
own argument for why ifrit is layer-2 adjacent to its targets, applied to
detection instead of attack.

Zeek is not a second Suricata. It is a protocol logger — conn, dns, http,
ssl, files, x509. Two things follow that matter here:

  • It reads TLS metadata without decrypting — SNI, JA3/JA3S, certificate
    subjects and issuers. That is precisely the ground Suricata's "plaintext only"
    limit gives up, and where C2 detection actually lives.
  • It sees east-west traffic between the six domain guests, which nothing in
    this estate currently observes at all.

What this needs on the hypervisor, and it is the awkward part

Saruman's lab bridge is a Linux bridge. Port mirroring needs Open
vSwitch
. Converting it touches the box whose own firewall ADR-0014 leans on,
so it is a decision in its own right and belongs in this issue's discussion
rather than in a commit.

The trap, and the estate's own answer to it

A mirror port does not survive a reboot of the hypervisor. A systemd unit
recreates it — but a unit that silently stopped is exactly the
"healthy-looking metric with nothing underneath it" failure this repository
keeps finding one level up each time
(#62,
#63,
#305, the UPS pack).

So the unit ships with a homelab_zeek_mirror_active textfile gauge, in the
exporter-less pattern scripts/run-scheduled.sh and scripts/collect-*.sh
already establish: no new service, no new image, no new port, no new privilege.
Then reboot Saruman and confirm the gauge goes to zero and an alert fires.
If it does not, the unit is decorative.

Where the logs go

The lab's Loki on alexander, never 10.0.99.20. ADR-0007's "lab telemetry
stays in the lab" governs, and #88's
amendment covers the hypervisor's own agent only.

What it waits on

#414. A sensor pointed at a
segment with one guest on it has nothing to say; the six-guest domain is what
makes east-west traffic exist.

Purchases this needs

None. A guest on Saruman, roughly 4 vCPU / 8 GB, plus a data disk.


Corrected 2026-09-19

Two things settled after filing that lived only in a comment:

Gate stays #414. The Ubuntu template #440 would build for this guest is a Wave-later item; this guest can be built by hand first.

Activity

  1. added
    seq/3Step 3 within its milestone; same number = can run in parallel
    on Sep 11, 2026
  2. Gerrrt commented on Sep 17, 2026

    @Gerrrt
    OwnerAuthor

    This issue now owns Zeek absence-detection. #441 asked for a ZeekLogsStopped Loki rule "the same shape against the lab's Loki, once #437 exists". It has been closed, and this is where the question lands instead — a note so the next person does not re-derive it.

    Why it cannot be a Loki rule here. Three constraints, all already decided:

    • This issue puts Zeek's logs on alexander and never on 10.0.99.20 — ADR-0007 requires it, and ADR-0039 reaffirms it by keeping the mirror on Saruman's own bridge rather than a SPAN from neo.
    • ADR-0020 gives stacks/lab/ no Alertmanager on purpose: "nothing in the lab pages." So stacks/lab/loki/ ships no ruler and no rules/ directory, and its config says why — "a ruler with nowhere to deliver evaluates rules and discards the result, which reads as coverage and is not."
    • ADR-0028 revisited that boundary, let guest liveness cross and kept guest telemetry in the lab.

    A rule in the lab's Loki would evaluate and discard; one in the estate's Loki would need log data ADR-0007 forbids crossing.

    Why this issue already solves it. The homelab_zeek_mirror_active textfile gauge in the plan above is the answer — read on the hypervisor by the agent that is already there, crossing as hypervisor state under ADR-0028, with the alert on the estate's Prometheus. It is there because a mirror port does not survive a reboot, and it happens to be the same instrument the absence question needs. Nothing extra to build.

    Two things to carry into the build, both from #441's experience:

    No change to this issue's scope or milestone — just recording where the question went.

  3. added
    socstacks/soc on odin (VLAN 30)
    on Sep 19, 2026
  4. Gerrrt commented on Sep 26, 2026

    @Gerrrt
    OwnerAuthor

    2026-09-26: The gate has cleared. #414's six guests have been up and joined since 2026-09-25. What's left is this issue's own decision (converting Saruman's lab bridge to Open vSwitch) and then the build. It still doesn't depend on #444 (ADR-0039, and the 2026-09-19 correction above). roadmap.md said otherwise, and #670 corrects it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestseq/3Step 3 within its milestone; same number = can run in parallelsocstacks/soc on odin (VLAN 30)

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions