164 lines
10 KiB
Markdown
164 lines
10 KiB
Markdown
# AdGuard Home official configuration review basis (2026-08)
|
|||
|
|
|
||
|
|
This page is the **official source basis and recommendation baseline** used
|
||
|
|
during the on-site review of AdGuard Home (AGH) on `192.168.66.36`. It does not
|
||
|
|
claim to have read that host's configuration and contains no credentials.
|
||
|
|
On-site conclusions must be based on the live `AdGuardHome.yaml`, OpenWrt
|
||
|
|
`dnsmasq`/DHCP, firewall, routing, and actual client leases.
|
||
|
|
|
||
|
|
Official sources (AdGuard only):
|
||
|
|
|
||
|
|
- [Configuration](https://adguard-dns.io/kb/adguard-home/configuration/)
|
||
|
|
- [Setting up AdGuard Home securely](https://adguard-dns.io/kb/adguard-home/running-securely/)
|
||
|
|
- [Getting started](https://adguard-dns.io/kb/adguard-home/getting-started/)
|
||
|
|
- [DHCP](https://adguard-dns.io/kb/adguard-home/dhcp/)
|
||
|
|
- [DNS encryption](https://adguard-dns.io/kb/adguard-home/encryption/)
|
||
|
|
|
||
|
|
## Recommended role split (for the existing OpenWrt gateway)
|
||
|
|
|
||
|
|
Preferred: keep **OpenWrt/dnsmasq as the single DHCP and local-domain
|
||
|
|
authority, with AGH as the LAN DNS filter/forwarder**: DHCP option 6 hands
|
||
|
|
clients `.36`; AGH sets the router's local DNS (usually the gateway LAN IP) as
|
||
|
|
`local_ptr_upstreams` and, where needed, uses domain-specific upstreams to route
|
||
|
|
the LAN search domain / local names back to dnsmasq. Clients are filtered while
|
||
|
|
still keeping DHCP lease names, static hosts, local reverse resolution, and
|
||
|
|
gateway-internal service discovery.
|
||
|
|
|
||
|
|
Rationale: AGH supports dnsmasq-style domain-specific upstreams for internal
|
||
|
|
private name servers; private PTR should be configured in **Private reverse DNS
|
||
|
|
servers** / `local_ptr_upstreams` rather than regular upstreams; when not
|
||
|
|
explicitly configured, it falls back to the OS default resolver, which shifts as
|
||
|
|
host networking changes. [Official config: domain-specific upstreams](https://adguard-dns.io/kb/adguard-home/configuration/#configuring-upstreams);
|
||
|
|
[private rDNS](https://adguard-dns.io/kb/adguard-home/configuration/#private-addresses).
|
||
|
|
|
||
|
|
Do not have OpenWrt dnsmasq and AGH both listen on `:53` at the same LAN IP;
|
||
|
|
port conflicts, or pointing dnsmasq's upstream at AGH while AGH points back at
|
||
|
|
dnsmasq, cause failures/forwarding loops. When AGH runs on a separate `.36`
|
||
|
|
host, the simplest topology is clients → AGH `.36:53` → public/encrypted
|
||
|
|
upstreams, forwarding only local resolution (PTR, LAN domain) → gateway dnsmasq.
|
||
|
|
This is an operational inference based on the official capabilities above and
|
||
|
|
must be validated against the live `ss -lntup`, dnsmasq config, and query path.
|
||
|
|
|
||
|
|
AGH also has built-in DHCP, but it should only be enabled after **disabling the
|
||
|
|
existing gateway DHCP, explicitly migrating leases/reservations and verifying
|
||
|
|
options 3/6**. The official docs describe it as an alternative when the router
|
||
|
|
cannot hand out custom DNS, not as a dual-DHCP setup; the DHCP docs also state
|
||
|
|
leases/static leases are managed by AGH. [Getting started: router DHCP/DNS
|
||
|
|
handout and alternative DHCP](https://adguard-dns.io/kb/adguard-home/getting-started/#router);
|
||
|
|
[DHCP configuration](https://adguard-dns.io/kb/adguard-home/dhcp/).
|
||
|
|
|
||
|
|
## Exposure and access control
|
||
|
|
|
||
|
|
1. `dns.bind_hosts` should bind only loopback and the actual LAN address (here
|
||
|
|
prefer `.36`'s LAN address); do not use `0.0.0.0`/public interfaces for a
|
||
|
|
home recursive resolver. The official docs note full-interface binding
|
||
|
|
exposes DDoS risk; a small isolated network should pick local service
|
||
|
|
interfaces and may add loopback alongside. [Secure deployment: server
|
||
|
|
addresses](https://adguard-dns.io/kb/adguard-home/running-securely/#choosing-server-addresses);
|
||
|
|
[`bind_hosts` definition](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
2. In the firewall, allow only managed LAN/VLAN → `.36` TCP/UDP 53; bind the web
|
||
|
|
admin UI to the management network/loopback and avoid WAN forwarding. At the
|
||
|
|
app layer, further restrict with `allowed_clients` to the local subnets; when
|
||
|
|
non-empty, only the CIDR/IP/ClientIDs in it are accepted, and it overrides
|
||
|
|
the effect of `disallowed_clients`. [Official access
|
||
|
|
control](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
3. Keep `refuse_any: true` and a non-zero `ratelimit` (default 20 qps), unless
|
||
|
|
on-site evidence shows the service can never be reached from the internet and
|
||
|
|
LAN high-concurrency needs are data-backed; the official docs list both as
|
||
|
|
protection against reflection/DDoS. [Configuration
|
||
|
|
notes](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
4. The web UI must have a user with login-failure lockout enabled;
|
||
|
|
`users: []` disables authentication, and `auth_attempts` or `block_auth_min`
|
||
|
|
of 0 disables the corresponding lockout logic. [Web/auth
|
||
|
|
parameters](https://adguard-dns.io/kb/adguard-home/configuration/#users).
|
||
|
|
|
||
|
|
## Upstreams, encryption, and DNSSEC
|
||
|
|
|
||
|
|
- Use two trusted, differently-networked DoH/DoT/DoQ upstreams for normal public
|
||
|
|
resolution; AGH supports these protocols and DNS Stamps. If an upstream
|
||
|
|
URL/hostname needs resolving, `bootstrap_dns` is its initial resolver; do not
|
||
|
|
point bootstrap at a name that requires AGH itself to resolve, and use
|
||
|
|
directly reachable, stable IPs. A `fallback_dns` can be set separately; it is
|
||
|
|
used only when primary upstreams do not respond. [Upstream protocols and
|
||
|
|
bootstrap/fallback](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
- If local IPv6's actual egress path is unstable, do not enable
|
||
|
|
`bootstrap_prefer_ipv6`; the official docs note it makes DoH/DoQ/DoT bootstrap
|
||
|
|
prefer IPv6. Decide on-site based on each upstream's IPv4/IPv6 reachability,
|
||
|
|
latency, and failure rate. [Same reference](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
- Consider enabling `enable_dnssec`, choosing recursive upstreams that actually
|
||
|
|
handle DNSSEC; but understand precisely: officially AGH sets the DO flag on
|
||
|
|
requests to upstreams; it does not perform recursive validation itself. On
|
||
|
|
site, query a known-bad-signature domain and observe AD/failure responses to
|
||
|
|
confirm upstream validation behavior. [DNSSEC parameter
|
||
|
|
definition](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
- Prefer `upstream_mode: load_balance` unless measurement shows `parallel` first
|
||
|
|
answer latency is clearly worth the privacy/traffic cost of querying all
|
||
|
|
upstreams. The former picks by failure rate and average latency weighting; the
|
||
|
|
latter queries all upstreams concurrently; this is an operational judgment
|
||
|
|
based on documented behavior. [Upstream
|
||
|
|
modes](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
|
||
|
|
## Cache, ECS, and privacy
|
||
|
|
|
||
|
|
- Keep DNS cache enabled; use `cache_ttl_min`/`cache_ttl_max` overrides
|
||
|
|
cautiously to avoid stale or unnecessarily short TTLs. `cache_optimistic`
|
||
|
|
answers with a 10-second TTL after expiry and attempts refresh — good for
|
||
|
|
low-latency scenarios that tolerate briefly stale results, not to be enabled
|
||
|
|
blindly on internal domains sensitive to immediate changes. [Cache
|
||
|
|
parameters](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
- ECS is off by default: when enabled, AGH adds EDNS Client Subnet to upstream
|
||
|
|
requests; if CDN geo-scheduling is truly needed, use `use_custom: true` with a
|
||
|
|
coarse, non-real-client-subnet `custom_ip`, then compare hit rate vs. privacy
|
||
|
|
impact. [ECS parameters](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
- Review log retention and who can read it. If device identity is not needed,
|
||
|
|
consider `anonymize_client_ip: true`; this anonymizes client addresses in logs
|
||
|
|
and stats. [Anonymization
|
||
|
|
parameter](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
|
||
|
|
## Proxy / OpenClash coexistence
|
||
|
|
|
||
|
|
If OpenClash/transparent proxy redirects DNS, validate hop by hop to ensure:
|
||
|
|
client DNS requests reach AGH uniquely; AGH's outbound traffic to public
|
||
|
|
encrypted upstreams is not hijacked back to AGH; and the router's local dnsmasq
|
||
|
|
PTR/local-domain requests return to dnsmasq. Create explicit proxy/hijack
|
||
|
|
exceptions for `.36` and its upstreams, or explicitly design the proxy to take
|
||
|
|
over AGH's outbound resolution; do not rely on "it seems to resolve" to conclude
|
||
|
|
there is no loop.
|
||
|
|
|
||
|
|
This is not an AGH-official OpenClash instruction (the official docs do not
|
||
|
|
maintain that integration), but an on-site verification requirement derived from
|
||
|
|
AGH's independent listening, upstream forwarding, and local-PTR-split
|
||
|
|
capabilities. The officially supported mechanisms are referenced at
|
||
|
|
[`bind_hosts`/upstreams/PTR](https://adguard-dns.io/kb/adguard-home/configuration/#dns).
|
||
|
|
|
||
|
|
If serving DoH via a reverse proxy, `trusted_proxies` must list only the actual
|
||
|
|
proxy IP/CIDR; AGH will only trust `X-Real-IP`, `X-Forwarded-For`, etc. from
|
||
|
|
those sources. Do not write the whole LAN/WAN for convenience;
|
||
|
|
`http.doh.insecure_enabled` should only be enabled when a reverse proxy really
|
||
|
|
terminates TLS in front. [Proxy and
|
||
|
|
DoH](https://adguard-dns.io/kb/adguard-home/configuration/#dns); [encrypted DNS
|
||
|
|
docs](https://adguard-dns.io/kb/adguard-home/encryption/). For a pure-LAN
|
||
|
|
plaintext-53 service, publishing DoH/DoT/DoQ outward is usually unnecessary.
|
||
|
|
|
||
|
|
## On-site review checklist (read-only)
|
||
|
|
|
||
|
|
1. Record the version, service method, and the full effective configuration
|
||
|
|
(secrets redacted); run the AGH config check. Officially provided via
|
||
|
|
`--check-config`. [Command-line
|
||
|
|
arguments](https://adguard-dns.io/kb/adguard-home/configuration/#command-line-arguments).
|
||
|
|
2. On `.36`, the gateway, and a wired/wireless client, record `ss` listeners,
|
||
|
|
DHCP option 6, default route, `/etc/config/dhcp`, and OpenClash
|
||
|
|
DNS/firewall-redirect rules.
|
||
|
|
3. From a client test: public A/AAAA, ad-rule hits, DHCP hostnames, forward LAN
|
||
|
|
domain, private PTR, DNSSEC bad-signature domain, and the expected failure
|
||
|
|
mode when AGH stops. Then check whether client IPs in AGH query logs are
|
||
|
|
still genuinely identifiable.
|
||
|
|
4. From the AGH host, test each upstream and bootstrap over the actual protocol
|
||
|
|
for IPv4 and IPv6 reachability; compare with transparent proxy on/off to rule
|
||
|
|
out loops and leaks.
|
||
|
|
5. Verify the web UI/DNS ports have no WAN exposure; confirm allowed clients and
|
||
|
|
firewall match actual LAN/VLAN, guest network, and VPN subnets.
|
||
|
|
|
||
|
|
Before changing anything, export the current configuration and DHCP/firewall
|
||
|
|
state; adjust one layer at a time (DHCP handout, AGH listening, upstreams, or
|
||
|
|
DNS hijack) and keep a known-good management and DNS fallback path.
|