Pi-hole / Troubleshooting
Pi-hole Installed but Clients Get No DNS Response
Separate clients bypassing Pi-hole from Pi-hole answering nothing by checking FTL state, a direct query, the upstream path, port 53 ownership, and the effective client resolver before any upstream or DHCP change.
The official Pi-hole command reference documents the diagnostic surface used on this page: status and query probes, the debugger, and the reloadlists and reloaddns subcommands. Notably, pihole reloaddns flushes and reloads the FTL DNS cache and does not re-read configuration files, so it cannot apply configuration edits.[1]
Two boundaries in this diagnosis come straight from official Pi-hole documentation rather than inference. The Docker Tips and Tricks page states that the systemd-resolved stub listener will prevent Pi-hole from listening on port 53, with a documented drop-in fix. The Post-Install page states that the network must be configured so DHCP clients use Pi-hole as their DNS server, offering the built-in DHCP server or manual per-device setup as alternatives.[2][3]
Applicability
- Products
- Pi-hole
- Scope
- For Pi-hole v6.x (Core, FTL, and Web with pihole.toml-based configuration, per the FTL Configuration Reference) on a bare-metal host or in Docker, where clients are expected to use Pi-hole as their DNS resolver but receive no answer. Version 5 paths are excluded and must be version-gated out wherever configuration differs. This page does not cover blocklist curation, web-interface-only failures with working DNS, or upstream-provider outages as the primary subject.[1][3][5]
- Last verified
Symptoms
Quick diagnosis
Separate clients bypassing Pi-hole from Pi-hole answering nothing by probing FTL, the direct query, the upstream path, port 53, and the effective client resolver.
Confirm Pi-hole FTL reports a running state
Use the documented pihole status probe to confirm the service state before any deeper check. Run it in the environment where Pi-hole executes: on the bare-metal host directly, or inside the Pi-hole container/runtime using the deployment's documented access method — never as a container command run on the Docker host shell. A stopped FTL explains every downstream symptom and must be handled before upstream, port, or client reasoning begins.[1]
pihole statusSend one direct query to Pi-hole and one past it
Run two probes in two different environments. First, from a client, query a test name at the Pi-hole address: this proves whether the client can reach Pi-hole. Second, from the Pi-hole runtime itself (the bare-metal host, or inside the Pi-hole container/runtime using the deployment's documented access method), query the same name at a configured upstream: this proves whether Pi-hole can reach the upstream. If the client-side Pi-hole query answers, the fault is in what clients use; if the client query is silent but the runtime-side upstream query answers, the fault is at the Pi-hole host level; if the runtime-side upstream query is also silent, the fault is upstream or in basic outbound connectivity.[1][4]
dig @<pihole-ip> <test-name>dig @<upstream-ip> <test-name>Do not change upstreams, resolvers, or DHCP before classification
Do not edit the upstream list, disable stub resolvers, or change DHCP-advertised DNS before the probes separate an FTL outage, a port conflict, an upstream failure, and a client bypass. A change made before classification can move every client at once without fixing the actual boundary.[1]
Interactive troubleshooter
Your answers stay in this browser tab. The tool does not connect to your systems or send diagnostic results.
Guided check / step 1
Safe diagnostic guidanceAre clients failing to get DNS answers they expect through Pi-hole?
Confirm the subject is missing DNS answers for clients that should use Pi-hole. A blocklist dispute, a web-interface problem with working DNS, or an upstream outage affecting everything equally is a different observation.[1]
Read the complete diagnostic tree without using the controls
- Are clients failing to get DNS answers they expect through Pi-hole?
Confirm the subject is missing DNS answers for clients that should use Pi-hole. A blocklist dispute, a web-interface problem with working DNS, or an upstream outage affecting everything equally is a different observation.[1]
- Yes, clients get no DNS answer → Does Pi-hole FTL report a running DNS state?
- No, a different observation → Investigate the actual DNS observation
- Does Pi-hole FTL report a running DNS state?
Use the documented status surface. A stopped service explains everything downstream and is handled first; only a running service continues to query-level reasoning.[1]
- Yes, FTL is running → Does a client-side query addressed to Pi-hole answer?
- No, the service is stopped → Return the stopped DNS service through documented control
- Cannot confirm the service state → Collect a Pi-hole DNS evidence packet
- Does a client-side query addressed to Pi-hole answer?
From a client, send one query straight at the Pi-hole address. An answer means the client can reach Pi-hole and the fault is in what the clients actually use; silence continues toward the Pi-hole-runtime upstream branch.[1]
- Yes, the client reaches Pi-hole and it answers → Do the failing clients actually use Pi-hole as their resolver?
- No answer from Pi-hole → Does a query from the Pi-hole runtime to an upstream answer?
- Probe result is unclear → Collect a Pi-hole DNS evidence packet
- Does a query from the Pi-hole runtime to an upstream answer?
From the Pi-hole runtime itself (the bare-metal host, or inside the Pi-hole container/runtime using the deployment's documented access method), query a configured upstream directly. An answer there isolates the fault to the Pi-hole host level; silence there points at the upstream path or basic outbound connectivity instead. A client-side upstream query does not prove this, because it runs in a different network context.[4]
- Yes, the runtime reaches the upstream → Does the documented stub resolver hold port 53 on this host?
- No, the upstream is silent from the runtime → Correct the unreachable upstream path
- Probe result is unclear → Collect a Pi-hole DNS evidence packet
- Does the documented stub resolver hold port 53 on this host?
Check which process owns port 53. This branch applies specifically to hosts running the systemd-resolved stub listener documented as preventing Pi-hole from binding port 53; other port owners need their own investigation.[2]
- Yes, the documented stub holds it → Free port 53 using the documented stub procedure
- No, port 53 ownership is fine → Collect a Pi-hole DNS evidence packet
- Cannot confirm port ownership → Collect a Pi-hole DNS evidence packet
- Do the failing clients actually use Pi-hole as their resolver?
Read the effective resolver on a failing client and the DHCP-advertised DNS. The official setup expects DHCP clients to use Pi-hole; clients with another resolver bypass it no matter how healthy it is.[3]
- No, they use another resolver → Direct the bypassing clients at Pi-hole
- Yes, they use Pi-hole and still fail → Collect a Pi-hole DNS evidence packet
- Cannot confirm the effective resolver → Collect a Pi-hole DNS evidence packet
- Return the stopped DNS service through documented control
Start the DNS service through the deployment's documented service control and re-run the status probe plus one direct query. Upstreams, ports, and clients do not change on this branch.[1]
- Correct the unreachable upstream path
Replace the failing upstreams with working documented options through the deployment's configuration surface, then verify with a direct upstream query followed by a direct Pi-hole query. Record the prior list for rollback.[4]
- Free port 53 using the documented stub procedure
Disable the stub listener with the documented drop-in, repoint the host resolver symlink, and restart the stub service exactly as documented. This branch never applies to hosts without that resolver.[2]
- Direct the bypassing clients at Pi-hole
Configure the router so DHCP clients use Pi-hole, enable the built-in DHCP server only after disabling DHCP on the router, or set individual devices manually as a last resort — after read-only proof of the bypass.[3]
- Investigate the actual DNS observation
A blocklist dispute needs allowlist and query-log investigation. A web-interface failure with working DNS needs web-server investigation. An everything-equally-down outage needs upstream and connectivity investigation.[1]
- Collect a Pi-hole DNS evidence packet
Preserve the release line, the FTL status output, both direct-probe results, the port 53 ownership, the effective client resolver with the DHCP advertisement, and the configured upstreams. Send the sanitized evidence to the operator; no documented branch remains.[1]
Detailed diagnosis
1. Establish whether FTL DNS is running
Confirm through the documented status surface whether pihole-FTL is running and serving DNS. A stopped service is the first branch and exits the deeper tree; only a running service continues to query-level reasoning.[1]
2. Compare the client-to-Pi-hole probe against the Pi-hole-runtime upstream probe
Run the two probes in their separate environments. The client-to-Pi-hole query proves the client can reach Pi-hole. The Pi-hole-runtime upstream query (run on the bare-metal host, or inside the Pi-hole container/runtime using the deployment's documented access method) proves Pi-hole can reach its upstream. Client queries answering while clients still fail points at client configuration; the client probe silent while the runtime upstream probe answers points at the Pi-hole host level; the runtime upstream probe also silent points upstream or at basic outbound connectivity.[1][4]
3. Check who owns port 53 on the Pi-hole host
When Pi-hole is silent but the upstream answers, check which process holds TCP and UDP port 53 on the host. The documented systemd-resolved case applies specifically to hosts running that stub resolver (notably Ubuntu and Fedora derivatives, including Docker hosts): its stub listener prevents Pi-hole from binding port 53. Do not generalize this branch to hosts without that resolver.[2]
4. Verify the resolver the failing client actually uses
When Pi-hole answers direct queries but clients still fail, read the effective resolver on a failing client and the DHCP-advertised DNS before changing anything. The official Post-Install page expects DHCP clients to use Pi-hole, with the built-in DHCP server or manual per-device setup as documented alternatives; prefer this read-only verification over editing DHCP first.[3]
Supported scenarios
These observations narrow the next investigation; they do not establish a unique cause.
pihole-FTL is not running or not serving DNS
With the DNS service stopped, every client query fails regardless of upstreams, ports, or client configuration. The documented status surface reports this state directly.[1]
How to check: Confirm the stopped state through the status probe before touching upstreams, ports, or clients.[1]
Another resolver holds port 53 on the Pi-hole host
The official Docker Tips and Tricks documentation states that the systemd-resolved stub listener prevents Pi-hole from listening on port 53, so queries never reach FTL even though the service may otherwise be healthy. This branch applies to the documented stub-resolver case, not to arbitrary port conflicts.[2]
How to check: Confirm which process holds port 53 and confirm the host runs the documented stub resolver before applying its documented fix.[2]
Pi-hole cannot complete recursion through its upstreams
Pi-hole forwards client queries to its configured upstream servers, chosen at setup from the documented provider options. When direct upstream queries also fail, or the configured upstreams are unreachable or wrong, Pi-hole has no complete answer to return.[4]
How to check: Confirm direct upstream queries fail or the configured upstream list is unreachable or incorrect, while Pi-hole itself is running and bound.[4][1]
Failing clients are not actually using Pi-hole
The official Post-Install documentation expects the network to direct DHCP clients to Pi-hole; clients with another advertised resolver, hardcoded device DNS, or encrypted-DNS bypass never send their queries to Pi-hole, so no Pi-hole-side fix can change their behavior.[3]
How to check: Read the effective resolver on a failing client and the DHCP-advertised DNS to confirm Pi-hole is absent before changing any network configuration.[3]
Next actions and procedure boundaries
Stopped FTL: return the DNS service through the deployment's documented control
If the status probe shows the service stopped, start it through the deployment's documented service control (system service on bare metal, container restart policy on Docker) and re-run the status probe plus one direct query. This corrects only a stopped service; it does not change upstreams, ports, or clients.[1]
Stale cache behavior: flush and reload the FTL DNS cache
Where the failure follows list or cache changes rather than a stopped service, flush and reload the FTL DNS cache with the documented pihole reloaddns subcommand, run in the environment where Pi-hole executes (on the bare-metal host, or inside the Pi-hole container/runtime using the deployment's documented access method). Note its documented limit: it does not re-read configuration files, so it cannot apply upstream or structural edits.[1]
pihole reloaddnsBroken upstream path: correct the configured upstreams
Replace the unreachable or incorrect upstream servers with working ones chosen from the documented upstream options, using the deployment's documented configuration surface (the FTL configuration reference documents the v6 config file format; apply edits through that surface), then verify with a Pi-hole-runtime upstream query followed by a client query to Pi-hole. Apply any required service handling only through the deployment's documented service control.[4][5][1]
Before changing anything
- Risk
- Changing upstreams alters name resolution for every client using Pi-hole. A wrong or unreachable replacement extends the outage to the whole network instead of fixing it.[4]
- Safer check
- Prove with direct queries that the current upstreams fail while Pi-hole is running and bound. Record the current upstream list before editing.[4][1]
- Expected result
- After the correction, direct upstream queries and direct Pi-hole queries both answer, and client queries resume without per-device workarounds.[4]
- Backup / recovery access
- Record the full prior upstream configuration so it can be restored exactly.[4]
- Rollback
- Restore the recorded prior upstream list if resolution does not recover, then re-run the paired direct probes before further changes.[4]
Stub-resolver conflict: free port 53 per the documented stub procedure
Only on hosts running the documented systemd-resolved stub listener that prevents Pi-hole from binding port 53: disable the stub listener with the documented drop-in, repoint the host resolver symlink as documented, and restart the stub service. This branch never applies to hosts without that resolver.[2]
sudo sh -c 'mkdir -p /etc/systemd/resolved.conf.d && printf "[Resolve]\nDNSStubListener=no\n" | tee /etc/systemd/resolved.conf.d/no-stub.conf'sudo sh -c 'rm -f /etc/resolv.conf && ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf'systemctl restart systemd-resolvedBefore changing anything
- Risk
- Reconfiguring the host resolver changes name resolution for the host itself. A wrong edit can leave the Pi-hole host without working DNS, which also blocks repair downloads and debug-log uploads.[2]
- Safer check
- Confirm the stub listener actually holds port 53 and confirm the host runs the documented resolver. Record the current resolver configuration before editing.[2]
- Expected result
- After the change, port 53 is free for Pi-hole to bind, the host still resolves names, and direct Pi-hole queries answer.[2]
- Backup / recovery access
- Record the prior stub configuration and resolver symlink target so both can be restored exactly.[2]
- Rollback
- Remove the drop-in, restore the prior resolver symlink, and restart the stub service to return the host to its recorded prior resolver state.[2]
Client bypass: direct clients at Pi-hole through documented setup
After read-only proof that failing clients use another resolver, direct them at Pi-hole using the documented Post-Install options in order: configure the router so DHCP clients use Pi-hole, or enable the built-in DHCP server after disabling DHCP on the router, or set individual devices manually as a last resort.[3]
Before changing anything
- Risk
- Changing DHCP-advertised DNS or enabling a second DHCP server affects every device on the network. Two active DHCP servers in particular can break addressing for all clients.[3]
- Safer check
- Prove with effective-resolver reads that the failing clients bypass Pi-hole. Record the current DHCP DNS advertisement and confirm exactly one DHCP server will remain active.[3]
- Expected result
- After the change, failing clients show Pi-hole as their effective resolver and their queries appear answered in Pi-hole.[3]
- Backup / recovery access
- Record the prior DHCP DNS advertisement and DHCP server assignment so the previous network configuration can be restored.[3]
- Rollback
- Restore the recorded prior DHCP DNS advertisement and server assignment if clients do not recover, then re-read the effective resolver before further changes.[3]
If no branch matches: preserve the evidence
Record the installed Pi-hole release line, the FTL status output, the paired direct-probe results, the port 53 ownership, the effective client resolver and DHCP advertisement, and the configured upstreams. Send the sanitized evidence to the operator; the official references describe no procedure for a failure outside these branches.[1]
Warnings and boundaries
Sources
Links were reviewed on 2026-09-07. Reachability and automated validation do not replace editorial verification of each claim.
- The pihole Command
Pi-hole · Tier A · accessed 2026-09-07 - Tips and Tricks (Docker)
Pi-hole · Tier A · accessed 2026-09-07 - Post-Install
Pi-hole · Tier A · accessed 2026-09-07 - Upstream DNS Providers
Pi-hole · Tier A · accessed 2026-09-07 - Pi-hole FTL Configuration Reference
Pi-hole · Tier A · accessed 2026-09-07