VenomousViper Labs
Portfolio Infrastructure
← Back to Infrastructure

Dedicated security host. Runs Wazuh SIEM/XDR and Velociraptor DFIR natively, with security, OSINT, identity, and utility services in Docker. Sits on the same LAN segment as home-serv.

Host

Hostnamesec-serv
OSUbuntu 26.04 LTS
HardwareGMKtec NucBox K6
CPUAMD Ryzen 7 7840HS
RAM32 GB DDR5
Storage1 TB NVMe — root LV extended to full disk, 837 GB usable
NICDual 2.5 Gbps, one in use
LAN10.0.4.110 (static, via netplan)
Container managementDockge, stacks under /home/jeremy/docker/stacks/
Wazuh4.14.6

Kernel tuning

Set permanently via /etc/sysctl.d/:

Journal timezone

This host logs in UTC; home-serv logs in local time (UTC−05:00). Correlating events across the two hosts requires accounting for the five-hour offset.


Network

Traffic flow

mermaid (diagram source)
flowchart LR
    LAN[LAN clients 10.0.4.0/24]
    TS[Tailscale clients]
    CF[Cloudflare edge]
    CFD[cloudflared daemon]
    SVC[sec-serv services]

    LAN -->|direct LAN| SVC
    TS -->|Tailscale mesh| SVC
    CF -->|outbound QUIC tunnel| CFD
    CFD --> SVC

Three access paths reach this host: direct LAN, the Tailscale mesh, and the Cloudflare tunnel. The tunnel is outbound-only — no ports are forwarded at the perimeter.

Mesh

sec-serv is a member of a four-machine Tailscale mesh alongside home-serv, jeremy-pc, and jeremy-lt.

Exposure tiers

TierBindingReach
1127.0.0.1localhost only — most Docker services
2via tunnelpublic through Cloudflare Tunnel
30.0.0.0LAN and Tailscale reachable — Wazuh components
4no host portinternal only

The majority of containerised services on this host bind to 127.0.0.1 and are reached exclusively through the tunnel. Wazuh components bind LAN-wide because agents connect over the local network.


Services

Security — native systemd

ServiceAccessPort
Wazuh dashboardLAN, Tailscale, tunnel0.0.0.0:5601
Wazuh indexerLAN-only0.0.0.0:9200
Wazuh managerLAN-only:1514:1515 agents, :55000 API
Filebeatinternalnone
Velociraptor serverLAN, Tailscale, tunnel0.0.0.0:8000 agents, 127.0.0.1:8889 admin HTTPS
Tor (tor@default)localhost127.0.0.1:9050 SOCKS

Wazuh is the SIEM/XDR plane. The indexer is OpenSearch 2.19.5 and stores all Wazuh data. The vulnerability-scanner module produces CVE data across all agent operating systems with a 60-minute feed interval. The inventory-harvester module ships package, process, network, hardware, service, browser-extension, user, group, hotfix, and protocol inventory into wazuh-states-inventory-* indexes.

Velociraptor is the DFIR and endpoint-hunting plane. Installed from a .deb package rather than Docker, with config at /etc/velociraptor/server.config.yaml. The admin GUI is tunnelled with noTLSVerify: true because it presents a self-signed certificate. Installer artifacts for client deployment — Linux .deb, Windows MSI, and raw binary — are kept at /home/jeremy/docker/stacks/velociraptor/.

Tor runs as a native systemd unit rather than inside any container, providing a SOCKS proxy for .onion reachability from SpiderFoot.

OSINT — Docker

ServiceHostnameHost portContainers
SpiderFootosint.lab.example127.0.0.1:5002spiderfoot
VIPERSHADOWshadow.lab.example127.0.0.1:8733 frontend, :8732 API, :4444 Selenium, :7900 noVNCvipershadow-frontend, vipershadow-backend, vipershadow-selenium
ViperScanviperscan.lab.example127.0.0.1:8740viperscan

SpiderFoot is built from source as the spiderfoot-local image, since the official Docker image is no longer publicly distributed. Source clone lives at stacks/spiderfoot/app/. It reaches .onion modules through the host Tor SOCKS proxy. Access is mediated at the tunnel edge — a documented risk acceptance rather than an application-layer control.

