QNAME Minimization: The DNS Privacy Fix That Shipped

Every DNS server between you and a site used to see the full name you typed — even the ones that only needed the TLD. One resolver-side change fixed most of that, and unlike DNSSEC, it shipped without asking anyone's permission.

When you looked up payroll.internal.acme-corp.example, the root servers used to see the whole thing. So did the .example TLD operators. Neither of them needed it. The root server’s entire job in that transaction is to say “I don’t run .example, go ask these nameservers.” It could have answered that knowing only the word example. Instead, for about thirty years, resolvers handed the full name to every server they talked to on the way down.

That’s the part that always bothered me about classic DNS resolution. Not that it was insecure — that DNSSEC handles — but that it was needlessly chatty. A recursive resolver walking the delegation chain would send the complete query name to the root, then the complete name again to the TLD, then again to each authoritative server, even though every server except the last one only needed enough of the name to point at the next hop. You were telling the root operators and the TLD operators exactly what you were looking up, in full, for no operational reason whatsoever.

QNAME minimization is the fix, and the interesting thing about it isn’t the mechanism. It’s that the mechanism actually got deployed.

What the resolver stopped saying

The idea is almost embarrassingly simple. When a resolver walks the chain, it should send each server only the labels that server actually needs to give a referral — not the whole name.

So instead of asking the root for payroll.internal.acme-corp.example, the resolver asks the root only about example: give me the nameservers for that. The root points it at the .example servers. Now it asks those servers about acme-corp.example — one label longer, still not the full name. They point it at Acme’s nameservers. Only then, at the authoritative server that actually hosts the zone and is going to answer anyway, does the full payroll.internal.acme-corp.example get sent. The server that has to see it sees it. Everybody upstream sees only as much as their job requires.

Nothing about the wire format changes. Authoritative servers don’t have to do anything. Clients don’t have to do anything. It’s a change in how one piece of software — the recursive resolver in the middle — decides to phrase its questions. That property is the whole story, and I’ll come back to it.

It was written up as RFC 7816 in March 2016, by Stéphane Bortzmeyer, as an Experimental protocol. “Experimental” is IETF for “we think this is right but we want to see it survive contact with the real internet first.” It did not entirely survive on the first try.

The part that broke, and how they fixed it

The original spec’s strict interpretation was: to find the next delegation, query for the NS record at each intermediate name. Clean in theory. In practice, a depressing number of authoritative servers respond to a query for a name that exists only as an intermediate label — internal.acme-corp.example with no records of its own — by returning NXDOMAIN, “no such name,” instead of a referral. That answer is wrong. But DNS is full of servers that are confidently wrong, and a resolver that took the NXDOMAIN at face value would decide the whole lookup had failed and hand the user an error for a name that resolves perfectly well.

So the early strict mode had a real cost: turn it on, and some fraction of legitimate lookups broke against noncompliant servers. That’s exactly the kind of tax that kills adoption, because the resolver operator eats the support tickets while the privacy benefit is invisible.

RFC 9156, published in November 2021, is the grown-up version. It obsoletes 7816, moves the technique onto the Standards Track, and — critically — folds in a relaxed mode as the sensible default. Relaxed minimization still trims the name, but it uses query types and fallback behavior that tolerate the broken servers: if minimized queries aren’t getting sane answers, the resolver quietly falls back toward sending more of the name rather than failing the user. You keep most of the privacy and you stop generating outages. That trade — a little less purity for a lot less breakage — is what made the thing shippable.

It shipped because nobody had to agree

Here’s the number that matters. A measurement study out of SIDN Labs tracked how much of real DNS traffic was minimized: about 1.6% of queries in 2018, up to roughly 16% by 2022. Over the same window the count of open resolvers doing minimization went from around 18,000 to about 80,000. Not universal. But a tenfold jump in four years, quietly, with no marketing campaign and no compliance mandate.

Compare that to the graveyard of DNS security features. DNSSEC is past twenty years old and still validates a minority of the world’s lookups. DANE, MTA-STS, CAA — each solves a genuine problem, each has been available for years, each is deployed on a rounding error of domains. I’ve written before about why: those protocols demand coordination. DNSSEC needs the zone operator and the registrar and the resolver to all move together, and punishes a single mistake with a dead domain. MTA-STS needs both mail providers to care. When a security improvement requires two or more independent parties to act in concert, the internet’s answer is usually “no.”

QNAME minimization required exactly one party to act: the resolver operator. Not the domains being looked up, not the registrars, not the authoritative servers, not the end users, not the browser vendors. One operator flips one setting — or, better, ships a version where it’s on by default — and every query through that box gets more private, invisibly, for every user behind it. There’s no negotiation because there’s no counterparty. The authoritative side of the internet doesn’t even know it’s happening.

And so the resolver software just… did it. Unbound, BIND, Knot Resolver, and PowerDNS all implemented minimization and turned it on by default. Cloudflare’s 1.1.1.1 does full minimization. Google Public DNS does a partial version — it minimizes down to the TLD level rather than all the way — which is its own small lesson: even the “success” is uneven, and you can’t assume a given resolver protects you as much as the RFC allows. But the trajectory is the one DNSSEC never got: default-on, in the software everyone already runs, without a summit.

What it doesn’t do

Minimization is not encryption, and it’s worth being precise about that because the two get conflated. Your queries still travel in plaintext unless you’re using DNS-over-HTTPS or DNS-over-TLS. Anyone on the path between your resolver and the servers — the network in between, a curious middlebox — can still read what’s being asked. QNAME minimization doesn’t touch the transport. It reduces who learns what among the authoritative servers you’re forced to talk to, not whether the wire is readable.

It also doesn’t hide the full name from the server that actually answers. The authoritative nameserver for a zone still sees the complete query, because it has to — that’s the server resolving the name. If you don’t trust the operator of the zone you’re visiting to know you’re visiting it, minimization was never going to help; that’s a different problem with different tools. What it removes is the gratuitous leak to everyone else: the root, the TLD, every intermediate delegation that had no business knowing your full destination and got told anyway.

So it’s a partial fix. It pairs with DoH/DoT rather than replacing it — encryption hides the query from the path, minimization hides it from the bystander servers, and you want both. But “partial fix that actually got deployed” beats “complete fix that sat on a shelf for two decades,” and DNS has a long shelf of the latter.

The lesson I keep taking from this: the internet doesn’t reward the most elegant security design. It rewards the one that needs the fewest signatures. QNAME minimization asked permission from nobody, and that’s precisely why it’s in front of a sixth of the world’s DNS queries while protocols with better press are still waiting for everyone else to go first.

Continue the conversation

← Back to Blog