I use sample logs and substituted names, DNS records, addresses, and ports to protect the identity of my lab and the people who use it. Example alerts and triage decisions illustrate the workflow.
lab /Topology
Simulated telemetry · substituted names and addresses 7 Nov 2026 · 00:00 to 24:00 UTC
Guests
13 8 running
DNS queries
4,164 22.5% blocked
Endpoints
3 Windows
SIEM alerts
24 9 high
Cases
4 3 open
Select a service to see what it does.
Running
Stopped
Configured
In use
Reference stack
Example
Tracing packet flow
Outside traffic reaches the WAN bridge, crosses Sophos, and leaves on the LAN bridge. Hosts on the same bridge can talk without crossing Sophos. From my lab record
The connector holds an outbound session through Sophos; the last hop from connector to the Proxmox UI stays on the LAN bridge. Connector, resources and group from my record
An Admin-Devices peer reaches the Proxmox UI on TCP 8006 through the routing peer, which masquerades the traffic onto the LAN. Routing peer and policy from my record
The SOCFortress reference flow: Windows events into Wazuh, Sophos syslog into Graylog, and both into CoPilot. Splunk and Defender are separate views of the endpoints, not stages after Wazuh. Reference architecture; alerts shown are worked examples
Readers reach the journal through Cloudflare and a named tunnel to CT 410 in the DMZ VLAN, where cloudflared hands each request to Caddy on loopback. Hosting runbook and the running deployment
Approved capture · private
My approved NextDNS capture stays in my private notebook, with its own date and source. Its rows and totals are not published, so nothing on this page is derived from it.
Simulated telemetry · substituted names and addresses · 24 h · 7 Nov 2026, 00:00 to 24:00 UTC
Queries
4,164
Allowed
3,228
Blocked
936
Blocked share
22.5%
Queries per hour (UTC) · allowed blocked
0006121824
No queries match these filters.
Top domains
updates.vendor.exampleallowed723
cdn.assets.exampleallowed645
login.idp.exampleallowed565
api.game.exampleallowed403
ads.tracker.exampleblocked349
mail.provider.exampleallowed324
Destinations modelled estimate
Modelled share of destinations
Japan
24.5%
Philippines
24.5%
United States
24.5%
Singapore
24.5%
Elsewhere
2%
Two ways to answer “who can reach what, and why”. Groups, resources and ports are from my lab record; each denied case is marked as an example until I run it.
Twingate
User to Resource, through a Connector
Admin laptopsigned-in user
Homelab-ADMINgroup grant
ConnectorLXC 208 · outbound only
Proxmox web UITCP 8006 · UDP, ICMP blocked
Member of Homelab-ADMIN
Connected · from my record
The group is granted the Proxmox resource on TCP 8006, and I confirmed the UI loads through the client. Sophos web admin on TCP 4444 is granted the same way.
Account outside Homelab-ADMIN
No route offered · practice example
No grant covers this account, so the client never offers a route to the resource. I still need to run this test with a second account to show it.
NetBird
Enrolled peer to resource, through a routing peer
Admin laptoppeer in Admin-Devices
Access policyTCP 8006 and 4444 only
Routing peerLXC 204 · masquerade on
Proxmox web UITCP 8006
Peer in Admin-Devices
Connected · from my record
A one-way policy lets Admin-Devices reach the Proxmox and Sophos web UIs on TCP 8006 and 4444 through the routing peer. I confirmed browser access from outside home.
Peer outside Admin-Devices
Dropped · example
The default all-to-all policy is disabled in my record, so no policy links this peer to the resources. Ping also fails by design, because the policy allows TCP only.
Alert queue
Simulated telemetry · 24 h · substituted names and addresses
08:14highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:15highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:16highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:16mediumFirewall deny burstWS-02 · Sophos syslogno case
08:17highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:18highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:19highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:19mediumFirewall deny burstWS-02 · Sophos syslogno case
08:20highMultiple failed logons (4625)FS-01 · Windows SecuritySOC-0142
08:22mediumFirewall deny burstWS-02 · Sophos syslogno case
08:25mediumFirewall deny burstWS-02 · Sophos syslogno case
08:28mediumFirewall deny burstWS-02 · Sophos syslogno case
10:32lowQuery to a blocked categoryWS-01 · NextDNSSOC-0145
13:03lowQuery to a blocked categoryWS-02 · NextDNSSOC-0145
13:05mediumPowerShell script block logged (4104)FS-01 · Windows PowerShellSOC-0144
13:52mediumPowerShell script block logged (4104)WS-01 · Windows PowerShellSOC-0144
14:39mediumPowerShell script block logged (4104)FS-01 · Windows PowerShellSOC-0144
15:26mediumPowerShell script block logged (4104)WS-01 · Windows PowerShellSOC-0144
15:34lowQuery to a blocked categoryWS-01 · NextDNSSOC-0145
16:40mediumNew service installed (7045)WS-01 · Windows Systemno case
16:49mediumNew service installed (7045)WS-01 · Windows Systemno case
18:05lowQuery to a blocked categoryWS-02 · NextDNSSOC-0145
19:02highMember added to privileged group (4732)FS-01 · Windows SecuritySOC-0143
19:04highMember added to privileged group (4732)FS-01 · Windows SecuritySOC-0143
SOC-0142 Failed-logon cluster on FS-01 7 Nov 2026
simulated case · substituted names and addresses
Windows Security → Wazuh agent
08:14 UTC Windows event
FS-01 writes event 4625 for each failed network logon. The Wazuh agent ships the Security log entries I selected, so the manager sees each failure within seconds.
Wazuh → CoPilot · Graylog
08:21 UTC Alert becomes a case
Repeated failures from one source match a Wazuh frequency rule. CoPilot reads the alert from the indexer and opens SOC-0142; Graylog supplies the Sophos denies from the same window as a related observation.
Shuffle · read-only
08:21 UTC Read-only enrichment
A Shuffle workflow looks up the account and the workstation. Every call is a read: no password reset, no isolation, nothing that changes the lab.
AI agent · Jev
08:22 UTC Agent draft and recommendation
An agent drafts the triage note and cites E1 to E4 for every claim. Jev is asked one bounded question with typed choices and returns request context, with medium uncertainty: a bad-password sub status right after a password change fits a stale saved credential better than guessing.
request contextanalyst reviewcandidate for closureuncertainty: medium
Shuffle approval gate
08:22 UTC Approval gate
The workflow stops. Ambiguity and any closure recommendation go to a person, and disabling the account or isolating WS-02 would need explicit approval, so no automated action runs.
Analyst in CoPilot
08:40 UTC Analyst disposition
I read the draft against the evidence, keep the case open as likely benign pending the account owner confirming the saved credential, and leave the firewall deny linked as its own observation.
Evidence
E1 7 × event 4625 on FS-01
Windows Security · Wazuh agent
Account LAB\student01, logon type 3 (network), sub status 0xC000006A (bad password), workstation WS-02, 08:14 to 08:20 UTC.
E2 5 × Sophos deny from WS-02
Sophos syslog · Graylog
WS-02 to soc-ui.lab.example on TCP 443, rule “Identity to SOC”, 08:16 to 08:28 UTC.
E3 Directory context for LAB\student01
AD lookup (sample)
Account exists and is enabled, member of Lab Users, password changed at 08:05 UTC.
E4 Workstation context for WS-02
Asset notes (sample)
Domain-joined workstation with a mapped drive to \\FS-01\share saved under the old password.
Decision log
UTC
Actor
Entry
Evidence
08:21
Playbook v3 (sample)
Case created from 7 alerts; 5 firewall denies attached as related
Most of my lab questions end up as identity questions: which account did this, which group allowed it, and which policy should have stopped it. This is the part of the lab I have spent the most time on. Each card links to the entry that shows the work.
Example layout · names are illustrative
lab.exampledomain root
Lab Usersdaily accounts
Lab Adminsseparate admin accounts, tiered
Lab Computers
Workstationsdomain-joined clients
Serversfile server, member servers
Service Accountsno interactive logon
Group Policy objects
Linked at the domain root, so every account inherits it.
Linked to Lab Computers: turns on logon and account-management auditing for workstations and servers below it.
Linked to Workstations only: admin accounts cannot sign in interactively there.
Pick a GPO to see which OUs it reaches. Names are illustrative, not my real domain.
Users, groups and OUs
Daily and admin accounts are separate objects in separate OUs. Access goes to groups, never to a person, so removing someone from a group removes the access everywhere. A nested helpdesk group is the line I check first in a membership review.
A GPO reaches everything under the OU it is linked to. When a setting is missing on a machine, I read gpresult on that machine before I touch the domain controller: the distinguished name usually answers it.
Audit policy decides which events exist at all. I turned on logon and account-management auditing for lab computers, then read one failed logon (4625) field by field to see what the alert leaves out.
For a locked account I check 4740 for where the lockout came from and 4625 for the failures behind it, then the lockout policy, before resetting anything. The worked example traces one lab user locked out from one workstation.
Twingate starts from the user: a signed-in person asks for a named Resource, and the groups granted to it decide whether a route exists. In my lab the Proxmox and Sophos web UIs are Resources granted to one admin group.
NetBird starts from the device: peers in groups, and policies between groups. A routing peer forwards to networks behind it. The default allow-all policy is disabled in my setup, so only TCP 8006 and 4444 are allowed and a failed ping is expected.
My friends and I play on a vanilla Java Edition 26.3 server in its own container, LXC 207, which I run from Crafty Controller. My home internet sits behind carrier-grade NAT, so I can't forward a port in. My friends connect to a public VPS instead, and WireGuard carries the game back to the lab. One Cloudflare SRV record gives them a single name to type.
The scanners taught me the rest. Moving the port only made my log quieter; the whitelist, withonline-mode on, is what decides who gets in. Flip Before and After below to see what changed.
Minecraft for five friendsLXC 207 · Java Edition 26.3
Cloudflare DNSSRV + A recordsScannerscommon portsFriend's clientjoins by nameVPS edge203.0.113.24WireGuardtunnel to the labLXC 207Crafty + serverWhitelist + sign-in:25565 answered:25565 closed
Port
default 25565
Whitelist
off: any account could join
Joining
VPS address and port, typed by hand
Scan noise
frequent on the common port
Port
28565 (example)
Whitelist
on: five named friends
Joining
one name, found by an SRV record
Scan noise
quieter; the port is not a control
Examples for privacy: the VPS IP, player names, hostname, SRV record and port are substituted
Cloudflare only answers the DNS lookup here; game traffic goes to the VPS. The journal’s own Cloudflare Tunnel is a separate path.
enforce-whitelist also removes anyone already online who is not on the list when it is reloaded. The list matches accounts, so account sign-in checks are part of the same control.
nc: connect to mc-edge.example.net port 25565 (tcp) timed out
Connection to mc-edge.example.net 28565 port [tcp/*] succeeded!
Run from a laptop off the home network, so the test takes the same path a friend does.
Example output
What runs in the lab
Sophos FirewallVM 102Running
Proxmox VEhypervisor on the laptopConfigured
Active DirectoryAD DS + GPOIn use
TwingateLXC 208Running
NetBirdLXC 204Running
NextDNSLXC 209Running
Cloudflare TunnelLXC 203Running
Wazuhdetection layerReference stack
SOCFortress CoPilotSOC workspaceReference stack
Splunksecond SIEM viewIn use
Defender for Endpointendpoint sensor · trialIn use
Kali Red / BlueVM 301 · 302Stopped
MinecraftLXC 207Running
DMZ · journalCT 410Running
Sophos FirewallVM 102Running
Proxmox VEhypervisor on the laptopConfigured
Active DirectoryAD DS + GPOIn use
TwingateLXC 208Running
NetBirdLXC 204Running
NextDNSLXC 209Running
Cloudflare TunnelLXC 203Running
Wazuhdetection layerReference stack
SOCFortress CoPilotSOC workspaceReference stack
Splunksecond SIEM viewIn use
Defender for Endpointendpoint sensor · trialIn use
Kali Red / BlueVM 301 · 302Stopped
MinecraftLXC 207Running
DMZ · journalCT 410Running
Product names and logos are trademarks of their owners and appear only to name the tools I use. Sophos, Wazuh, Twingate, NetBird, SOCFortress CoPilot, Defender for Endpoint and Minecraft are shown with named line icons because no permitted logo was available.
For internship reviewers
What I can do, grouped the way job postings ask
Five capability groups. Under each, a line on what entry-level postings asked for in November 2026, then the skills I used and the entry that shows it. The rating is my own four-step scale, not a percentage or a certification.
skills --by-group5 groups · 18 skills
ExploredI have read about it and tried it once.
PracticedI have used it on example data or a practice exercise.
AppliedI have used it in my lab for a real job.
Can troubleshoot and explainI can find a fault in it and explain the cause.
Network and IT operations
Postings ask for TCP/IP, routing, NAT, firewalls and VPNs, plus basic Linux.
Proxmox and LXC operationsCan troubleshoot and explain (4 of 4)
I can say which bridge a packet is on and why that decides whether Sophos sees it.
The thesis environment sits in the LAB_TEST VLAN, cut off from the internet and from my management network. The work is in progress; notes go up when they are ready to share.