RFC 1035 supported
Domain names — implementation and specification. The DNS message format and UDP/TCP transport. Parsed zero-copy; malformed packets get FORMERR or are dropped cheaply.
For the technical audience
Status comes from one data file that the build checks against the project roadmap, so this page can't quietly drift from the code.
supportedpartialplannedRequirement IDs link to the specification.
25 supported · 1 partial · 1 planned
| RFC | Standard | Status | Requirements |
|---|---|---|---|
| RFC 1035 | Domain names — implementation and specification | supported | DNS-001 |
| RFC 2308 | Negative caching of DNS queries | supported | DNS-006 |
| RFC 4033 | DNSSEC introduction and requirements | supported | DNS-011 |
| RFC 4034 | Resource records for DNSSEC | supported | DNS-011 |
| RFC 4035 | Protocol modifications for DNSSEC | supported | DNS-011 |
| RFC 4343 | DNS case insensitivity clarification | supported | DNS-006 |
| RFC 5001 | DNS Name Server Identifier (NSID) option | supported | DNS-021 |
| RFC 5424 | The Syslog Protocol | supported | OBS-010 |
| RFC 5452 | Measures for making DNS more resilient against forged answers | supported | UPS-001 |
| RFC 6147 | DNS64 | supported | DNS-016 |
| RFC 6666 | A discard prefix for IPv6 (100::/64) | supported | FLT-017 |
| RFC 6761 | Special-use domain names | supported | DNS-019 |
| RFC 6762 | Multicast DNS (listening for device names) | supported | API-010 |
| RFC 6891 | Extension mechanisms for DNS (EDNS(0)) | supported | DNS-005 |
| RFC 7766 | DNS transport over TCP | supported | DNS-001 UPS-008 |
| RFC 7858 | DNS over TLS (DoT) | supported | UPS-001 DNS-002 |
| RFC 7871 | Client subnet in DNS queries (ECS) | supported | DNS-015 |
| RFC 8109 | Initializing a DNS resolver with priming queries | supported | DNS-012 |
| RFC 8482 | Minimal responses to ANY queries | supported | DNS-019 |
| RFC 8484 | DNS queries over HTTPS (DoH) | supported | UPS-001 DNS-003 |
| RFC 8767 | Serving stale data to improve DNS resiliency | supported | DNS-007 |
| RFC 8914 | Extended DNS Errors | supported | DNS-013 |
| RFC 9156 | QNAME minimization | supported | DNS-012 UPS-012 |
| RFC 9250 | DNS over dedicated QUIC (DoQ) | supported | DNS-004 UPS-002 |
| RFC 9520 | Negative caching of DNS resolution failures | supported | DNS-006 |
| RFC 8198 | Aggressive use of DNSSEC-validated cache | partial | DNS-011 |
| RFC 9462 | Discovery of designated resolvers (DDR) | planned | DNS-002 |
Domain names — implementation and specification. The DNS message format and UDP/TCP transport. Parsed zero-copy; malformed packets get FORMERR or are dropped cheaply.
Negative caching of DNS queries. "No such name" answers are cached for the SOA-derived time (capped), so repeated typos and tracker probes don't hit upstreams.
DNSSEC introduction and requirements. Forwarded and recursive answers are validated from the root key down (with [dnssec] mode = "validate"; the 2017 and 2024 root keys are built in, or a trust anchors file): secure answers get AD, unsigned ones pass as they are, and bogus ones become SERVFAIL with EDE 6, or 7, 8, or 10 when the signatures show why.
Resource records for DNSSEC. DNSKEY, DS, RRSIG, NSEC, and NSEC3 are understood and checked; they're removed from answers for clients that didn't ask for them (no DO bit).
Protocol modifications for DNSSEC. DO and CD toward upstreams, AD only for answers proven here and clients that asked, CD from the client returns unvalidated data, and NXDOMAIN or NODATA answers are checked against their NSEC/NSEC3 proofs.
DNS case insensitivity clarification. Names are compared case-insensitively, but each client's exact letter case (0x20 randomization) is echoed back, even from cache.
DNS Name Server Identifier (NSID) option. Off by default. Turned on, a query that asks for NSID learns which node or pod answered, handy behind a load balancer or a shared address; nobody else's answers change.
The Syslog Protocol. Query events to a syslog collector over UDP or TCP (RFC 6587 octet counting), one RFC 5424 message each with the event as JSON; notice severity for blocks.
Measures for making DNS more resilient against forged answers. Every upstream query uses a fresh random ID and source port; answers must match ID, question, and type exactly or they're ignored.
DNS64. Per group: AAAA made from A records in the NAT64 prefix (64:ff9b::/96 by default) when a name has no AAAA; CNAMEs kept; not for CD clients.
A discard prefix for IPv6 (100::/64). A Kubernetes workload counts in the analytics under one key, whichever pods ask: an address inside 100::/64, which is set aside for discarding traffic and never routes, so a key can't be mistaken for a real device. The query log keeps each pod's own address.
Special-use domain names. localhost answers with loopback, .invalid and the Firefox canary get NXDOMAIN, CHAOS queries are refused, and reverse lookups for private addresses (RFC 6303) stay local unless a route covers them.
Multicast DNS (listening for device names). Opt-in and listen-only: the <name>.local a device announces names it in the query log and the UI when you haven't named it. TelltaleDNS never sends mDNS and doesn't answer .local queries.
Extension mechanisms for DNS (EDNS(0)). Bigger UDP answers, the DO bit, and options. We advertise 1232 bytes (DNS Flag Day 2020), answer unknown versions with BADVERS, and never send OPT to clients that didn't.
DNS transport over TCP. Pipelined queries on one connection, answered in completion order; idle timeouts and connection caps. Upstream TCP/DoT connections are pooled and pipelined too.
DNS over TLS (DoT). Encrypted upstreams with certificate verification, SNI, and connection reuse, and a DoT listener for your devices (ALPN dot, pipelining, client IDs from the server name, certificates reloaded on renewal).
Client subnet in DNS queries (ECS). Never leaked: clients' ECS is stripped, and an upstream can be given a fixed subnet to send instead (cache-safe). Passing each client's own subnet through isn't supported.
Initializing a DNS resolver with priming queries. The recursive:// upstream asks the built-in root hints for the root's current servers once, then uses that list (renewed daily), so a root server's new address needs no new build.
Minimal responses to ANY queries. ANY gets a tiny synthesized HINFO answer instead of everything we know, which removes an amplification vector.
DNS queries over HTTPS (DoH). Encrypted upstreams over HTTP/2 with one multiplexed connection per server, and a DoH listener for your devices (HTTP/2 and HTTP/1.1, GET and POST, client IDs in the path, Cache-Control from the answer TTL).
Serving stale data to improve DNS resiliency. If upstreams are slow or down, an expired answer (up to a day old) is served with TTL 30 and EDE 3 while the refresh continues.
Extended DNS Errors. Every unusual answer says why: stale answer, blocked, not ready, no reachable upstream, overloaded.
QNAME minimization. The recursive:// upstream asks each server only for the next label (relaxed mode: a failed minimized query falls back to the full name), so the root sees `com`, not `www.example.com`.
DNS over dedicated QUIC (DoQ). QUIC transport for clients (a doq listener, UDP 853) and upstreams (quic:// URLs), one stream per query, 0-RTT off.
Negative caching of DNS resolution failures. SERVFAIL answers are cached for 5 seconds so a broken domain can't trigger a storm of retries.
Aggressive use of DNSSEC-validated cache. A validated NSEC denial proves a range of names absent: later questions inside it get a signed NXDOMAIN or NODATA without asking upstream (`[dnssec] aggressive_nsec`, on by default). Partial: NSEC only; NSEC3-signed zones still ask (ADR-092).
Discovery of designated resolvers (DDR). Let clients discover our encrypted endpoints automatically.