VIPERSHADOW is a dark web OSINT platform built in-house. Three containers: a FastAPI backend running Tor internally, an nginx frontend serving a built React/Vite application, and Selenium standalone-chromium for interactive handling of gated sites. Authentication is JWT-based. The stack is intentionally cold — started on demand through Dockge rather than running continuously.

ViperScan is an in-house scanning tool, single container, image built locally.

Endpoint management — Docker and native

ServiceHostnameHost portType
MeshCentral servermesh.lab.example127.0.0.1:8086Docker
MeshCentral host agentnoneNative systemd

MeshCentral serves plain HTTP in tlsOffload mode, with TLS terminated at the Cloudflare edge. This host runs both the MeshCentral server and a client agent enrolled against its own server.

Velociraptor provides a second endpoint-management plane alongside MeshCentral.

DNS filtering — Docker

ServiceHostnameHost portContainer
AdGuard Homeadguard-sec.lab.example127.0.0.1:3000 admin, 10.0.4.110:53 DNSadguard

Network-wide DNS ad and tracker filtering. The admin UI is tunnel-only; DNS binds to the LAN IP to serve local clients.

Password management — Docker

ServiceHostnameHost portContainer
Vaultwardenvault.lab.example127.0.0.1:8222vaultwarden

IT and utilities — Docker

ServiceHostnameHost portContainers
ViperToolstools.lab.example127.0.0.1:8083 main, :8001, :8002, :8004, :8081vipertools, vipertools-network-utils, vipertools-network-extra, vipertools-ws-bridge
Networking Toolboxnettools.lab.example127.0.0.1:8080networking-toolbox
web-checkwebcheck.lab.example127.0.0.1:8102web-check
Dozzledozzle.lab.example127.0.0.1:8890dozzle

ViperTools is an in-house developer, IT, and networking toolkit, four containers, image built locally.

Networking Toolbox provides offline networking utilities — DNS lookups, subnet math, TLS and HTTP diagnostics, port checks. Access is mediated at the tunnel edge rather than by application-layer authentication.

Dozzle runs in hub mode, aggregating container logs from both sec-serv and home-serv through the agent on home-serv port 7007.

Monitoring — Docker

ServiceHostnameHost portContainers
Beszel hubbeszel.lab.example127.0.0.1:8090beszel
Beszel agentinternalhost 45876beszel-agent (network_mode: host)
Scrutinyscrutiny.lab.example0.0.0.0:8084scrutiny, scrutiny-collector, scrutiny-influxdb

Beszel is the hub for both servers. Scrutiny aggregates SMART data from local drives and receives home-serv telemetry from a collector cron on that host.

Stack management — Docker

ServiceHostnameHost portContainer
Dockgedockge-sec.lab.example127.0.0.1:5001dockge-dockge-1

Backup — native, pushes to home-serv

ServiceTypeScheduleTarget
BBS agentbbs-agent.service01:00 daily, dispatched by BBSbackup.lab.example on home-serv
ReaR 2.9rear-backup.timer04:00 Sundaysrsync to /mnt/backup/rear/sec-serv on home-serv

BBS is the primary backup path. Repository sec-serv-daily covers /etc, /home/jeremy/docker/stacks, /var/ossec, and /var/lib/wazuh-indexer.

ReaR produces bare-metal recovery images using BACKUP=RSYNC. It runs as root, so it authenticates from /root/.ssh rather than the jeremy user's key material — the root public key is present in jeremy@home-serv:~/.ssh/authorized_keys.


Cloudflare tunnel routes

Catch-all rule: http_status:404.

HostnameTarget
adguard-sec.lab.examplehttp://localhost:3000
beszel.lab.examplehttp://localhost:8090
dockge-sec.lab.examplehttp://localhost:5001
dozzle.lab.examplehttp://localhost:8890
mesh.lab.examplehttp://localhost:8086
nettools.lab.examplehttp://localhost:8080
osint.lab.examplehttp://localhost:5002
scrutiny.lab.examplehttp://localhost:8084
shadow.lab.examplehttp://localhost:8733
tools.lab.examplehttp://localhost:8083
vault.lab.examplehttp://localhost:8222
viperscan.lab.examplehttp://localhost:8740
vraptor.lab.examplehttps://localhost:8889 (noTLSVerify: true)
wazuh.lab.examplehttp://localhost:5601
webcheck.lab.examplehttp://localhost:8102

