Gauge Hartwell
← all write-ups

three short notes

Quick Hits: Three Smaller AdGuard Findings

Not every finding from standing up internal DNS needed a full investigation. These three are each a single clean cause, worth keeping on record even though none of them took long to resolve.

The setup wizard rejects its own just-set password

Set an admin username and password through AdGuard Home's first-run wizard at :3000, then immediately got "incorrect password" on the very next login attempt — despite confirming the credentials were typed correctly. Before assuming user error, checked whether this was a known behavior rather than guessing at a cause: multiple independent, unrelated reports describe the exact same symptom, including at least one confirmed via a password manager's autofill on both the setup and the failed login, ruling out a typo. A second login attempt with the identical credentials succeeded immediately. This appears to be a genuine timing quirk in AdGuard Home's first-login flow, not anything wrong with the install. Worth knowing before assuming a fresh install is broken: try the same credentials again before touching the config.

Two more UFW timeouts, same shape as before

The web UI (port 3000) and the actual DNS service (port 53, both TCP and UDP) both timed out from every host except the DNS server itself — the same "works locally, times out remotely" signature already diagnosed for the K3s VXLAN and DVWA NodePort bugs earlier in this build. Confirmed the service was genuinely listening and correctly bound in both cases (curl -sI http://localhost:3000, dig @127.0.0.1 <hostname>) before checking UFW — both times, the rule genuinely didn't exist yet, since nothing in the AdGuard install itself touches the firewall. Fixed by adding both ports to the host's ufw_allowed_ports list and re-running the play.

Worth naming directly: this is now the third distinct service in this build to hit this exact failure shape. A missing UFW rule on a fresh host isn't a fluke at this point — it's the default state, and checking for it should be step one whenever a brand-new service is unreachable from anywhere but itself.

Testing the wrong protocol entirely

Tried to verify port 53 was actually reachable from another host using chronyc -h <dns-ip> tracking — and got "cannot talk to daemon." That error wasn't a sign anything was broken; it was the wrong tool for the question. chronyc -h tests chrony's separate management protocol (port 323, disabled for remote hosts by default, for good reason), not the actual NTP service (port 123) the fix was meant to verify. Opening remote management access wasn't the fix, either — it would have been a real, unnecessary security exposure just to make a test pass. Switched to ntpdate -q <ip>, which speaks the real protocol, and got a clean, correct answer. Worth remembering: a tool returning an error doesn't always mean the thing under test is broken — sometimes it means the tool itself was never asking the right question.