Network Configuration¶
Network Topology¶
flowchart LR
subgraph External
Internet((Internet))
DNS[DNS<br/>*.mdhmedia.uk]
end
subgraph DMZ
Caddy[Caddy<br/>Reverse Proxy]
WG[WireGuard<br/>192.168.1.236]
end
subgraph Internal
PVE1[Proxmox 1<br/>192.168.1.199]
PVE2[Proxmox 2<br/>192.168.1.151]
PVE3[Proxmox 3<br/>192.168.1.28]
Holly[Unraid<br/>192.168.1.200]
Docker1[Docker LXC CT 101<br/>192.168.1.241]
end
Internet --> DNS
DNS --> Caddy
Internet --> WG
Caddy --> PVE1
Caddy --> PVE2
Caddy --> Holly
Caddy --> Docker1
Host Uplinks¶
| Host | Uplink NIC | Speed | Notes |
|---|---|---|---|
pve1 (.199) |
enx3c18a0d4eddd — USB3 RTL8153 |
1 Gb/s | Sole uplink since 2026-07-28; onboard eno1 (10/100 RTL8106E, unplugged but working) split out of vmbr0 |
pve2 (.151) |
enp4s0f0 |
10 GbE | |
pve3 (.28) |
enp6s0 |
1 GbE | Also the wake-on-LAN target NIC (r8169) — see Proxmox |
pve1's 100 Mb mystery — solved 2026-07-28
pve1's USB NIC had been renegotiating at 100 Mb/s. The cause was a
wedged USB negotiation, not a bad cable — an xHCI reset restored the
full 1 Gb/s link. Boot remediation now guards against a recurrence:
restart-usb.service → usbup.sh → /usr/local/sbin/nic-link-up.sh
(NIC_EXPECTED_SPEED=1000, xHCI reset + force-gigabit retry). The onboard
eno1 — an unplugged 10/100 RTL8106E, working but slow — was split out of
vmbr0 the same day so it can never drag the bridge down to 100 Mb.
The link-guard tooling is version-controlled in the repo at
proxmox/network/:
nic-link-up.sh plus a templated nic-link-up@.service boot oneshot, enabled
for pve2's enp4s0f0 (expected 10 GbE) and pve3's enp6s0 (expected 1 GbE);
pve1 runs the script via its restart-usb.service chain above. A Prometheus
alert, NetworkLinkDegraded, fires whenever a physical link drops to
<=100 Mb (from the netclass collector's node_network_speed_bytes).
Reverse Proxy (Caddy)¶
Caddy runs as the main reverse proxy handling all external traffic for *.mdhmedia.uk.
Configuration Location¶
The Caddyfile is stored in this repository at edge/caddy/Caddyfile.
Features¶
- Automatic HTTPS with Let's Encrypt
- Log rotation (10MB, keep 5 files, 14 days)
- TLS termination for all services
Subdomain Routing¶
| Subdomain | Internal Target | Service |
|---|---|---|
| mdhmedia.uk | 192.168.1.241:3080 | Homepage (behind tinyauth SSO) |
| pve1.mdhmedia.uk | 192.168.1.199:8006 | Proxmox 1 |
| pve2.mdhmedia.uk | 192.168.1.151:8006 | Proxmox 2 |
| holly.mdhmedia.uk | 192.168.1.200:80 | Unraid |
| arcane.mdhmedia.uk | 192.168.1.241:3552 | Arcane |
Consolidation — 2026-07-20
The Arcane manager (was CT 100, 192.168.1.243) and Homepage (was CT 113,
192.168.1.242) now both run on the Docker LXC CT 101 (192.168.1.241); the two
old LXCs are retired (stopped, onboot=0, kept as rollbacks). Homepage sits on
host port 3080 because kicad already owns 3000 on CT 101.
DNS¶
DNS is managed externally with wildcard records pointing to the Caddy host.
WAN Throughput¶
RESOLVED 2026-07-08 — router-side fix applied
After correcting the 100BASE-T link at the router↔ONT handoff, a single-stream download from pve1 measures ~689 Mbit/s (previously ~92). Multi-stream tests should get closer to line rate. The diagnosis below is kept for reference.
Internet capped at ~94 Mbit/s on a 1 Gbit line (2026-07-07)
The Speedtest Tracker (on Holly) reports ~94 Mbit/s down and up, despite a YouFibre 1000 (symmetric ~1 Gbit) plan. Diagnosed as a 100BASE-T (Fast Ethernet) link at the router ↔ ONT handoff — not the homelab.
Evidence. Fresh Cloudflare pulls from three independent hosts all cap at the same ~92 Mbit/s, and every in-path NIC negotiates gigabit or better:
| Host | Path NIC | ethtool Speed |
Fresh pull |
|---|---|---|---|
Holly (.200) |
virtio → vmbr1 (enp4s0f0) |
10000 Mb/s | 91.9 Mbit/s |
pve2 (.151) |
eno1 (vmbr0) |
1000 Mb/s | 91.9 Mbit/s |
pve1 (.199) |
USB NIC enx3c18a0d4eddd (USB3) |
1000 Mb/s | 91.8 Mbit/s |
Three physically distinct gigabit/10-gig uplinks producing byte-identical ~92 Mbit/s means the bottleneck is a shared downstream 100 Mbit segment — the router's WAN port or the ONT↔router cable. The pve1 USB NIC (a common suspect) is exonerated: it's USB3-gigabit and isn't even in Holly's path. The pinned test server is also cleared (a direct Cloudflare pull matches).
Fix (at the router — nothing to change in the homelab):
- Check the router's WAN interface link speed — it should read
1000, not100. - Most likely a faulty/old ONT → router Ethernet cable (a single bad pair drops the link to 100 Mb/s) — reseat, then replace with known-good Cat5e/6.
- Or the router WAN/LAN port is forced/stuck at 100 Mb/s (or is a Fast-Ethernet-only port) — move to a gigabit port / clear any forced-speed setting.
- Re-run a speed test; expect ~900+ Mbit/s. All internal links are already gigabit+.
VPN (WireGuard)¶
WireGuard VPN server runs at 192.168.1.236 providing secure remote access to the homelab.
Access Points¶
| Service | URL | Port | Purpose |
|---|---|---|---|
| VPN Endpoint | wg.mdhmedia.uk | 51820/UDP | WireGuard tunnel |
| Admin Dashboard | wgadmin.mdhmedia.uk | 10086 | Peer management |
Network Configuration¶
| Setting | Value |
|---|---|
| Server IP | 192.168.1.236 |
| VPN Subnet | 10.8.0.0/24 (typical) |
| Listen Port | 51820 |
| Protocol | UDP |
Client Setup¶
Adding New Peers
Use the admin dashboard at wgadmin.mdhmedia.uk to:
- Create a new peer/client configuration
- Download the configuration file or scan QR code
- Import into WireGuard client on your device
Supported Clients¶
| Platform | Client |
|---|---|
| Windows | WireGuard for Windows |
| macOS | WireGuard for macOS |
| iOS | WireGuard for iOS |
| Android | WireGuard for Android |
| Linux | apt install wireguard or equivalent |
Split Tunnel vs Full Tunnel¶
Routing Options
- Split Tunnel: Only homelab traffic (192.168.1.0/24) routes through VPN
- Full Tunnel: All traffic routes through VPN (use
AllowedIPs = 0.0.0.0/0)
Split tunnel is recommended for better performance when only accessing local services.
Firewall Rules¶
Ensure the following ports are forwarded to the WireGuard server:
| Port | Protocol | Purpose |
|---|---|---|
| 51820 | UDP | WireGuard tunnel |
Troubleshooting¶
Connection Issues
- Verify UDP port 51820 is forwarded on your router
- Check that the endpoint hostname resolves correctly
- Ensure client private key matches server's peer public key
- Verify the AllowedIPs configuration on both ends
- Check firewall rules on the WireGuard container/host