Projects

First-Line Support Homelab

This is a small-business IT setup built from spare parts, the kind of environment a first-line technician works tickets on. I built it to practise that work: joining machines to a domain, resetting accounts, fixing permissions, pushing policy. What follows is a reflection on the build: the steps, the snags, and at the end, what I'd do differently if I built it again.

  • Proxmox
  • Windows Server 2022
  • Active Directory
  • DNS / DHCP
  • Group Policy
  • Networking

What I built

One Proxmox host, one Windows Server 2022 VM doing AD, DNS and DHCP, one domain-joined Windows 11 workstation, and an admin laptop on Wi-Fi with RSAT, which is where I actually sit.

Proxmox on its own box rather than VirtualBox on my desktop was a deliberate choice. I wanted the lab always on and managed from another machine, because that's how a real server is run. The cost was a harder install (the GTX 760 snag below) and a second PC that never gets switched off.

Homelab network diagramNetwork layout. The BT Hub at 192.168.1.254 is the gateway and the Wi-Fi. A wired unmanaged switch connects the Proxmox host (192.168.1.200) and the Windows workstation (192.168.1.170). The DCO1 VM (192.168.1.201, drawn dashed) runs inside the Proxmox host and serves AD, DNS and DHCP to the LAN. The admin laptop connects over Wi-Fi.Wi-FiBT Hub Router192.168.1.254Unmanaged SwitchProxmox Server192.168.1.200DCO1 · DC VM192.168.1.201Windows PC192.168.1.170Admin LaptopWi-Fi
Network layout. The BT Hub at 192.168.1.254 is the gateway and the Wi-Fi. A wired unmanaged switch connects the Proxmox host (192.168.1.200) and the Windows workstation (192.168.1.170). The DCO1 VM (192.168.1.201, drawn dashed) runs inside the Proxmox host and serves AD, DNS and DHCP to the LAN. The admin laptop connects over Wi-Fi.

The kit

Hypervisor host
Linux Mint PC → Proxmox · Intel i5 9th Gen · GTX 760 · 120GB Kingston SSD
Workstation
Windows 11 Home → Enterprise · wired via switch
Admin laptop
Windows 10 Pro · Wi-Fi · RSAT installed
Network
BT Hub router · unmanaged switch
Boot media
Kioxia 14.4GB USB running Ventoy

Bootable USB with Ventoy

One stick, every ISO. Ventoy boots whichever image you pick from a menu, so I'm not reflashing the USB for each new install.

  • Downloaded Ventoy 1.1.12 for Linux and identified the stick with lsblk (it came up as /dev/sdg, 14.4GB).
  • Unmounted it by device name (sudo umount /dev/sdg1) and ran sudo bash Ventoy2Disk.sh -i /dev/sdg.
  • Confirmed twice — all data on the USB was wiped — then it remounted as an empty exFAT drive.
  • Drag-and-dropped the Proxmox ISO onto the drive.

Snag: The stick showed 0B in lsblk, and umount by mount point failed.

Fix: Replugged it, then unmounted by device name (/dev/sdg1). Not much of a fix, but it was the first time I had to trust lsblk over the file manager.

Installing Proxmox on bare metal

I booted the PC from the Ventoy stick, picked the Proxmox ISO, and hit trouble almost immediately.

Snag: The installer kept hanging on driver loading because of the Nvidia GTX 760.

Fix: At the Proxmox boot menu I pressed 'e' and added nomodeset nouveau.modeset=0 usbcore.autosuspend=-1 to the linux line, then Ctrl+X to boot. nomodeset stops it loading Nvidia drivers; usbcore.autosuspend=-1 stops the USB dropping mid-boot.

Snag: The installer couldn't find the ISO on a USB 3.0 port.

Fix: Moved the stick to a USB 2.0 port and it found the ISO straight away. My best guess is the installer's early boot stage wasn't loading the USB 3.0 controller in time. I never confirmed that, and it's the kind of thing I'd want to ask someone who knows.

BIOS settings with Intel virtualization enabled
Enabled VT-x and VT-d in the BIOS — VT-x to run VMs, VT-d for PCIe/GPU passthrough later.
Proxmox installer network configuration screen
Proxmox installed cleanly once the boot flags were in, reachable at https://192.168.1.200:8006/.

Building the Windows Server VM

I uploaded the Windows Server 2022 Evaluation ISO and the VirtIO drivers ISO to Proxmox storage, checked the Server ISO's SHA256 against Microsoft's published hash, and built the VM that would become the domain controller. The sizing was a judgement call: the host has 6 cores and 16GB, so 3 cores and 6GB leaves room for a second VM. VirtIO for disk and network because it's faster than emulated hardware, at the price of Windows needing a driver before it can see its own disk. UEFI and a virtual TPM because that's what a modern Windows machine looks like, and I wanted the VM to match.

