Adblock for your Tailnet with Pihole anywhere you go!
One Sentence Summary
How to set up Pi Hole behind TailNet for global ad-blocking, with per-client metrics and flexible deployment options.
Main Points
Use Pi Hole inside a VM or VM on Proxmox for TailNet DNS.
Pi Hole blocks ads at DNS level via known domain lists.
Static IP in DHCP is crucial for reliable Pi Hole access.
Upstream DNS can be Cloudflare; any provider works, based on comfort.
Enable Pi Hole DNS to listen on TailScale interfaces (expert mode, permit all origins).
Add Pi Hole as a TailNet device; optional DNS tag and ACL workflow.
Set a strong Pi Hole password for admin access.
Override TailScale DNS servers to route all queries through Pi Hole.
DNS queries map TailNet clients to specific TailScale IPs for visibility.
Alternatives exist (Adguard Home, Technitium) with pros/cons; Pi Hole remains proven.
Takeaways
Start with a simple Pi Hole VM setup and connect it to TailNet for global ad-blocking.
Ensure Pi Hole has a static IP within your LAN for stable DHCP mapping.
Use TailScale DNS override to force all devices to use your Pi Hole as the resolver.
Be aware of potential security trade-offs when enabling “permit all origins” in Pi Hole.
Consider alternative DNS blockers (Adguard Home, Technitium) for redundancy or clustering.
SUMMARY
This video shows how to deploy Pi-hole as a private, always-on DNS ad blocker for your Tailscale tailnet so every connected device gets ad-blocking anywhere. The main skill is installing Pi-hole on a Linux host (VM/physical/VPS), then configuring Pi-hole to accept requests over the Tailscale interface and setting it as a custom nameserver in the Tailscale admin console. The primary tools are Pi-hole (DNS sinkhole) and Tailscale (mesh VPN + centralized DNS configuration). (Tailscale)
A Linux server VM (the video uses Linux; examples imply Ubuntu).
Network access to the Pi-hole admin UI (local LAN).
A working Tailscale tailnet and access to the Tailscale admin console.
Step 1 — Create/choose the Pi-hole host and assign a static LAN IP
Create a VM (or pick hardware) that will act as your DNS node.
Assign it a static LAN IP (video example: 192.168.1.53).
Why this matters
Pi-hole must not change IP on your LAN, or devices won’t reliably find your DNS server.
Common mistakes
Leaving DHCP defaults → the Pi-hole IP changes after reboot and DNS breaks.
Choosing an IP that conflicts with another device.
Step 2 — Install Pi-hole on the host (SSH in)
SSH into the DNS node.
Run the Pi-hole installer (video says “copy one command from docs”).
Typical official install method is the Pi-hole installer script (commonly “curl pipe to bash”). This approach is widely used but has security tradeoffs; review before running. (GitHub)
During installer configuration
Confirm your server has a static IP (LAN).
Choose an upstream DNS provider (video picks Cloudflare).
Enable query logging (video chooses “Yes” to show metrics).
Keep default blocklists initially.
Common mistakes / challenges
Installing without sudo access.
Skipping the static-IP requirement.
Picking an upstream DNS provider you can’t reach due to firewall rules.
Step 3 — Log into the Pi-hole Admin UI
Open:
http://192.168.1.53/admin (replace with your LAN IP)
You should see the Pi-hole dashboard after installation.
Common mistakes
Using HTTPS when not configured.
Trying to access the UI from outside the LAN before routing is configured.
Step 4 — Install and connect Tailscale on the Pi-hole host
In the Tailscale admin console, go to Add device and generate the Linux install script.
Run the script on the Pi-hole host.
Verify:
tailscale status
Common mistakes
Forgetting to authenticate the node (device never appears in tailnet).
Installing Tailscale but leaving it disconnected/offline.
Step 5 — Set (or reset) the Pi-hole admin password
Pi-hole prints a password at install time. If you missed it, set a new one:
pihole -a -p
The video uses a “set password” command concept; the standard Pi-hole CLI uses pihole -a -p for password set.
Shell shortcut shown
sudo !! re-runs the previous command with sudo prepended.
Helpful when you forgot sudo.
Common mistakes
Trying to log in with the wrong password.
Not running the password command with required privileges.
Step 6 — Allow Pi-hole to listen on the Tailscale interface (critical)
By default, Pi-hole may only listen on the LAN interface. To accept DNS queries from tailnet devices:
Pi-hole Admin → Settings → DNS
Switch from Basic to Expert mode
Set listening behavior to Permit all origins (wording varies by Pi-hole version)
Why
Tailnet traffic arrives on the Tailscale interface, not your LAN interface.
Warning
“Permit all origins” can be risky on internet-exposed hosts. It’s safer when the machine is only reachable via LAN + Tailscale (no public DNS exposure).
Common mistakes
Forgetting this step → tailnet clients won’t resolve via Pi-hole.
Exposing the Pi-hole DNS port publicly on a VPS while permitting all origins.
Step 7 — Add Pi-hole as the tailnet DNS nameserver in Tailscale
In Tailscale admin console → DNS page. (Tailscale)
Under Nameservers, choose Add nameserver → Custom
Paste the Pi-hole Tailscale IP (not the 192.168.x.x LAN IP)
Save
Enable Override DNS servers (forces tailnet clients to use your Pi-hole)
Common mistakes
Using the LAN IP instead of the Tailscale IP.
Not enabling Override DNS servers → some clients keep using their prior DNS.
Step 8 — Refresh clients and validate traffic
Toggle Tailscale off/on on a client (forces it to fetch updated DNS config).
Run a DNS leak test or simply browse and watch the Pi-hole dashboard.
In Pi-hole, confirm queries appear and are attributed per client (tailnet IPs).
Common mistakes
Testing from a device not connected to Tailscale.
Client DNS caching makes it look like nothing changed—wait or flush DNS cache.
Step 9 (optional/advanced) — Lock down access with tags + ACLs
The video mentions tagging the DNS node (e.g., tag: dns) and using Tailscale ACLs so all devices can reach DNS while restricting other ports.
Use the Pi-hole host’s Tailscale IP for the tailnet nameserver, not the LAN IP.
Turn on Pi-hole query logging so you can verify ad-blocking and see per-client metrics immediately.
Enable Override DNS servers in Tailscale to avoid “some devices still using old DNS” confusion. (Tailscale)
If you run Pi-hole on a VPS, keep UDP/TCP 53 closed to the public internet; rely on Tailscale-only access.
For larger setups, consider tags + ACLs to guarantee DNS reachability while restricting Pi-hole admin ports. (Tailscale)
POTENTIAL LIMITATIONS / WARNINGS
Security risk: Pi-hole “Permit all origins” binds wider than LAN-only. Safe only if you’re not exposing DNS publicly.
Single point of failure: One Pi-hole node means DNS goes down if the VM/host goes down.
Tailnet-wide DNS override is broad: If you override DNS for the tailnet, it affects many devices; per-device granularity can be limited depending on your setup. (Workarounds include client-side configuration or policy patterns.)
Docker edge cases: Some containers/apps may behave oddly with overridden DNS; recent reports show interactions where Tailscale DNS override can affect internal name resolution in certain setups. (GitHub)
Performance/latency: When you’re traveling, DNS queries traverse the tailnet back home (or to your VPS). Usually fine, but it’s extra hops.
RECOMMENDED FOLLOW-UP RESOURCES
Tailscale DNS documentation (Nameservers, override, MagicDNS): (Tailscale)
Tailscale tags (group devices) and ACL/access control docs: (Tailscale)
Tailscale grant/policy examples (for DNS tag patterns): (Tailscale)
Technitium DNS Server (overview) + clustering explanation/releases: (technitium.com)
If you tell me where you’re running Pi-hole (Proxmox VM vs Raspberry Pi vs VPS), I can provide a hardened checklist (firewall rules, Tailscale ACL snippet, and a quick validation script).