Skip to main content

My InfoSec HomeLab

Isolated Security Homelab on Proxmox — Build Guide

Updated 12 min readMarkdown
Part of seriesProjects
My InfoSec HomeLab

Purpose

A small, fully isolated lab for practising both sides of security: attacking deliberately vulnerable targets (Metasploitable 2, OWASP Juice Shop, DVWA, later Active Directory) and detecting those attacks with a SIEM (Wazuh) and Windows endpoint logging (Sysmon). It is built so that nothing vulnerable can ever reach the home network or the internet.

Architecture

Host VM ID OS Role vCPU / RAM / Disk IP
OPNsense-FW2 100 OPNsense 26.7 Firewall / router, DHCP + DNS for the lab 2 / 4 GB (no ballooning) / 32 GB WAN 192.168.178.147, LAN 10.10.10.1
metasploitable 101 Metasploitable 2 (Ubuntu 8.04) Vulnerable network target 1 / 1 GB / 8 GB 10.10.10.55
wazuh 102 Ubuntu 24.04.5 + Docker SIEM: Wazuh 4.14.8 single-node (indexer, manager, dashboard) 2 / 6 GB / 60 GB 10.10.10.20
dockers 103 Ubuntu 24.04.5 + Docker Vulnerable web apps: Juice Shop :3000, DVWA :8080 2 / 4 GB / 40 GB 10.10.10.30
WIN11 104 Windows 11 Enterprise Evaluation Endpoint for detection (Sysmon + Wazuh agent), later domain workstation 2 / 4 GB / 60 GB (UEFI + TPM 2.0) 10.10.10.40
DC01 (Day 18) 105 Windows Server 2022 Evaluation Domain controller for corp.lab 2 / 4 GB / 60 GB 10.10.10.10
Kali — Kali Linux on a ThinkPad (physical) Attacker / admin workstation — home network (DHCP)

Prerequisites

  • Hardware: mini PC with AMD Ryzen 5 7640HS (6 cores / 12 threads), 32 GB DDR5, 512 GB NVMe, two 2.5 GbE ports. Hypervisor: Proxmox VE 9 on ext4.

  • ISOs (all official, free):

    • Proxmox VE 9 — proxmox.com

    • OPNsense 26.7 (DVD image) — opnsense.org

    • Ubuntu Server 24.04.5 — releases.ubuntu.com

    • Metasploitable 2 — sourceforge.net/projects/metasploitable

    • Windows 11 Enterprise Evaluation (90 days) and Windows Server 2022 Evaluation (180 days) — Microsoft Evaluation Center

    • VirtIO drivers for Windows — fedorapeople.org (virtio-win.iso)

How the network works (in plain words)

The whole design rests on two virtual switches (Linux bridges) inside the Proxmox host:

Bridge Connected to Who sits on it Meaning
vmbr0 the physical port nic0 → FritzBox Proxmox itself (.11), OPNsense's WAN side "Outside": the normal home network
vmbr1 nothing physical (bridge-ports none) all lab VMs, OPNsense's LAN side, Proxmox (10.10.10.2) "Inside": the lab

Because vmbr1 has no cable to the outside, a lab VM physically cannot talk to the home network on its own. The only way out is through the OPNsense VM, which has one leg in each bridge, like a router with two cables. That makes OPNsense the single checkpoint for everything leaving the lab, and its firewall rules decide what passes.

Three traffic paths, step by step:

  1. Kali attacks a lab target (e.g. nmap 10.10.10.55)

    • Kali has a static route: "for 10.10.10.0/24, go via 192.168.178.11" (the Proxmox host).

    • Proxmox forwards the packet from vmbr0 into vmbr1 (IP forwarding on).

    • On the way in, Proxmox rewrites the source address to its own lab address 10.10.10.2 (an iptables MASQUERADE rule). Without this, the target would send its reply to its default gateway (OPNsense) instead of back to Proxmox, and the connection would break.

    • Side effect worth knowing for detection work: in the lab's logs (Wazuh, Sysmon, web logs), attacks from Kali show up as coming from 10.10.10.2, not from Kali's home IP.

    • This path doesn't touch OPNsense's firewall at all, so the isolation rules never get in Kali's way.

  2. A lab VM tries to reach the internet (e.g. malware on Metasploitable "phoning home")

    • The VM sends it to its gateway 10.10.10.1 (OPNsense) → OPNsense checks its LAN rules → rule 4 blocks and logs it. Nothing leaves.
  3. A lab VM needs updates (Windows Update, apt, Docker images)

    • Only while patching, rule 3 is switched on for the three update hosts (.20, .30, .40). OPNsense then NATs their traffic out through the FritzBox. Afterwards rule 3 goes off again.
20261016__proxmox_network.png

Proxmox System → Network: vmbr0 with port nic0, vmbr1 with no port.

Network isolation

OPNsense Firewall → Rules → LAN, evaluated top to bottom, first match wins:

# Action Source Destination Purpose
1 Pass LAN net LAN net Lab hosts may talk to each other (attacks, agents → Wazuh)
2 Pass LAN net This Firewall DNS, DHCP and the admin GUI on OPNsense itself
3 Pass (disabled by default) alias lab_update_hosts (.20, .30, .40) any Internet only while patching
4 Block + log LAN net any The isolation rule: blocks lab → internet and lab → home network

The two factory rules "Default allow LAN to any" (IPv4/IPv6) are disabled, not deleted. Their absence is what makes rule 4 effective.

Admin access to OPNsense goes through an SSH tunnel via the Proxmox host (ssh -L 4430:10.10.10.1:443 root@<proxmox>), so the firewall GUI is never exposed on the home network.

20261016__fwrules.png 20261016__liveviewblocked.png

Verified on 15–16 Oct 2026:

Test Expected Result
Metasploitable: ping 1.1.1.1 fails ✅ 100 % packet loss
Metasploitable: ping 192.168.178.1 (home router) fails ✅ 100 % packet loss
Docker VM with rule 3 off: curl -m 5 http://example.com times out ✅
Kali: nmap / browser to .55, .30:3000, .20 works ✅

Build steps

Detailed click-by-click guides live in the vault cheat sheets ([[proxmox-install]], [[opnsense-install]], [[metasploitable-install]], [[wazuh-install]], [[windows-install]], [[docker-host-install]]). The short version:

Step 1 — Proxmox host

BIOS: confirm 32 GB is detected, enable SVM (AMD virtualisation). Install Proxmox VE 9 on ext4 with a static address, switch to the no-subscription repository, fully upgrade. Then add the lab bridge to /etc/network/interfaces:

auto vmbr1
iface vmbr1 inet static
        address 10.10.10.2/24           # Proxmox's own address inside the lab
        bridge-ports none               # no physical port: the lab is cut off by design
        bridge-stp off
        bridge-fd 0
        # Let the host route between home network and lab (for Kali)
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        # Rewrite Kali's packets to 10.10.10.2 so lab replies come back the same way
        post-up iptables -t nat -A POSTROUTING -s 192.168.178.0/24 -o vmbr1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s 192.168.178.0/24 -o vmbr1 -j MASQUERADE
ifreload -a                              # apply without reboot
ip -br a                                 # vmbr1 shows 10.10.10.2/24

On Kali, a persistent route to the lab:

sudo ip route replace 10.10.10.0/24 via 192.168.178.11   # now
# plus /etc/network/if-up.d/lab-route so it survives reboots

Step 2 — OPNsense firewall (VM 100)

Two VirtIO NICs: net0 on vmbr0 (WAN, DHCP from the router, address pinned in the router), net1 on vmbr1 (LAN 10.10.10.1/24). Ballooning off (FreeBSD). Install to UFS, assign interfaces on the console, run the web wizard with "Block RFC1918 Private Networks" unticked on WAN (the WAN is a private network here). DHCP pool 10.10.10.100–200, so fixed server addresses stay outside it. Then the four rules above, an encrypted config backup (kept private), and a snapshot.

20261015__opnsense-dashboard.png

Step 3 — Metasploitable 2 (VM 101)

Not installed but imported: the VMware disk is downloaded on the Proxmox host and converted.

qm disk import 101 /root/Metasploitable2-Linux/Metasploitable.vmdk local-lvm   # VMware disk → Proxmox disk

Attached as IDE with an Intel E1000 NIC (the 2008 kernel has no VirtIO driver), on vmbr1 only, fixed IP 10.10.10.55, never started at boot.

Step 4 — Wazuh SIEM (VM 102)

Ubuntu Server 24.04 (no LVM, so the full 60 GB is usable), Docker from Ubuntu's own repositories (not the snap), then the official single-node deployment, pinned:

sudo sysctl -w vm.max_map_count=262144                         # the indexer (OpenSearch) refuses to start without it
git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.8  # pinned version, reproducible
cd wazuh-docker/single-node
sudo docker compose -f generate-indexer-certs.yml run --rm generator   # TLS certs between the components
sudo docker compose up -d                                              # indexer + manager + dashboard
20261015__wazuh-dashboard 1.png

Step 5 — Windows 11 endpoint (VM 104)

UEFI (OVMF) + EFI disk + virtual TPM 2.0 (Windows 11 requires both), VirtIO SCSI disk with the driver loaded during setup (vioscsi\w11\amd64), local account labadmin, then the VirtIO guest tools for network + guest agent. Static IP via PowerShell, renamed to WIN11 before any agent or domain join (Wazuh and AD key on the hostname), patched, updates paused, RDP enabled. Microsoft Defender stays on.

Step 6 — Vulnerable web apps (VM 103)

Same Ubuntu routine, then:

R="--restart unless-stopped"                                    # come back after reboots
sudo docker run -d $R --name juice-shop -p 3000:3000 bkimminich/juice-shop
sudo docker run -d $R --name dvwa -p 8080:80 vulnerables/web-dvwa
20261016__juiceshop 1.png 20261016__dvwa.png

Step 7 — Lock down and baseline

Switch rule 3 off, re-test isolation, new encrypted OPNsense backup, and a clean-baseline snapshot of every VM (disk only, no RAM; Windows shut down first). After each attack session: qm rollback <id> clean-baseline.

Deliberate misconfigurations (vulnerable labs only)

Misconfiguration Attack it enables How it was set
Metasploitable 2 as shipped (vsftpd 2.3.4 backdoor, weak services, default creds) Network exploitation practice Unmodified vendor image
DVWA security level low SQLi, XSS, command injection practice DVWA Security page
(Day 19) AD: Kerberoastable service account, weak passwords, ACL abuse AD attack chain Setup script, documented on [[Day-19]]

Validation checklist

  • [x] All hosts reachable inside the lab from Kali; the lab cannot reach the home network or the internet

  • [x] Isolation tested (pings + curl above), blocked attempts visible in the OPNsense live log

  • [ ] Logs from every agent visible in the SIEM (Day 2: Sysmon + Wazuh agent on WIN11)

  • [x] Snapshot clean-baseline taken for VMs 100–104

Troubleshooting log

Problem Cause Fix
Old mini PC: VMs killed (OOM), only ~7.7 GB of 16 GB usable; later stopped booting Never fully diagnosed (no-warranty import box) Replaced the hardware, rebuilt everything fresh from the guides
New host: only 25 GiB of 32 GB usable iGPU reserves 6 GB by default (dmesg: VRAM: 6144M) BIOS: UMA Frame Buffer 512M (pending); 25 GiB is enough until the DC is added
Host seemed "unreachable" after a reboot It was simply off: "Restore on AC Power Loss" disabled from the factory BIOS: Power On (pending)
OPNsense install: vm fault: pager read error, then boot from the half-installed disk ISO detached before the installer finished Re-attach the ISO, put the CD first in the boot order, reinstall
Lab DHCP pool changed to .41–.245 (overlapping fixed IPs) The OPNsense setup wizard rewrites the DHCP range Reset to .100–.200 after the wizard
Isolation test failed: Metasploitable reached the internet and the home router Rule 1's destination had silently stayed any instead of LAN net, so rule 1 allowed everything before rule 4 Corrected the destination, re-tested, retook backup + snapshot. Lesson: always test isolation, never assume it
Wazuh VM: Ubuntu mirror test failed, Live View showed rule 4 blocking .20 Alias lab_update_hosts was defined but not loaded (Diagnostics → Aliases empty) Save + Apply the alias again. Debugged via Live View + Diagnostics
SSH to Metasploitable refused Modern OpenSSH disables the 2008 box's key/kex algorithms -o HostKeyAlgorithms=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 (lab only)
Pasted command blocks broke Long lines wrapped; sudo's password prompt swallowed the following lines Short lines; run sudo -v before pasting
Ubuntu reboot hung on cdrom.mount ISO removed while the VM was running Harmless; reset the VM

Resource and cost notes

  • RAM at full load: OPNsense 4 + Wazuh 6 + Windows 4 + Docker 4 + Metasploitable 1 = 19 GB of 25 GiB usable. The DC (+4 GB, Day 18) needs the BIOS fix. Day to day, only OPNsense and Wazuh run permanently; the rest is started per task.

  • Disk: about 200 GB allocated of 512 GB (260 GB with the DC) (thin-provisioned on local-lvm, so real use is lower). A second NVMe only once local-lvm passes ~80 %.

  • Licences: everything free. Windows 11 Enterprise Evaluation installed 16 Oct 2026 → expires around 14 Jan 2027 (slmgr /rearm or rebuild). Windows Server 2022 Evaluation: 180 days from its install on Day 18.

  • Known limitation / next hardening step: the MASQUERADE rule lets any device on the home network that knows the route reach the lab, not only Kali. Restricting the source to Kali's address (with a DHCP reservation for Kali) would close that.

  • Hardware cost: mini PC ~€600 (one-off). Everything else is open source or evaluation licences.

About the author

  • 30 years in creative leadership (in the ad industry as a Creative Director) taught me one core skill: dissecting complex systems and finding the flaw before someone else does. My tech roots run back to 8-bit machine code on a C64 (yeah – 80s, baby!) Today, I’m combining that legacy hacker curiosity with modern threat detection and offensive security. BATTLE-TESTED LOGIC: Decades of high-pressure problem solving and systems analysis. HACKER MINDSET: I don't just follow playbooks; I reverse-engineer how the attack path actually works. CONTINOUS SKILL-UP: CompTIA Security+ certified (among other certs), building home labs, and constantly training for L1 ops to future Pentesting.