DNS and DHCP are the two protocols that decide whether a device can do anything at all, and both are still mostly plaintext. That makes them the highest-value captures in a district: a ten-second trace answers questions that an hour of guessing will not.
DNS on the wire
A query is small and self-describing:
| Field | What it tells you |
|---|---|
| Transaction ID | Matches response to query; a reused ID with a different question is a retry |
| Flags | Query/response, recursion desired/available, authoritative |
| Question | Name, type, class |
| Answer | Records, TTL, and the address |
| RCODE | 0 no error, 2 SERVFAIL, 3 NXDOMAIN, 5 refused |
The RCODE is the diagnosis. NXDOMAIN means the name does not exist in the zone that answered. SERVFAIL means the resolver tried and failed — a broken delegation, DNSSEC validation, or an upstream problem. A timeout is not a DNS answer at all; it is silence.
Useful filters:
dns all DNS
dns.qry.name contains "marionisd" one namespace
dns.flags.rcode == 3 NXDOMAIN only
dns.time > 0.2 slow answers
dns.flags.truncated == 1 TCP fallback happened
Reading a DNS failure
- Did the query leave? If not, the client is misconfigured or the capture point is wrong.
- Did anything answer? No response means the resolver is unreachable or filtering silently.
- What was the RCODE? NXDOMAIN and SERVFAIL are different problems.
- How long did it take? 2 ms is a cache hit; 900 ms is a full recursion; 5 s is a timeout.
- Was it retried? The same question with a new ID, seconds apart, means the first answer never arrived.
A client that queries two resolvers in sequence is normal: the first timed out, and it moved to the second. That pattern tells you one resolver is broken even though the user saw a working page.
TCP fallback is a clue, not a failure
If a response has the truncated flag set, the resolver moved to TCP. That happens with large answers (DNSSEC, many records) or when a middlebox drops large UDP. Seeing it occasionally is normal; seeing it constantly suggests an MTU or firewall issue.
DHCP on the wire
The four packets carry more than an address:
| Packet | Key fields |
|---|---|
| Discover | Client MAC, requested options, optionally a requested address |
| Offer | Proposed address, server ID, lease time, options |
| Request | Which offer it accepted, server ID |
| Ack | Confirmed lease, all options |
A relay adds giaddr, the address of the interface the request arrived on. That field is how the server
chooses a scope, and it is the first thing to check when a new VLAN gets no addresses.
A NAK means the server is refusing: the client asked for an address on the wrong subnet, or the lease is no longer valid.
Two Offers for one Discover means two DHCP servers are alive on that segment. That is either a misconfigured failover pair or a rogue server, and the capture shows both server IDs.
Worked example: the 169.254 laptop
A staff laptop shows 169.254.12.9. Capture on the access switch uplink for 30 seconds:
10:22:01.004 client → broadcast DHCP Discover
10:22:04.010 client → broadcast DHCP Discover (retry)
10:22:10.021 client → broadcast DHCP Discover (retry)
No Offer. Three possibilities, in order of likelihood:
- No relay on the VLAN — the broadcast never reached a server.
- Scope exhausted — the server heard it and had nothing to give. (Then you would see nothing at the client, but the server log shows the request.)
- Server unreachable — relay configured, path broken.
The capture proves the client is asking correctly. The next step is on the gateway, not the laptop.
What breaks in production
- A capture filter of
port 53misses DNS over HTTPS, which is exactly the case you were investigating. - Capturing only the client side, so you cannot tell whether the resolver answered.
- Ignoring the relay address, then blaming the server for a scope that was never selected.
- Reading a retry as a second query, when it is the same question with a new transaction ID.
- Truncated captures that cut the answer section off, so the address is missing.
Checklist
- You read the RCODE before forming a theory.
- You check whether the query left and whether anything answered.
- You know which resolver the client used, and whether it was the intended one.
- You check
giaddron any DHCP capture from a relayed VLAN. - You look for two Offers, not just one.
- Your capture filter includes 443 when DoH is possible.
Next
The web is encrypted, but the handshake is not entirely. Continue with TLS and QUIC in a Capture.