← All writing

Pi-hole and the path of a DNS query

DNS filtering, local names and checking why a request was blocked.

I run Pi-hole on a Raspberry Pi to filter DNS queries and give local services readable names. My original configuration used Cloudflare’s 1.1.1.1 as the upstream resolver.

That means Pi-hole filters queries first, but permitted public queries still use a third-party DNS provider. It does not remove that provider from the path.

What filtering covers

Devices need to use Pi-hole as their resolver for its rules to apply. Applications using their own encrypted DNS can bypass that resolver choice. DNS filtering also cannot distinguish an advert from other content served from the same permitted domain.

I use it as one useful layer, rather than a guarantee that every advert or tracker is blocked.

Naming local services

For ordinary home DNS records, use a name under home.arpa, the domain designated for residential networks by RFC 8375. My earlier examples used .local, which is associated with multicast DNS.

Example records might be:

pi.home.arpa       192.168.1.100
nas.home.arpa      192.168.1.50
printer.home.arpa  192.168.1.75

These addresses are examples. Use the reserved addresses for your own devices, then test against the Pi-hole resolver explicitly:

nslookup pi.home.arpa 192.168.1.100

When something does not load

The query log is a useful starting point. Look for the relevant client and time, check whether a domain was blocked, then decide whether that specific domain should be allowed. Retest after clearing the client’s DNS cache.

A page failing to load is not automatically a DNS problem. If the name resolves correctly, the next checks are connectivity and the application itself.

Away from home

Tailscale can provide a path to the Pi, but using Pi-hole for remote DNS needs the appropriate DNS configuration and access rules too. Simply signing in to Tailscale does not select Pi-hole as every device’s resolver.

Back to writing