Growing the infrastructure · Part 2 of 4

What my DNS logs can and cannot tell me

NextDNS gives the lab a resolver with a policy and a log of every query. I keep that log private because it reveals what my devices do, so this entry reads a simulated day honestly instead.

NextDNS sits in the lab as LXC 209, and it is the part of the stack that sees intent earliest. Before a machine opens a connection, it asks a resolver where to go. A DNS log is a record of those questions, which makes it useful, and also easy to over-read.

I keep my DNS requests private. A DNS log is a list of every name my devices looked up, so it shows which sites I browse, which apps check in with their servers, and when each device wakes up and goes quiet. Publishing it would publish my habits and my devices’ schedules along with it.

So I publish only aggregates I have approved and examples I built for the purpose. Everything you can filter below is simulated telemetry: one invented day, 7 November 2026 in UTC, built so every number on this site agrees with every other. The real capture stays in my private notebook.

How a query reaches the profile

A NextDNS profile is a policy with an ID: blocklists, allowed and denied domains, and logging settings. In my lab, ordinary clients ask Sophos, Sophos forwards to LXC 209, and LXC 209 runs the NextDNS CLI, which sends each query to the profile over DNS-over-HTTPS with client reporting on. The forwarder bootstraps with a separate plain resolver, so Sophos and the forwarder can never loop into each other. My Windows laptop also runs the NextDNS client directly, so its queries reach the profile without passing through the forwarder.

bashDNS container · root shellExample output · substituted names and addresses

When a query seems to vanish, I start at the forwarder: is it running, and which profile does it point at? Only then do I look at the profile's lists.

nextdns status && nextdns config
Show output
running
listen <forwarder-address>:53
profile ••••••
report-client-info true

Example output, with the address and profile ID removed. report-client-info is what lets the profile tag each query with the device that asked. The query log itself lives in the NextDNS dashboard, not on the forwarder.

A day of queries, simulated

Simulated telemetry · substituted names and addresses · 24 h · 7 Nov 2026, 00:00 to 24:00 UTC

Queries
4,164
Allowed
3,228
Blocked
936
Blocked share
22.5%
Queries per hour (UTC) · allowed blocked

Top domains

  1. updates.vendor.exampleallowed723
  2. cdn.assets.exampleallowed645
  3. login.idp.exampleallowed565
  4. api.game.exampleallowed403
  5. ads.tracker.exampleblocked349
  6. mail.provider.exampleallowed324

Destinations modelled estimate

Japan · 24.5%Philippines · 24.5%United States · 24.5%Singapore · 24.5%
Modelled share of destinations
Japan24.5%
Philippines24.5%
United States24.5%
Singapore24.5%
Elsewhere2%

Filter by client or domain and watch the totals and the hourly chart recompute from the same rows. The destination map is a modelled estimate: the four countries come from my notes, the even split between them is an assumption, and the table below it lists the same values.

Open the full lab console

What the log can tell me

  • Which device asked, and when. With the forwarder tagging clients, a burst of blocked queries points at one machine.
  • What the policy did. A block is the profile matching a list, which is a decision I can trace to a rule.
  • Changes in pattern. A workstation that suddenly asks for a newly registered domain is worth a closer look.

What it cannot tell me

  • That a connection happened. A blocked query means the name was not answered. It says nothing about a hard-coded address, a different resolver, or encrypted DNS that bypassed the forwarder.
  • Who the person was. A device tag is not an account. That is what the Windows logs and Active Directory are for.
  • Where traffic really went. A destination country inferred from resolved addresses is an estimate, which is why the map above is labelled modelled.

That last list is why DNS sits next to the firewall and the endpoint logs in my notes, not instead of them. It also cuts the other way: when a name fails to resolve, the answer may not come from the profile at all. The NOC case is one where Sophos answered NXDOMAIN on its own. When a DNS alert reaches the SOC queue, the next step is always to look for the matching connection, or its absence, in Sophos.

What I learned

A DNS log records questions, not connections. It is the earliest sign of intent I have, and the easiest one to over-read. Read on its own, a block proves the policy worked; it does not prove the device was stopped.

Takeaway: pair every DNS finding with one other source before calling it an event. For a block, that source is the firewall log for the same device and minute.

Further reading: NextDNS CLI wiki

Skills used

  • Reading DNS query logs
  • Separating what a log proves from what it suggests

All skills, grouped by what job postings ask for

Tools in this entry

Every tool and its documentation