All checks passing Checked 3 minutes ago: 3 name servers on 6 addresses (IPv4 and IPv6), 5 zones, 5 transports.
The short version
Our zones (fated.org, pqpdf.com, stlweb.dev, pqcrypta.com and philibertsecurity.com) are served by 3 authoritative name servers running Knot DNS, each on IPv4 and IPv6. They answer over UDP, TCP, DNS over TLS, DNS over QUIC and DNS over HTTPS. Every encrypted transport negotiates a post-quantum key exchange built on ML-KEM (FIPS 203), with a classical curve beside it where the client offers that hybrid, which stock Knot cannot do: the servers run a build of Knot and GnuTLS made for it, patched where the upstream code fell short, with every patch listed below beside the digest of the binary it produced.
The zones are signed by a hidden signer that no resolver can reach. It hands each change to the public servers over authenticated, encrypted transfers, and each server checks the zone's digest and every signature before it serves a byte of it. The HTTP/3 scanner, which holds other people's name servers to RFC 9250, measures these first; a health check asks every address over every transport every five minutes; and the servers count what they answer. Every figure below comes from one of those three, with its source and time beneath it.
How it fits together
The hidden signer holds each zone's unsigned source and its DNSSEC private keys. It signs every change, adds a ZONEMD digest of the whole zone (RFC 8976), and sends each public server a NOTIFY. It runs as its own system user with its own key store, so a compromise of the public server that shares its host cannot read the keys, and it appears in no NS record: there is no address a resolver could ask it at.
The public servers hold only signed copies. Each transfer to a server on another host goes over DNS over QUIC and is authenticated twice: by a TSIG key belonging to that server alone, and by both ends' certificates, which must be issued by our own transfer CA and name the server they belong to, so one server's certificate does not pass as another's. The signer's transfer port is open in the firewall to those servers' addresses alone. Before serving a transfer, a server checks the zone digest and validates every signature, and refuses a zone that fails either. Each also polls the signer on a short interval, so a NOTIFY that is lost delays a change by minutes, not by the SOA refresh.
In the last seven days the signer served 27 transfers (9 over TCP and 18 over QUIC), 39.1 kB in all, after signing 10 times and sending 27 NOTIFYs, 8 of them in QUIC 0-RTT data.
Source: pqcrypta-dns-stats, from the signer's log ยท 23 Oct 2026, 20:31 UTC
Transports
Every address answers the same zones over every transport below. The availability and times are the health check's, asked from outside the servers' own loopback every five minutes; the query counts are the servers' own.
| Transport | Standard | Port | Key exchange | Answered | Median | p95 | Queries, 24 h |
|---|---|---|---|---|---|---|---|
| UDP | RFC 1035 | 53/udp | clear text | 99.97% | 0.9 ms | 2.9 ms | 20,259 |
| TCP | RFC 7766 | 53/tcp | clear text | 99.97% | 1.5 ms | 3.7 ms | 2,584 |
| DNS over TLS | RFC 7858 | 853/tcp | X25519-MLKEM768 | 99.98% | 8.1 ms | 25 ms | 257 |
| DNS over QUIC | RFC 9250 | 853/udp | X25519-MLKEM768 | 99.98% | 7.9 ms | 12 ms | 331 |
| DNS over HTTPS | RFC 8484 | 443/tcp, h2 + h3 | SECP384R1-MLKEM1024 | 100% | 12 ms | 20 ms | 449 |
Source: pqcrypta-dns-health (availability and times since 18 Oct 2026, 21:32 UTC, 1,434 runs; key exchange in the latest run), pqcrypta-dns-stats (queries; DNS over HTTPS: requests to the gateway) ยท 23 Oct 2026, 20:31 UTC
Per server
| Server | UDP | TCP | DNS over TLS | DNS over QUIC | DNS over HTTPS |
|---|---|---|---|---|---|
| ns1.pqcrypta.com | 0.3 ms 100% | 0.5 ms 100% | 9.4 ms 99.96% | 7.5 ms 99.96% | 13 ms 100% |
| ns2.pqcrypta.com | 1.3 ms 99.93% | 1.8 ms 99.93% | 7.7 ms 100% | 7.9 ms 100% | 11 ms 100% |
| ns3.pqcrypta.com | 1.1 ms 100% | 1.8 ms 100% | 8.1 ms 100% | 8.1 ms 100% | 12 ms 100% |
Median time to an answer, and the share of checks answered, both addresses of each server together.
DNS over HTTPS and discovery
Knot has no HTTP server, so DNS over HTTPS (RFC 8484) is served by the PQ Crypta Proxy on each
host, over HTTP/1.1, HTTP/2 and HTTP/3, with the proxy's post-quantum key exchange, ECH and rate
limits. Its gateway listens on loopback only and asks the name server on its own host over TCP, so
an answer of any size arrives whole. It forwards standard queries and answers anything else, a zone
transfer included, with REFUSED and Extended DNS Error 21 (Not Supported); it pads answers to a
multiple of 468 octets when the query asks (RFC 8467) and sets the HTTP cache lifetime from the
answer's TTLs. Its path is /dns-query and it
gives the name server 3,000 ms to answer.
Each server says which encrypted transports it serves in an SVCB record at
_dns.<its name> (RFC 9461), so a resolver can find them without probing:
_dns.ns1.pqcrypta.com. SVCB 1 ns1.pqcrypta.com. alpn=dot,doq,h2,h3 dohpath=/dns-query{?dns}
_dns.ns2.pqcrypta.com. SVCB 1 ns2.pqcrypta.com. alpn=dot,doq,h2,h3 dohpath=/dns-query{?dns}
_dns.ns3.pqcrypta.com. SVCB 1 ns3.pqcrypta.com. alpn=dot,doq,h2,h3 dohpath=/dns-query{?dns}
In the last 24 hours the gateways answered 449 requests: 397 over HTTP/2 and 52 over HTTP/3; 0 from clients other than our own monitors.
Source: pqcrypta-dns-stats (the proxies' access logs and [doh] configuration), pqcrypta-dns-health (discovery records as the signer publishes them) ยท 23 Oct 2026, 20:31 UTC
Post-quantum TLS, and the build that provides it
Stock Knot cannot negotiate a post-quantum key exchange: its TLS groups are written into the code
as classical curves, and the GnuTLS that Linux distributions ship has no ML-KEM. So the servers run
a build of Knot against GnuTLS built with leancrypto, which provides ML-KEM (FIPS 203). The build
writes a manifest of what went into it, and the collector checks the manifest against the
knotd installed on each host and the one actually running.
| Server | Knot | GnuTLS | leancrypto | Nettle | knotd matches manifest | Running the installed knotd |
|---|---|---|---|---|---|---|
| ns1.pqcrypta.com | 3.6.1 | 3.8.13 | 1.9.1 | 3.10.2 | yes | yes |
| ns2.pqcrypta.com | 3.6.1 | 3.8.13 | 1.9.1 | 3.10.2 | yes | yes |
| ns3.pqcrypta.com | 3.6.1 | 3.8.13 | 1.9.1 | 3.10.2 | yes | yes |
Every server runs the same knotd, SHA-256 5ada269312a2187eโฆ.
The patches
Built 23 Oct 2026, 18:37 UTC from Knot DNS 3.6.1, GnuTLS 3.8.13, leancrypto 1.9.1 and Nettle 3.10.2, with 7 patches:
gnutls-hybrid-group-selection.patchgnutls ยท SHA-256 bb2edc47a3b7โฆ- GnuTLS 3.8.13, as a server, never chose a hybrid group once the client also offered an elliptic curve: a "not offered" value of -1 won a MIN(), so no hybrid-capable client ever got one. Fixed, a server picks the hybrid group the client offers first.
gnutls-stek-retired-master.patchgnutls ยท SHA-256 e49f204cc680โฆ- A server may pass a retired session-ticket master key after the current one. The retired key only decrypts tickets it issued and never encrypts a new one, so the key can be replaced, and the old one erased, without dropping every resumption.
gnutls-anti-replay-window.patchgnutls ยท SHA-256 55f6e9345222โฆ- GnuTLS restarted its record of ClientHellos every anti-replay window, which rejected early data for every ticket issued before the restart: with steady traffic only tickets a few seconds old could use 0-RTT. The record now runs from start-up, bounded by its own expiry.
knot-pq-groups.patchknot ยท SHA-256 da0d5abb52f5โฆ- Knot's TLS groups were hard-coded classical. Hybrid post-quantum groups come first and, as a server, are preferred; as a client Knot sends key shares for its top two groups; and kdig's DNS over HTTPS uses the same priority as its DNS over TLS.
knot-early-data.patchknot ยท SHA-256 9ff255d68d6bโฆ- 0-RTT done safely, as a server and a client. Every ClientHello carrying early data is recorded for the anti-replay window, so a replay has its early data rejected (Knot's store recorded nothing). The ticket master key is replaced every ticket lifetime and erased one lifetime later, so a key taken from the process cannot decrypt old early data. An OPCODE other than QUERY or NOTIFY in early data is refused with Extended DNS Error 26, Too Early (RFC 9250 section 4.5).
knot-doq-conformance.patchknot ยท SHA-256 79797b66ff76โฆ- Defects the HTTP/3 scanner's DNS over QUIC checks found in Knot, run against these servers: a NEW_TOKEN token taken for a Retry token (every resumption failed connection-ID authentication); RFC 9250 4.3.3's protocol errors answered instead of closing with DOQ_PROTOCOL_ERROR; random message IDs on Knot's own requests over QUIC where 4.2.1 requires 0; a STREAM FIN in a frame of its own failing the connection; an answer queued on a stream the client had stopped, silencing the connection; no RESET_STREAM back on a client's (4.3.1); truncated, empty or overlong streams dropped silently; and a client's first connection ID not routed, which lost 0-RTT sent in a datagram of its own (RFC 9000 5.2).
knot-retry-scid.patchknot ยท SHA-256 2dc915c25114โฆ- After a Retry, Knot named its own newly chosen connection ID as retry_source_connection_id, where RFC 9000 7.3 requires the Retry's Source Connection ID, which every client checks: each connection after a Retry failed. ngtcp2 asks for a Retry whenever a ClientHello's later datagram arrives before its first, and a post-quantum ClientHello spans several, so a share of DoQ connections and of the transfers between our servers failed. Found from a capture of both ends; the HTTP/3 scanner's reordered-ClientHello check reproduces it against any DoQ server.
The build stops unless these pass, against the libraries it has just built: GnuTLS resume-with-retired-stek, GnuTLS tls13-early-data-window, GnuTLS tls13-early-data, GnuTLS tls13-early-data-neg, GnuTLS tls13-early-data-neg2, GnuTLS resume-with-previous-stek, GnuTLS resume-with-stek-expiration, GnuTLS session-tickets-ok and Knot test_tls_early_data.
Source: pqcrypta-dns-stats (each host's /opt/pqdns, its build manifest and the knotd process) ยท 23 Oct 2026, 20:31 UTC
What a client gets
| Server | Transport | TLS | Cipher | Key exchange (code point) | Certificate |
|---|---|---|---|---|---|
| ns1.pqcrypta.com | DNS over QUIC | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
X25519MLKEM768 (0x11EC) | publicly trusted |
| ns1.pqcrypta.com | DNS over TLS | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
X25519MLKEM768 (0x11EC) | publicly trusted |
| ns1.pqcrypta.com | DNS over HTTPS (h2) | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
MLKEM1024 (0x0202) | publicly trusted |
| ns1.pqcrypta.com | DNS over HTTPS (h3) | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
MLKEM1024 (0x0202) | publicly trusted |
| ns2.pqcrypta.com | DNS over QUIC | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
X25519MLKEM768 (0x11EC) | publicly trusted |
| ns2.pqcrypta.com | DNS over TLS | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
X25519MLKEM768 (0x11EC) | publicly trusted |
| ns2.pqcrypta.com | DNS over HTTPS (h2) | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
MLKEM1024 (0x0202) | publicly trusted |
| ns2.pqcrypta.com | DNS over HTTPS (h3) | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
MLKEM1024 (0x0202) | publicly trusted |
| ns3.pqcrypta.com | DNS over QUIC | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
X25519MLKEM768 (0x11EC) | publicly trusted |
| ns3.pqcrypta.com | DNS over TLS | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
X25519MLKEM768 (0x11EC) | publicly trusted |
| ns3.pqcrypta.com | DNS over HTTPS (h2) | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
MLKEM1024 (0x0202) | publicly trusted |
| ns3.pqcrypta.com | DNS over HTTPS (h3) | TLSv1.3 | TLS13_AES_256_GCM_SHA384 |
MLKEM1024 (0x0202) | publicly trusted |
The group a client gets depends on what it offers: the scanner's client offers ML-KEM on its own as well as the hybrids, and the proxy in front of DNS over HTTPS prefers the strongest post-quantum group offered, so the two can differ from the health check's, whose client offers only hybrids.
Source: the HTTP/3 scanner's latest scan of pqcrypta.com, probe 2026.10.23.2 ยท 23 Oct 2026, 20:28 UTC
DNS over QUIC and DNS over HTTPS, held to their RFCs
The HTTP/3 scanner puts every name server it meets through its conformance checks, each citing
the requirement it tests: up to 71 on a server that answers
every transport, 33 of them on DNS over QUIC and 14 on DNS over HTTPS.
Its catalogues map RFC 9250's 47 requirements and RFC 8484's 28 to the checks that cover them, to the rule its own client follows, or to why it cannot be seen from
outside a server. These servers are where every check was tried first, and where the defects in
Knot they found were fixed (the knot-doq-conformance.patch above).
| Server | Pass | Warn | Fail | Info | RFC 9250 met | RFC 8484 met | Resolver compatibility | Privacy |
|---|---|---|---|---|---|---|---|---|
| ns1.pqcrypta.com | 60 | 0 | 0 | 10 | 26 of 27 tested | 13 of 13 tested | 100% | 100% |
| ns2.pqcrypta.com | 61 | 0 | 0 | 10 | 27 of 27 tested | 13 of 13 tested | 100% | 100% |
| ns3.pqcrypta.com | 61 | 0 | 0 | 10 | 27 of 27 tested | 13 of 13 tested | 100% | 100% |
Of RFC 9250's requirements, 27 are tested against a server, 11 are rules the scanner's own client follows, and 9 cannot be observed from outside a server. Of RFC 8484's, 13, 11 and 4.
0-RTT, and how fast
A returning client can send its query in the first flight, before the handshake completes (0-RTT). RFC 9250 section 4.5 allows that for a query, since a replayed query only repeats an answer, and nothing that changes state. A QUERY in 0-RTT data: Accepted a QUERY in 0-RTT data and answered in 3 ms, against 4 ms with a full handshake. Section 4.5 permits it for QUERY, but early data can be replayed within the anti-replay window, letting an observer of a resolver's onward traffic confirm which name was asked (7.1): for zones whose lookups are sensitive, turning 0-RTT off on the name server removes that. Holds back an UPDATE sent in 0-RTT: Rejected this connection's 0-RTT data: the UPDATE waited for the handshake like the rest. Session tickets last long enough: Tickets last 6 h, at least the 6 hours section 5.5.3 suggests.
| Server | Full handshake | Query on an open connection | 8 at once | 0-RTT |
|---|---|---|---|---|
| ns1.pqcrypta.com | 6.9 ms p95 11 ms | 0.2 ms | 0.5 ms | 3.2 ms |
| ns2.pqcrypta.com | 6.1 ms p95 11 ms | 0.3 ms | 1.4 ms | 8.4 ms |
| ns3.pqcrypta.com | 6.2 ms p95 9.8 ms | 0.4 ms | 0.6 ms | 2.2 ms |
Medians from the scanner's single vantage point (US East (Virginia)), so they include the network path to each server.
Source: the HTTP/3 scanner's latest scan of pqcrypta.com (run it on any domain) ยท 23 Oct 2026, 20:28 UTC
DNSSEC
Every zone is signed with ECDSA P-256 with SHA-256 (algorithm 13). There is no post-quantum DNSSEC algorithm with an IANA number that validators implement yet, so the zones use one every validator must support. Denial of existence is NSEC3 with no extra iterations and no salt, as RFC 9276 recommends: it does not hand out the zone's names, and extra iterations would only cost every validator CPU. Signatures are valid for 30 days and refreshed 10 days before they expire, so a signer outage leaves that long before any signature lapses. Zone-signing keys roll every 90 days with no one involved; key-signing keys change only with the DS record at the parent. The signer confirms a KSK's submission itself, asking a validating resolver with no cache every 1 hour whether the parent serves a matching DS, and waits 1 day after seeing it before the next step of a rollover. Every version of every zone also carries a ZONEMD digest (SHA384).
| Zone | Chain from the root | KSK | DS at the parent | ZSK, next roll | Serial | Last signed | Signatures valid |
|---|---|---|---|---|---|---|---|
| pqcrypta.com | secure | 29714 active | 29714 matches | 81, 17 Jan 2027 | 1792780833 all servers | 2 hours ago | 25.2 days |
| stlweb.dev | secure | 19036 active | 19036 matches | 28226, 17 Jan 2027 | 1792780833 all servers | 2 hours ago | 25.2 days |
| fated.org | secure | 48434 active | 48434 matches | 37007, 17 Jan 2027 | 1792778591 all servers | 2 hours ago | 25.2 days |
| philibertsecurity.com | secure | 40725 active | 40725 matches | 59614, 17 Jan 2027 | 1792780833 all servers | 2 hours ago | 25.2 days |
| pqpdf.com | secure | 17165 active | 17165 matches | 49742, 17 Jan 2027 | 1792780833 all servers | 2 hours ago | 25.2 days |
"Signatures valid": the shortest time left on any SOA or DNSKEY signature any server serves. "Chain from the root": validated from the root's trust anchor through each parent's DS.
Source: pqcrypta-dns-health (chains, DS, serials, signatures), pqcrypta-dns-stats (the signer's keys and policy, and its log) ยท 23 Oct 2026, 20:31 UTC
Zone transfers and integrity
A public server takes a zone only from the signer, and only after checking it: ZONEMD verification is on and DNSSEC validation of every transfer is on. Each polls the signer at least every 10 minutes whatever the SOA says, and retries a failed refresh within 2 minutes.
| On the public servers, last 7 days | Count |
|---|---|
| Refreshes that found the zone current | 211 |
| Refreshes that took a new version | 27 |
| Transfers received | 27 (39.1 kB) |
| NOTIFYs received | 27 |
| ZONEMD digests verified / failed | 42 / 0 |
| DNSSEC validations passed / failed | 42 / 0 |
| Refresh attempts that failed, then retried | 0 |
Source: pqcrypta-dns-stats, from each server's log (counting since 23 Oct 2026, 18:04 UTC) ยท 23 Oct 2026, 20:31 UTC
What they answer
The servers count what they answer, by transport, operation, response code and query type, and the EDNS options and flags queries carry. Counts only: no name and no address is recorded. Our own health check and scanner are among the clients.
Last 24 hours: 23,416 queries
| UDP | 20,259 | |
|---|---|---|
| TCP | 2,584 | |
| DNS over TLS | 257 | |
| DNS over QUIC | 331 | |
| DNS over HTTPS | 449 |
Query types
| A | 5,796 | |
|---|---|---|
| DNSKEY | 5,635 | |
| SOA | 5,310 | |
| AAAA | 4,673 | |
| HTTPS | 690 | |
| NS | 447 | |
| TXT | 424 | |
| MX | 236 |
Response codes
| NOERROR | 19,192 | |
|---|---|---|
| BADCOOKIE | 3,444 | |
| NXDOMAIN | 533 | |
| REFUSED | 210 | |
| BADVERS | 51 | |
| NOTIMPL | 1 |
EDNS options in queries
| COOKIE | 7,728 | |
|---|---|---|
| EDNS-CLIENT-SUBNET | 1,040 | |
| PADDING | 667 | |
| NSID | 105 | |
| other | 51 |
Flags in queries
| DO | 18,756 | |
|---|---|---|
| TC | 776 |
Last 7 days: 23,416 queries
| UDP | 20,259 | |
|---|---|---|
| TCP | 2,584 | |
| DNS over TLS | 257 | |
| DNS over QUIC | 331 | |
| DNS over HTTPS | 449 |
Query types
| A | 5,796 | |
|---|---|---|
| DNSKEY | 5,635 | |
| SOA | 5,310 | |
| AAAA | 4,673 | |
| HTTPS | 690 | |
| NS | 447 | |
| TXT | 424 | |
| MX | 236 |
Response codes
| NOERROR | 19,192 | |
|---|---|---|
| BADCOOKIE | 3,444 | |
| NXDOMAIN | 533 | |
| REFUSED | 210 | |
| BADVERS | 51 | |
| NOTIMPL | 1 |
EDNS options in queries
| COOKIE | 7,728 | |
|---|---|---|
| EDNS-CLIENT-SUBNET | 1,040 | |
| PADDING | 667 | |
| NSID | 105 | |
| other | 51 |
Flags in queries
| DO | 18,756 | |
|---|---|---|
| TC | 776 |
Source: pqcrypta-dns-stats: Knot's mod-stats counters on every public server, and the proxies' logs for DNS over HTTPS (counting since 23 Oct 2026, 18:04 UTC) ยท 23 Oct 2026, 20:31 UTC
Abuse resistance and hardening
An authoritative server must answer whoever asks, so its defences are about what it will not do.
These servers never recurse: they answer for their own zones and nothing else.
They do not reveal their software or version (version.bind and id.server go unanswered);
they accept no zone transfer from anyone, the signer's transfers going the other way; and they cap
UDP answers at 1,232 octets, the size that
avoids IP fragmentation on the paths that matter (DNS Flag Day 2020).
Response rate limiting runs as 2 instances: one limits each source's UDP
answers and truncates the rest, which a real resolver retries over TCP and a forged source never
does; the other limits the time one source may take over TCP, TLS and QUIC, with our own 6 server addresses exempt so the monitors cannot trip it. DNS Cookies (RFC 7873) let a returning resolver prove its address.
Measured: the scanner sent 200 queries at once from one address; 119 were answered in full and 81 truncated.
Source: the HTTP/3 scanner, ns1.pqcrypta.com ยท 23 Oct 2026, 20:28 UTC
| Last 7 days, all public servers | Count |
|---|---|
| Answers truncated by rate limiting | 244 |
| Times a source was put under the limit | 3 |
| Queries carrying a DNS Cookie | 7,728 |
| Zone transfers asked of a public server (all refused) | 0 |
| Dynamic updates attempted (all refused) | 2 |
| Answered REFUSED | 210 |
| Answered NOTAUTH | 0 |
| Malformed queries (FORMERR) | 0 |
| DNS over HTTPS requests refused or rejected (4xx) | 70 |
Source: pqcrypta-dns-stats (counters and logs) ยท 23 Oct 2026, 20:31 UTC
The processes
Every knotd runs under systemd with a sandbox: its own user, a read-only system, no new privileges, no kernel tunables, modules or logs, a system-call filter, and only the address families a DNS server needs. The settings in force now:
| Setting | signer | ns1 | ns2 | ns3 |
|---|---|---|---|---|
CapabilityBoundingSet | (none) | cap_setpcap cap_net_bind_service | cap_setpcap cap_net_bind_service | cap_setpcap cap_net_bind_service |
LockPersonality | yes | yes | yes | yes |
MemoryDenyWriteExecute | yes | yes | yes | yes |
NoNewPrivileges | yes | yes | yes | yes |
PrivateDevices | yes | yes | yes | yes |
PrivateTmp | yes | yes | yes | yes |
ProtectControlGroups | yes | yes | yes | yes |
ProtectHome | yes | yes | yes | yes |
ProtectKernelModules | yes | yes | yes | yes |
ProtectKernelTunables | yes | yes | yes | yes |
ProtectSystem | strict | strict | strict | strict |
Restart | on-failure | on-failure | on-failure | on-failure |
RestrictAddressFamilies | AF_INET AF_INET6 AF_NETLINK AF_UNIX | AF_INET AF_INET6 AF_NETLINK AF_UNIX | AF_INET AF_INET6 AF_NETLINK AF_UNIX | AF_INET AF_INET6 AF_NETLINK AF_UNIX |
RestrictNamespaces | yes | yes | yes | yes |
RestrictRealtime | yes | yes | yes | yes |
RestrictSUIDSGID | yes | yes | yes | yes |
SystemCallArchitectures | native | native | native | native |
UMask | 0077 | 0077 | 0077 | 0077 |
User | knot-signer | knot | knot | knot |
Source: pqcrypta-dns-stats (systemd's view of each unit) ยท 23 Oct 2026, 20:31 UTC
How it is watched
Every five minutes a health check asks every address over every transport from outside the servers' own loopback, and requires a publicly trusted certificate for the server's name and a post-quantum key exchange on each encrypted one. It checks that every server serves the signer's serial and DNSKEY set, that no signature has less than a safe margin left, that the answers validate through each server against the zone's key, and at each parent, where the zone is delegated and whether the DS matches. It mails an alert when its verdict changes, and System Telemetry's DNS tab shows each run.
Source: pqcrypta-dns-health history ยท 23 Oct 2026, 20:31 UTC
Among the name servers the scanner has measured
Every scan on the HTTP/3 analyzer asks the scanned domain's name servers over the same transports. Leaving ours out, it has measured 1,480 name-server hosts: 24 answer DNS over TLS, 7 DNS over QUIC and 2 DNS over HTTPS (of 7 asked over it); 16 negotiated a post-quantum key exchange and 0 publish an RFC 9461 discovery record. Ours, 3 hosts: 3 DNS over TLS, 3 DNS over QUIC, 3 DNS over HTTPS, 3 post-quantum, 3 with a discovery record.
| Operator | Hosts | DoT | DoQ | DoH | Post-quantum | Discovery |
|---|---|---|---|---|---|---|
| pqcrypta.com (ours) | 3 | 3 | 3 | 3 | 3 | 3 |
| facebook.com | 4 | 4 | 0 | 0 | 4 | 0 |
| ipv64.net | 2 | 2 | 0 | 0 | 0 | 0 |
| instagram.com | 4 | 4 | 0 | 0 | 4 | 0 |
| whatsapp.net | 4 | 4 | 0 | 0 | 4 | 0 |
| m-online.net | 3 | 3 | 3 | 0 | 0 | 0 |
| wikimedia.org | 3 | 3 | 0 | 0 | 0 | 0 |
| ojos.tv | 2 | 2 | 2 | 2 | 2 | 0 |
| quicojs.dev | 2 | 2 | 2 | 0 | 2 | 0 |
Operators whose name servers answer at least one encrypted transport, by the name servers' domain. From one vantage point: a server that filters it reads as not answering.
Source: the HTTP/3 scanner's corpus (corpus_encrypted_dns), measured since 19 Oct 2026, 00:27 UTC
Where it falls short
- One network. All 3 name servers are in AS8560 (IONOS SE). They are separate machines in separate locations, but an outage of that network, or an attack on it, would take every zone off line at once. RFC 2182 section 3.1 asks for name servers in different networks; a server elsewhere is the fix.
- Reverse name of 209.46.123.222. It reads mail.fated.org, the host's own name, not ns3.pqcrypta.com: the address belongs to a host with another role, whose reverse name must stay the name it is known by there. It resolves back to the address, so it is valid (RFC 1912 section 2.1).
- Reverse name of 2607:f1c0:f0b4:4400::1. It reads mail.fated.org, the host's own name, not ns3.pqcrypta.com: the address belongs to a host with another role, whose reverse name must stay the name it is known by there. It resolves back to the address, so it is valid (RFC 1912 section 2.1).
- DNSSEC is classical. Until a post-quantum signature algorithm is standardised for DNSSEC and implemented by validators, the signatures are only as strong as their curve; the transports, not the signatures, are what is post-quantum today.
SOA timers
| Timer | Value | Guidance | Within it |
|---|---|---|---|
| refresh | 4 hours | 20 minutes to 12 hours (RFC 1912 section 2.2) | yes |
| retry | 1 hour | a fraction of refresh (RFC 1912 section 2.2) | yes |
| expire | 14 days | 2 to 4 weeks, longer than retry and minimum (RFC 1912 section 2.2) | yes |
| minimum | 1 hour | the negative-caching TTL: 1 to 3 hours works well (RFC 2308 section 5) | yes |
Source: the HTTP/3 scanner's latest scan of pqcrypta.com ยท 23 Oct 2026, 20:28 UTC
Recent events
- ns3 a client was rate limited (udp, UDP, by rate)
- ns2 a client was rate limited (udp, UDP, by rate)
- ns1 a client was rate limited (udp, UDP, by rate)
- signer knotd started
- ns1 knotd started
- ns3 knotd started
- ns3 statistics not read: ssh: exit 255: ssh: connect to host <address> port 22: Connection timed out
- ns2 knotd started
- signer pqpdf.com: the parent's DS confirmed the KSK submission
- signer pqpdf.com: DS check at the parent: positive
- signer fated.org: the parent's DS confirmed the KSK submission
- signer fated.org: DS check at the parent: positive
- signer stlweb.dev: the parent's DS confirmed the KSK submission
- signer stlweb.dev: DS check at the parent: positive
- signer pqcrypta.com: the parent's DS confirmed the KSK submission
- signer pqcrypta.com: DS check at the parent: positive
- signer philibertsecurity.com: the parent's DS confirmed the KSK submission
- signer philibertsecurity.com: DS check at the parent: positive
Source: pqcrypta-dns-stats, from the servers' logs: failures, restarts, rate limiting and DNSSEC key events; addresses and key names removed ยท 23 Oct 2026, 20:31 UTC
Ask them yourself
With kdig (Knot DNS 3.3 or later for DNS over QUIC). Add +tls-ca to check the
certificate against the system's roots; kdig prints the key exchange it negotiated.
# DNS over QUIC
kdig @ns1.pqcrypta.com +quic +tls-ca fated.org SOA
# DNS over TLS
kdig @ns1.pqcrypta.com +tls +tls-ca fated.org SOA
# DNS over HTTPS (HTTP/2)
kdig @ns1.pqcrypta.com +https=/dns-query +tls-ca fated.org SOA
# The server's discovery record (RFC 9461)
kdig @ns1.pqcrypta.com _dns.ns1.pqcrypta.com SVCB
# DNSSEC, validated
delv @ns1.pqcrypta.com fated.org SOA
# The zone digest
kdig @ns1.pqcrypta.com fated.org ZONEMD +dnssecFrequently asked questions
Why run our own authoritative name servers?
Two reasons. The zones carry HTTPS records with Encrypted Client Hello configurations whose post-quantum keys make them longer than a registrar's DNS would accept, and they rotate weekly, so the servers must take updates automatically. And the HTTP/3 scanner checks other people's name servers for DNS over QUIC, DNS over TLS and DNS over HTTPS with a post-quantum key exchange: ours are where every one of those checks is held to its standard first.
What is a hidden signer?
A DNS server that holds the zones and their DNSSEC private keys, signs every change, and answers nothing but zone transfers to the public servers. No resolver can reach it and it appears in no NS record, so the keys never sit on a machine that answers the Internet. The public servers hold only signed copies, verify each one before serving it, and refuse one that fails.
Is a DNSSEC signature post-quantum?
Not yet. DNSSEC algorithms need an IANA number that every validating resolver implements, and no post-quantum signature algorithm has one. The zones are signed with the algorithm every validator must support. What is post-quantum here is the transport: DNS over TLS, QUIC and HTTPS, and the transfers between our servers, use a hybrid ML-KEM key exchange, so a recording of the traffic cannot be decrypted later by a quantum computer.
Why does a name server need post-quantum encryption at all?
Which names a resolver looks up reveals what its users are visiting, and an encrypted session recorded today can be decrypted once a large quantum computer exists. A hybrid key exchange combines a classical curve with ML-KEM (FIPS 203), so the session stays private unless both are broken.
Is 0-RTT safe for DNS?
For a query, yes: RFC 9250 allows a query in 0-RTT data because a replayed query only repeats an answer. Anything that changes state must not be accepted that way. These servers record every ClientHello that carries early data, so a replay is refused; replace the ticket key every ticket lifetime and erase it after the next, so early data keeps forward secrecy; and answer an UPDATE in early data with REFUSED and Extended DNS Error 26, Too Early.
Can I query these servers over DNS over QUIC myself?
Yes. The commands under "Ask them yourself" do it with kdig, which has DNS over QUIC from Knot 3.3, DNS over TLS and DNS over HTTPS. Any client can, too: the servers answer for their own zones only, to anyone, and refuse everything else.
Why do the servers limit how fast they answer?
An authoritative server answers whoever asks, so it can be used to flood a forged source address with answers larger than the questions. Response rate limiting caps how many UDP answers one address gets and truncates the rest, which a real resolver retries over TCP and a forged source never does; DNS Cookies let a returning resolver prove its address.