If you want a cheap homelab that can run real workloads, you can do it for about 500 bucks. A modern Ryzen Mini-PC with 32GB of RAM is enough to host a serious lab. You can run Linux servers, Docker, Kubernetes, security tooling, and full Windows environments.

To prove the point, we will push it hard.


1. The Build

This is the class of hardware that makes this possible.

  • Ryzen 7 Mini-PC
  • CPU: AMD Ryzen 7 7735HS
    • 8 cores, 16 threads
  • RAM: 32GB minimum
  • Storage: 1TB NVMe SSD
  • Cost: Roughly 450–550 USD depending on sales

This form factor is quiet, power efficient, and fast enough to matter.


2. Proxmox

Install Proxmox VE 8.x directly on the hardware.

Proxmox gives you:

  • KVM for Linux and Windows
  • LXC for lightweight services
  • Snapshots and backups
  • LVM-thin storage for copy-on-write disks

Out of the box, Proxmox splits storage:

  • Small root filesystem
  • Large LVM-thin pool called local-lvm

Repository Setup

If you are not using an enterprise subscription:

rm /etc/apt/sources.list.d/pve-enterprise.list

echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" \
> /etc/apt/sources.list.d/pve-no-subscription.list

apt update && apt upgrade -y

3. Ludus

Ludus is what turns Proxmox from “hypervisor” into “lab platform.”

Install it:

curl -s https://ludus.cloud/install | bash

On first run, Ludus asks where to store virtual machines.

  • Default: local
  • Correct choice: local-lvm

If you leave it on local, large labs will fail. Root does not have the space. local-lvm does.


4. Building Templates

Ludus uses Packer to build base images. Windows ISOs must already be uploaded to Proxmox.

Add templates:

ludus templates add -d win2016-server-x64
ludus templates add -d win2019-server-x64

Build them:

ludus templates build

On a 32GB system:

  • Build one template at a time.
  • Parallel builds will OOM the host.
  • Swap activity is expected.

5. GOAD

Now we stress the system.

GOAD deploys multiple Windows domain controllers, member servers, trusts, and attack paths. It is intentionally heavy.

Disk Space

GOAD checks for 120GB of free space on /.

On this system, the space is in local-lvm, not root.

Even with 800GB free, the install will fail.

Workaround

Edit the GOAD disk check.

nano ~/GOAD/goad/command/cmd.py

Change:

if free_disk_gb < min_disk_gb:

To:

if False:

This bypasses a root only check and allows disks to land in local-lvm, where the space actually exists.


6. Deploying GOAD

cd ~/GOAD
./goad.sh -p ludus

Inside GOAD:

set_lab GOAD
check
install

Expect:

  • Long install times
  • High memory pressure
  • Occasional retries during domain promotion

7. Add Kali to the GOAD Lab (Ludus-Managed)

Confirm the Kali template exists

ludus templates list | grep kali

You should see kali-x64-desktop-template with BUILT = TRUE.


Grab your GOAD user

python3 goad.py
status

Export the current GOAD range config

This gives you a local YAML you can edit.

ludus --user GOADUSER range config get -f goad_kali.yml

Edit goad_kali.yml and add the Kali VM block

Open the file:

nano goad_kali.yml

Append this at the bottom of the VM list:

- vm_name: "{{ range_id }}-kali"
  hostname: kali
  template: kali-x64-desktop-template
  vlan: 10
  ip_last_octet: 210
  ram_gb: 2
  cpus: 2
  linux: true

Notes:

  • VLAN 10 keeps Kali in the same network as the Windows hosts.
  • No network: rules needed for same-VLAN traffic.
  • 2GB RAM keeps a 32GB Proxmox host stable.

Save and exit.


Push the updated config back into Ludus

ludus --user <GOADUSER> range config set -f goad_kali.yml

Deploy only the VM layer

ludus --user <GOADUSER> range deploy -t vm-deploy

Watch the deployment logs

ludus --user <GOADUSER> range logs -f

Wait for a clean success.


8. Accessing the Lab with WireGuard

Ludus generates a WireGuard configuration automatically.

ludus user wireguard | tee lab.conf

Import it into your WireGuard client.

You now have routed access into the lab network for testing attacks.

SSH into Kali

ssh kali@10.3.10.210

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *