A Raspberry Pi running Pi-hole as the DNS server for my home network, filtering ads and trackers for every device before queries ever leave the LAN. It's the first service in my homelab and the one that taught me the most about DNS, DHCP, and troubleshooting infrastructure you actually depend on every day.
- Part of: my_home_lab
- Portfolio: uploadtigris.github.io
Pi-hole is a DNS sinkhole: it sits between every device on the network and the upstream resolvers, answering queries for ad/tracker domains with a dead end and forwarding everything else on. One box, configured once, cleans up browsing for every phone, laptop, and TV on the network — no per-device client needed.
- Network-wide ad and tracker blocking at the DNS layer
- Upstream resolution via Cloudflare (
1.1.1.1), with Google (8.8.8.8/8.8.4.4) as fallback - Block lists: StevenBlack's Unified Hosts list plus HaGeZi's Pro list (~170k+ additional domains)
- Query logging and the Pi-hole admin dashboard for visibility into what's being asked for
| Device | Raspberry Pi 2 Model B |
| OS | Debian Trixie (32-bit), headless |
| Connection | Wired Ethernet to the router for stability |
| Addressing | Static IP so every client can rely on it as DNS |
Full step-by-step build (imaging the SD card, enabling SSH, installing Pi-hole, setting the static IP, and pointing the router at it) is written up here: Pi-hole Setup Guide →
Pi-hole now lives in the Servers VLAN (October 2026). pfSense hands out its address as the DNS server on the Mgmt, Trusted, IoT and Servers networks, and the firewall forces Trusted and IoT through it by blocking DNS to anywhere else. Guest uses its own pfSense gateway for DNS and never touches Pi-hole. See network-segmentation-ids.
Running DNS for the whole house means when Pi-hole breaks, the internet "breaks" for everyone — which makes it a great teacher. Two real failures I diagnosed and wrote up as I went:
-
The DNS server that quietly stopped resolving. After a restart, the Pi came up on a new DHCP address instead of holding its static IP, which broke DNS network-wide — the tell was exactly one query per hour showing up in the logs. I tracked it down, pinned the address properly, and wrote up the fix. → LinkedIn write-up
-
The "404" that turned out to be a corrupted install. The admin console started returning a 404 and
apt upgradethrew package errors. I power-cycled, confirmed the Pi was reachable witharp -a, forced a filesystem check (sudo touch /forcefsck), and worked throughapt --fix-broken installanddpkg --configure -a. The root cause was a corrupted Pi-hole install, not a dying SD card, so reinstalling from the official script brought it back — no reflash needed. → LinkedIn write-up
Both are examples of how I document every fix: what broke, how I found it, what I changed, and what I'd watch next time.
| Path | What it holds |
|---|---|
README.md |
What it does and how it fits the network |
docs/01_setup-guide.md |
Full build: SD card, SSH, install, static IP, router DNS |
docs/02_reinstall-after-power-outage.md |
Rebuilding the Pi after a power outage |
images/ |
Screenshots |
# Find the Pi on the network (ping sweep, no port scan)
sudo nmap -sn 192.168.1.0/24
# Update Pi-hole
pihole -up
# Live-tail the DNS query log
pihole -t
# Set / reset the admin password
sudo pihole setpasswordAdmin dashboard: http://<pi-hole-ip>/admin
DNS · DHCP & static addressing · nmap · arp · SSH · Raspberry Pi ·
Linux (Debian) administration · troubleshooting & documentation