One laptop running Proxmox, with Sophos between the WAN bridge, the untagged LAN bridge and a seven-VLAN trunk. Trace a path on the map, filter the DNS view, compare the two private access tools, or replay a simulated case.
Maps and logs use substituted names and addresses; recorded dates and counts are marked where they appear.
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
Every service in the SOCFortress stack I follow, sorted by the job it does. SOCFortress CoPilot is the workspace an investigation starts from; the rest feed it evidence or wait behind its approval gate. Each card says whether it is in my lab or part of the reference architecture.
SOCFortress CoPilotSOC workspace · alerts and cases
The centre of the stack: one queue for alerts from Wazuh and Graylog, cases, and the integrations that reach the other tools. It is the screen I would start every investigation from.
Defender incident API · Event Hubsreference integration paths
Microsoft documents incidents into Splunk through its add-on, and event streaming through Azure Event Hubs. Licences and versions are checked before either.
“Reference architecture” marks a role from the SOCFortress stack and its documentation, not a guest in my 8 Nov 2026 inventory. Connector flows on this site are worked examples. Wazuh, Sophos, Defender, Velociraptor, Shuffle and the SOCFortress services use named line icons because no permitted logo was available.
Sophos VLANs, rule order and segmentation
The VLAN trunk as configured on Port3 and vmbr2, the order Sophos evaluates its rules in, what the rule list does not cover, what my VLAN 20 test did and did not show, and where each role in the lab belongs.
VLANs on Port3 / vmbr2as configured on 6 Nov 2026
VLAN
Name
Gateway
Used for
5
MGMT
/24 on Sophos
Management interfaces
10
SERVERS
/24 on Sophos
Server guests
20
LAB_TEST
/24 on Sophos
Thesis and Kali environment; SafeLine (LXC 202) is tagged here
30
TRUSTED
/24 on Sophos
Trusted devices
40
SOC
/24 on Sophos
Detection tools
50
DMZ
/24 on Sophos
This journal’s origin, CT 410 (confirmed)
60
IOT_GUEST
/24 on Sophos
Guests; internal only, no AP or switch tags it
Lease example, VLAN 20: gateway 192.0.2.1/24 · lease 192.0.2.57 · DNS 192.0.2.1
Example addresses (RFC 5737), not my lab’s. The legacy untagged LAN on vmbr1 is separate and not shown.
Firewall rule ordertop to bottom · first match wins
1DMZ_SITE_UPDATESallowDMZ (network object) → WAN · HTTP, HTTPS, custom Cloudflare service (TCP/UDP 7844)Lets the DMZ reach the internet for package updates and for the Cloudflare tunnel.The one exception the DMZ needs, placed above the drops so it is evaluated first. Its source is the whole DMZ object, not only CT 410.
2DROP_NEW_VLANSdrop · logthe newly added VLAN zones (list truncated on screen) → Any · AnyDrops and logs traffic from the new VLANs until each one has its own allow rule.A new VLAN starts closed. The screenshot cuts the source list short, so I only claim the zones I can read.
3DROP_LAB20_OUTBOUNDdrop · logLAB_TEST (VLAN 20) → Any · AnyDrops and logs everything leaving the thesis and Kali network.Test guests must not reach the internet or my management interfaces.
4Allow_Minecraft_WireGuardallowMinecraft LXC host object → the VPS host object · custom WireGuard serviceLets the Minecraft server’s WireGuard tunnel reach the public VPS.A scoped exception for one host and one service.
5LAN_TO_WANallowlegacy LAN → WAN · AnyLets the legacy untagged LAN reach the internet.The broad rule goes low, so narrower rules above it decide first.
6Automatic MTA policygeneratedas generated → as generated · SMTP servicesCreated by Sophos for its mail transfer agent; accept, as shown.Generated by the firewall; I left it as it was created.
7Implicit dropdropAny → Any · AnyAnything no rule above matched is dropped.The default when nothing allows the traffic.
A scoped exception only works if Sophos evaluates it before an applicable drop. DMZ_SITE_UPDATES sits first for that reason. If VLAN 20 ever needs DNS, that allow rule goes above DROP_LAB20_OUTBOUND, or the drop matches first and the allow never runs.
What the rule list does not coverread with the rules above
First match
Sophos stops at the first rule that matches. An exception only works if it sits above the drop that would otherwise match it.
Forwarded traffic vs device access
These rules govern traffic passing through the firewall between zones. Traffic to the firewall itself (its DNS, web admin, User Portal, SNMP) is controlled by the device access settings per zone, a separate table.
NAT is separate
Source NAT for outbound traffic and any port forwards are NAT rules, evaluated apart from these. Allowing a flow here does not create a NAT rule, and a NAT rule does not allow a flow.
Not proof of isolation
A drop rule shows intent and, with logging, what it matched. It does not prove a network is isolated in every direction; only tests from each side can show that, and I have run one so far (VLAN 20, below).
Web policy, as shown. Enforced rows: Blocked URLs, Risky downloads, Suspicious downloads. Several other categories in the same policy are disabled, and its default action is allow. So the policy blocks what those enabled rows match; it does not block every category listed on the screen.
DMZ device access, as shown. DNS, User Portal, SNMP. The DMZ zone’s device access lists DNS, User Portal and SNMP. That is the observation, not a recommendation: User Portal and SNMP are not services this site needs from the firewall, and narrowing them is on my list.
VLAN 20 test from SafeLine6 Nov 2026 · SafeLine, LXC 202, tagged VLAN 20
DHCP leasepassLease received from Sophos
Ping the VLAN 20 gatewayfailNo reply
Ping a public addressfailNo reply
Ping an internal addressfailNo reply
TCP to Proxmox managementfailConnection did not open
Sophos logdropDrops recorded on UDP/53 and TCP/853 under DROP_LAB20_OUTBOUND
IPv6noteA link-local address was present on the interface
What this establishes: VLAN 20 gets an address, and DROP_LAB20_OUTBOUND matched its DNS and DNS-over-TLS attempts. It covers these checks over IPv4. With a link-local IPv6 address present, it does not prove the VLAN is isolated in every direction or that IPv6 is off.
Where each role belongs: the segmentation model
Scope. This is the complete logical layout I am working towards, not a record of what has moved. Only placements marked Confirmed tag are verified. Stated placementfollows my own instruction for that VLAN. Logical model is where the role belongs by design; today most of these guests still sit on the legacy untagged LAN (vmbr1), as the inventory below shows.
VLAN 5MGMT
Administrative connectors and the private proxy
Twingate connector LXC 208Logical model
NetBird routing peer LXC 204Logical model
BunkerWeb private proxy LXC 206Logical model
Cloudflare Tunnel, recovery access LXC 203Logical model
VLAN 10SERVERS
Infrastructure services
NextDNS forwarder LXC 209Logical model
Minecraft server and WireGuard LXC 207Logical model
VLAN 20LAB_TEST
Thesis and Kali environment, and their targets
SafeLine LXC 202Confirmed tag
Kali Red VM 301Stated placement
Kali Blue VM 302Stated placement
Thesis test guestsStated placement
AD lab domain controller and Windows targetsLogical model
VLAN 30TRUSTED
My own client devices
Personal laptop and phoneLogical model
VLAN 40SOC
Monitoring and investigation
Wazuh manager and indexerLogical model
GraylogLogical model
SOCFortress CoPilotLogical model
SplunkLogical model
VLAN 50DMZ
Public origins only
This journal: Caddy and cloudflared CT 410Confirmed tag
VLAN 60IOT_GUEST
Untrusted devices
No device yet: no access point or switch port tags itLogical model
What the model would need from the rules
MGMTTwingate, NetBird and the recovery tunnel make outbound connections to their cloud services. DROP_NEW_VLANS would drop them, so MGMT would need its own allow rule above it, scoped to those services.
MGMTThe connectors exist to reach the Proxmox and Sophos web UIs. If those stay on the legacy LAN, MGMT-to-LAN traffic crosses Sophos and needs a rule for TCP 8006 and 4444 only.
LAB_TESTWazuh agents on lab targets would report to the SOC VLAN, but DROP_LAB20_OUTBOUND drops everything leaving VLAN 20. Either an exception for the agent ports goes above it, which weakens the isolation, or collection happens inside LAB_TEST. I have not chosen yet.
SERVERSMoving the Minecraft container changes the source object in Allow_Minecraft_WireGuard; the rule has to follow it or the tunnel stops.
SERVERSEvery VLAN’s clients ask Sophos for DNS and Sophos forwards to the NextDNS container, so that path must stay allowed wherever the forwarder lives.
DMZCT 410 needs only DMZ_SITE_UPDATES outbound and no inbound rule from my other networks; the tunnel is outbound.
The VMs and containers on my Proxmox host, with the state each one was in when I recorded it on 8 November 2026. Wazuh appears once more from an earlier note.
Proxmox guests as recorded on 8 Nov 2026
ID
Type
Role
State when recorded
Note
100
LXC
template-lxc
Stopped on 8 Nov 2026
102
VM
Sophos Firewall
Running on 8 Nov 2026
201
LXC
Older Cloudflare Tunnel
Stopped on 8 Nov 2026
202
LXC
SafeLine
Stopped on 8 Nov 2026
tagged VLAN 20
203
LXC
Cloudflare Tunnel
Running on 8 Nov 2026
204
LXC
NetBird routing peer
Running on 8 Nov 2026
205
LXC
wazuh
Stopped on 8 Nov 2026
stopped on 1 Nov 2026; not listed on 8 Nov
206
LXC
BunkerWeb / private proxy
Running on 8 Nov 2026
proxy routes not verified
207
LXC
Minecraft and WireGuard tunnels
Running on 8 Nov 2026
208
LXC
Twingate connector
Running on 8 Nov 2026
209
LXC
NextDNS forwarder
Running on 8 Nov 2026
301
VM
Kali Red (exercise VM)
Stopped on 8 Nov 2026
302
VM
Kali Blue (exercise VM)
Stopped on 8 Nov 2026
410
LXC
homelab-journal (Caddy + cloudflared)
Running on 8 Nov 2026
VLAN 50 DMZ, confirmed; added after the 8 Nov record
Tools that live outside the guest list
These run on Windows machines, in the cloud, or in the SOC reference stack, so they have no Proxmox ID of their own. Each label says what my notes back up.
Cloudflare WAFWAF + tunnelIn use
Active DirectoryAD DS + GPOIn use
Windows endpointsdomain-joinedIn use
Defender for Endpointendpoint sensor · trialIn use