Name / ID
WinServer · VM 100
Machine
q35 · OVMF (UEFI) · TPM v2.0 · QEMU agent
Disk
VirtIO Block · 40GB · Discard on
CPU / RAM
3 cores, 1 socket · 6144 MB
Network
VirtIO (paravirtualized)
Proxmox create VM dialog
Creating the WinServer VM in Proxmox.
VirtIO drivers ISO attached as a second CD drive
A second CD drive holds the VirtIO ISO — Windows can't see the VirtIO disk without it.

Snag: The first install came up as Server Core, command line only. I'd clicked the top option without reading it.

Fix: Deleted the VM and reinstalled with 'Standard Evaluation (Desktop Experience)'. For a lab I wanted the consoles in front of me. In a real environment Core is the better choice for a domain controller (smaller attack surface, fewer patches) and you'd manage it from RSAT anyway, which is what the admin laptop does later on.

Snag: No drives showed up during install.

Fix: Clicked Load driver, browsed the VirtIO CD to viostor > amd64 > 2k22, and the 40GB disk appeared.

Configuring the server

After installing the VirtIO guest tools I renamed the server, gave it a static IP and corrected the time zone. The IP is 192.168.1.201, one above the DHCP range, so it can never be handed out to anything else. DNS points at the server itself, which Active Directory needs.

The router as backup DNS is a shortcut I wouldn't repeat. If the DC ever fell back to the Hub for DNS it would stop resolving homelab.local, and AD breaks in confusing ways when that happens. The right setup is the DC as the only DNS server, a forwarder in DNS Manager for internet names, and a second DC for resilience.

Hostname
DCO1
IP address
192.168.1.201 / 255.255.255.0
Gateway
192.168.1.254
DNS
127.0.0.1 (self), 192.168.1.254 (backup)
Time zone
(UTC+00:00) Dublin, Edinburgh, Lisbon, London

Snag: The hostname is DCO1, letter O, not DC01. I didn't notice until the domain was already up.

Fix: I left it. You can rename a domain controller after promotion, but it touches DNS records and Kerberos and it isn't something to do casually. For a lab, the lesson was worth more than the tidy name: check the hostname before you promote. It's DCO1 everywhere on this page on purpose.

Active Directory

New forest, root domain homelab.local. That name is what every tutorial uses and what I'd avoid next time: .local collides with mDNS on some devices, and you can't get a public certificate for it. Current advice is a subdomain of a domain you own, which for me would be something like ad.stanley-milbourne.com.

  • Added the Active Directory Domain Services role via Server Manager and pulled in the required features.
  • Promoted the server to a domain controller, adding a new forest with root domain homelab.local and a DSRM recovery password.
  • After the restart the login screen read HOMELAB\Administrator — the domain was live.

Users, OUs and groups

Two rules I followed from the start. Permissions go on groups, never on people, so when John leaves and Jane starts the only change is group membership. And Staff and IT are separate OUs so different policies can be linked to each later without touching the other.

  • Created users in Active Directory Users and Computers (e.g. John Smith, logon john.smith).
  • Made Staff and IT OUs and moved users into them.
  • Created a 'Helpdesk Team' global security group in the IT OU and added John Smith.
  • Practised the bread-and-butter tasks: resetting passwords, disabling and re-enabling accounts.
Active Directory Users and Computers console
Users organised into Staff and IT OUs.
Helpdesk Team security group properties
The Helpdesk Team security group.
Adding a user to the Helpdesk Team group
Adding John Smith as a member.

Shared folders and permissions

'I can't access the folder' is one of the most common tickets there is, so getting permissions right matters. Share permissions control access over the network, NTFS (Security) permissions control it at the file-system level.

When the two disagree, the most restrictive permission wins.

  • Created C:\SharedFiles with IT_Documents and Staff_Documents subfolders.
  • Shared the parent folder, removed Everyone and gave Domain Users Read.
  • On IT_Documents, granted the Helpdesk Team group Modify via the Security tab.
  • Result: everyone sees the share, but only the Helpdesk Team can edit IT_Documents.
NTFS security permissions on the IT_Documents folder
Helpdesk Team granted Modify on IT_Documents.

DHCP

The DC hands out 192.168.1.100 to .200 with the gateway, the DC as DNS and homelab.local as the parent domain, so a new machine on the switch comes up able to find the domain without anyone typing an address.

  • Added the DHCP Server role and authorised it with HOMELAB\Administrator.
  • Created the 'HomeLab Scope' over 192.168.1.100–200, mask 255.255.255.0.
  • Set scope options: gateway 192.168.1.254, DNS 192.168.1.201, parent domain homelab.local.
  • Activated the scope.
DHCP new scope wizard with the IP range
The HomeLab Scope handing out 192.168.1.100–200.

Snag: The BT Hub is still running its own DHCP server. I set the scope up on the DC and assumed the Hub's range sat above mine. I hadn't checked. BT hubs hand out roughly .64 to .253 by default, which overlaps my whole scope, and the Proxmox host at .200 is on the last address of my own range with no exclusion. Two DHCP servers on one LAN means whichever answers first wins. In an office that's a rogue-DHCP incident. It's the same problem as the domain-join snag further down: the Hub and the DC both trying to configure the PC, and the Hub winning.

