2026-08-06 15:48:48 +08:00
|
|
|
# AdGuard Home health — dns.windy.lan
|
|
|
|
|
|
2026-08-17 15:59:00 +08:00
|
|
|
## Purpose
|
|
|
|
|
|
|
|
|
|
Read-only health check of the AdGuard Home LAN DNS service.
|
|
|
|
|
|
|
|
|
|
## Scope
|
|
|
|
|
|
|
|
|
|
- Applicable: [dns.windy.lan](../hosts/dns.windy.lan.md) (`192.168.66.36`).
|
|
|
|
|
- Read-only: does not expose query-log contents or secrets; does not change configuration.
|
|
|
|
|
|
2026-08-06 15:48:48 +08:00
|
|
|
This runbook is read-only. It does not expose query-log contents or secrets.
|
|
|
|
|
|
|
|
|
|
Routine checks run through Ansible on demand:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cd ansible
|
|
|
|
|
ansible-playbook playbooks/health-report.yml --limit adguardhome
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The same sanitized profile is installed as a daily server-local timer
|
|
|
|
|
(`vps-healthcheck.timer`, output at `/var/lib/vps-health/latest.json`) via
|
|
|
|
|
`playbooks/healthchecks.yml`; the manual checks below are for focused diagnosis.
|
|
|
|
|
|
|
|
|
|
## Verify service and configuration
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
ssh -4 -o BatchMode=yes windy@192.168.66.36
|
|
|
|
|
sudo docker ps --filter name=^/adguardhome$
|
|
|
|
|
sudo docker exec adguardhome /opt/adguardhome/AdGuardHome --check-config \
|
|
|
|
|
-c /opt/adguardhome/conf/AdGuardHome.yaml
|
|
|
|
|
sudo ss -lntup | grep -E '(:53|:80)'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Expected: DNS listens on TCP/UDP 53, and the HTTP UI listens only on
|
|
|
|
|
`192.168.66.36:80`.
|
|
|
|
|
|
|
|
|
|
## Verify DNS and storage
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
dig +time=5 +tries=1 @192.168.66.36 example.com A +noall +comments +answer
|
|
|
|
|
dig +time=5 +tries=1 @192.168.66.36 example.com AAAA +noall +comments +answer
|
|
|
|
|
dig +time=5 +tries=1 @192.168.66.36 hass.windy.lan A +noall +comments +answer
|
|
|
|
|
sudo docker logs --since 30m adguardhome 2>&1 | grep -Ei '\[(error|warn|fatal)\]|level=(error|warn|fatal)' || true
|
|
|
|
|
df -h /opt/adguardhome/work
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The host intentionally accepts DNS from LAN55 and LAN66. Do not infer a
|
|
|
|
|
broken DNS policy merely because `allowed_clients` is empty.
|
|
|
|
|
|
|
|
|
|
## Verify management UI boundary
|
|
|
|
|
|
|
|
|
|
From LAN66, the UI should return a login redirect:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
curl -sS -o /dev/null -w '%{http_code}\n' http://192.168.66.36/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
From a LAN55 source, TCP/80 should time out or be refused by the dedicated
|
|
|
|
|
`agh-ui-access.service` nftables rule. Do not alter this rule to restrict
|
|
|
|
|
port 53 without an explicit network-access review.
|
|
|
|
|
|
|
|
|
|
## DNSSEC and PTR caveats
|
|
|
|
|
|
|
|
|
|
DNSSEC is currently disabled. Before enabling it, select upstreams that pass
|
|
|
|
|
a known-bad-signature test; an enabled DO bit alone is not validation.
|
|
|
|
|
|
|
|
|
|
Private PTR forwarding is intentionally absent because the EdgeRouter does
|
|
|
|
|
not currently answer private PTR requests.
|
2026-08-17 15:59:00 +08:00
|
|
|
|
|
|
|
|
## Safety
|
|
|
|
|
|
|
|
|
|
- Read-only: never change the DNS policy or the `agh-ui-access.service` nftables rule during this check.
|
|
|
|
|
- Do not infer a broken DNS policy from an empty `allowed_clients`.
|
|
|
|
|
- If live state conflicts with an expected value, `STOP` and report.
|