What I wanted

Network-wide ad blocking and DNS visibility without punching holes in my firewall or overloading IoT devices.

The environment

  • pfSense as firewall/router
  • Multiple VLANs (LAN, SERVER, IoT)
  • Ubuntu server in SERVERNETWORK
  • Cloudflare used for external access, not DNS filtering

The approach

I decided Pi-hole should live in SERVERNETWORK, not IoT, and be treated as shared infrastructure rather than a “network accessory.”

pfSense remains the authority; Pi-hole provides visibility and filtering.

The setup

  • Pi-hole installed on the Ubuntu server
  • pfSense configured to forward DNS queries to Pi-hole
  • Conditional forwarding enabled so Pi-hole understands local hosts
  • No direct DNS access allowed from IoT to WAN

I avoided device-by-device DNS overrides.

What broke or surprised me

  • Some IoT devices fail silently when DNS responses are filtered
  • Not all “ads” are safe to block at the network layer
  • Network-level blocking has limits. Services like YouTube change often enough that complete blocking is unrealistic, even when overall ad volume goes down noticeably.
  • Visibility mattered more than blocking at first

What I’d do differently

Start with monitoring-only mode before aggressive blocking. Document allowlists earlier.

Where this fits in the system

Pi-hole sits between pfSense and clients as a filtering and observability layer. If it goes down, pfSense still routes traffic, so the network degrades more gracefully than a full outage.