Fix: Not yet. The plan is to turn DHCP off on the Hub so the DC is the only server, end the scope at .199 or add an exclusion for .200, then release and renew on the workstation and check with ipconfig /all that the lease came from 192.168.1.201.

Group Policy

Four GPOs: two a real domain needs on day one (password and lockout), one that proves policy reaches the PC in a way a user notices (the mapped drive), and one that proves it in a way they can't miss (the wallpaper).

  • Password policy: 8-character minimum, 90-day max age, complexity on, 5 passwords remembered.
  • Account lockout: 5 bad attempts, 30-minute lockout, 30-minute reset counter.
  • Mapped drive: a Group Policy Preference that maps S: to \\DCO1\SharedFiles at login. A preference rather than a logon script, because anyone can see and change it in GPMC without reading code.
  • Desktop wallpaper: pushes a company wallpaper from \\DCO1\Wallpapers, Fill style.

The password policy is the classic default and I'd change it now. NCSC guidance for years has been to stop forcing regular expiry, drop complexity rules, and rely on length plus lockout instead. If I rebuilt it: 12 characters minimum, no expiry, keep the 5-attempt lockout.

Group Policy Management console
The GPOs linked to homelab.local.
Password policy GPO settings
The password policy GPO.
Drive map preference in Group Policy
The S: drive-map preference.

Joining the workstation to the domain

This is the step everything builds towards: the PC joins the domain and starts behaving like a managed office machine. One catch first. It was on Windows 11 Home, which can't join a domain, so I changed the edition to Enterprise with changepk.exe /ProductKey. Pro would have done the same job and is what a business laptop normally has.

Snag: The PC wouldn't resolve homelab.local. The Hub was handing it a DNS server over IPv6, and Windows preferred that over the IPv4 DNS I'd set.

Fix: Set DNS to the DC (netsh interface ip set dns "Ethernet" static 192.168.1.201), then disabled IPv6 with DisabledComponents 0xFF under Tcpip6\Parameters, and rebooted. That's the blunt fix. Microsoft advises against turning IPv6 off entirely; the gentler options are 0x20, which makes Windows prefer IPv4, or giving the DC as the IPv6 DNS server too. I wanted the join to work that evening. On a real network I'd ask before doing this.

  • Joined homelab.local via Settings > System > About > Domain or workgroup using HOMELAB\Administrator.
  • Logged in as HOMELAB\john.smith — the S: drive mapped and the company wallpaper applied automatically (GPOs working).
  • File permissions behaved correctly on the shared folders.
Windows domain join dialog
Joining the PC to homelab.local.
Successful domain login as john.smith
Logged in as HOMELAB\john.smith.

The admin laptop

The laptop is where the technician actually sits: you manage the whole domain from it, same as a real support job. I joined it over Wi-Fi (DNS pointed at the DC, IPv6 off), logged in as the domain admin, and installed RSAT. Logging in as Domain Admin on a laptop is lab behaviour. At work you'd have a separate admin account and only use it for admin tasks.

  • Installed RSAT via PowerShell: Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online.
  • That brought in AD Users and Computers, DNS, DHCP and Group Policy Management.
Installing RSAT tools via PowerShell
Installing RSAT so the laptop can manage the domain remotely.

Day to day, from this laptop:

  • Reset passwords and unlock accounts after failed logins.
  • Disable / enable accounts for starters and leavers.
  • Add users to security groups to grant access.
  • Troubleshoot mapped drives (gpresult /r) and file permission issues.
  • Check DHCP leases and chase DNS problems (nslookup, ipconfig /flushdns).
  • Force policy with gpupdate /force and remote into workstations.
nslookup output resolving the domain
Verifying DNS resolution with nslookup.

What I'd do better if I built it again

Most of these are mentioned where they happened. Here they are in one place, in the order I'd fix them.

  • DNS: make the DC the only DNS server, with a forwarder in DNS Manager for internet names, and add a second DC. No router as backup.
  • DHCP: turn the Hub's DHCP off before creating the scope, and end the scope at .199 so the Proxmox host at .200 sits outside it.
  • Hostname: check it before promoting the domain controller. DC01, not DCO1.
  • Domain name: a subdomain of a domain I own, like ad.stanley-milbourne.com, instead of homelab.local.
  • Password policy: follow the NCSC guidance. 12 characters minimum, no forced expiry, no complexity rules, keep the 5-attempt lockout.
  • Server Core for the domain controller, managed from RSAT on the laptop, instead of the full desktop.
  • IPv6: leave it on and make Windows prefer IPv4 (DisabledComponents 0x20), or hand out the DC as the IPv6 DNS server, instead of switching it off entirely.
  • Admin account: a separate account for admin work, instead of logging in as Domain Admin day to day.
  • Workstation edition: Pro rather than Enterprise, because that's what a business PC would have.

This is as far as one person and a box of spare parts gets. What I haven't done is any of it with real users, a ticket queue, change control, or someone checking my work before it goes live. That's what I want an apprenticeship for.