Host port map

PortBindingProcessService
220.0.0.0sshdSSH — key authentication only
5310.0.4.110docker-proxyAdGuard Home DNS (TCP+UDP)
53127.0.0.53/.54systemd-resolveDNS stub
15140.0.0.0wazuh-remotedAgent event ingestion
15150.0.0.0wazuh-authdAgent enrollment
3000127.0.0.1docker-proxyAdGuard Home admin UI
4444127.0.0.1docker-proxySelenium WebDriver
5001127.0.0.1docker-proxyDockge
5002127.0.0.1docker-proxySpiderFoot
56010.0.0.0wazuh-dashboardWazuh dashboard
7900127.0.0.1docker-proxySelenium noVNC
80000.0.0.0velociraptorVelociraptor agent endpoint
8001127.0.0.1docker-proxyViperTools component
8002127.0.0.1docker-proxyViperTools network-utils
8004127.0.0.1docker-proxyViperTools network-extra
8080127.0.0.1docker-proxyNetworking Toolbox
8081127.0.0.1docker-proxyViperTools ws-bridge
8083127.0.0.1docker-proxyViperTools main UI
80840.0.0.0docker-proxyScrutiny
8086127.0.0.1docker-proxyMeshCentral
8090127.0.0.1docker-proxyBeszel hub
8102127.0.0.1docker-proxyweb-check
8222127.0.0.1docker-proxyVaultwarden
8732127.0.0.1docker-proxyVIPERSHADOW backend API
8733127.0.0.1docker-proxyVIPERSHADOW frontend
8740127.0.0.1docker-proxyViperScan
8889127.0.0.1velociraptorVelociraptor admin GUI (HTTPS)
8890127.0.0.1docker-proxyDozzle hub
9050127.0.0.1torTor SOCKS
92000.0.0.0wazuh-indexerIndexer REST API
20241127.0.0.1cloudflaredTunnel metrics
41641Tailscale iface, UDPtailscaledTailscale direct
550000.0.0.0wazuh-managerWazuh API

Compose projects

Stacks live under /home/jeremy/docker/stacks/, managed through Dockge.

adguard/              beszel/               dockge/
dozzle/               meshcentral/          networking-toolbox/
scrutiny/             spiderfoot/           vaultwarden/
velociraptor/         viperden/             vipershadow/
viperscan/            web-check/            it-tools/

Two directories do not match their container names, and should be resolved authoritatively rather than by inference:

bash
docker inspect <container> \
  --format '{{index .Config.Labels "com.docker.compose.project.working_dir"}}'

velociraptor/ is not a compose stack — it holds installer artifacts for client deployment. Wazuh and Velociraptor both run natively as systemd units and are not managed by Dockge.


Native systemd services

ServiceRolePort
cloudflaredTunnel daemonoutbound + 127.0.0.1:20241
docker, containerdDocker Enginesockets
tailscaledTailscale meshUDP :41641
wazuh-indexerOpenSearch 2.19.5 — Wazuh data store10.0.4.110:9200
wazuh-managerSIEM manager — agent data ingestion:1514, :1515, :55000
wazuh-dashboardWazuh web UI0.0.0.0:5601
filebeatShips manager logs to the indexeroutbound only
velociraptor_serverVelociraptor DFIR server0.0.0.0:8000, 127.0.0.1:8889
meshagentMeshCentral agent — enrolled with local serveroutbound only
tor@defaultTor SOCKS proxy for SpiderFoot127.0.0.1:9050
bbs-agentBorg Backup Server clientoutbound only
rear-backup.timerWeekly ReaR image push to home-serv
ssh.socketOpenSSH socket activator0.0.0.0:22
ufwFirewall

Wazuh agent deployment

Manager address selection follows endpoint mobility. Stationary endpoints — servers and desktops that never leave the network — connect over the LAN IP 10.0.4.110. Portable endpoints connect over the Tailscale IP so they continue reporting from any internet connection.

Five agents are enrolled across Ubuntu, Arch, and Windows 11, covering both servers and workstation endpoints.