RCVD: Introduction

RCVD (Resilient, Cryptographic, Verifiable DNS) is a privacy-first DNS engine: one static Go binary, encrypted transports only, and a hard guarantee that no query ever leaves the host in plaintext.

The problem

Getting private DNS on Linux, BSD, or macOS today means assembling a mosaic of single-purpose programs: a stub encryptor, a validating resolver, a blocklist proxy, a cache. Each brings its own configuration and its own failure modes — and, critically, its own willingness to fall back to plaintext DNS when an encrypted path fails. The resulting stack is hard to reason about, and none of the pieces gives you a first-class guarantee that a query left the host encrypted.

I wanted one tool that just does the right thing and never leaks.

What RCVD does

RCVD integrates, under one configuration:

The one non-negotiable principle

No query leaves the host in plaintext. If every configured encrypted transport fails, RCVD returns SERVFAIL — it never falls back to cleartext.

This is enforced at every error path, not offered as a configurable policy. It’s a deliberate divergence from RFC 9250 §5.2, which permits a DoQ client to fall back to DoT and then “potentially cleartext.” RCVD does the fall back to DoT and DoH — but never the fall back to cleartext. Port 53, when used at all, is silent or encrypted; it is never a plaintext egress.

Why an Admin wants this

If you’ve ever run tcpdump and watched DNS leak in plaintext despite thinking you had encryption configured, this is the tool that removes that class of problem. You get one ‘WireGuard-style’ binary, reuseable, deployment-specific config files, no runtime dependencies, and a guarantee you can actually verify — with built-in --verify-upstream, --audit, and --stats commands that report posture without ever recording what was queried.

That last point matters for a tool that has to answer to both users and auditors: you can prove the encryption posture is what you claim it is, without ever building the query log that would betray the people you’re supposed to be protecting. The same binary drops onto a laptop, a router, or a container the same way — copy it in, point it at a config, and it has no interpreter, no library tree, and no package manager to keep patched. On a busy resolver that stays healthy through upstream trouble on its own: a warm shared cache serves repeat lookups instantly, and if an encrypted upstream degrades it fails over to the next without a hiccup — and without ever quietly reaching for plaintext to “keep things working.”

Read more