Technical Guides

Hands-on guides and how-tos on whatever is worth writing down. Kept current as references, unlike the dated changelog.

How-to

Not Using a Post-Quantum Key Exchange: What ssh Is Telling You

OpenSSH 10.1 warns when a connection settles on a classical key exchange. It is your client describing the server's offer, it goes silent the moment you pin KexAlgorithms - so a hardening line from 2018 hides it - and four algorithm names count as post-quantum, not the two most write-ups list. The server change, the client options, the commands that report what was actually negotiated, and the same migration in DoH and TLS.

Read guide 12 min read
Post-mortem

Two Ways Out of a QUIC Deadlock, Both Closed Years Ago

After we reported an nginx HTTP/3 handshake that stalls forever on one lost packet, a maintainer reproduced it and a core developer diagnosed it further than our report had. His answer names two commits: one from October 2020 that added an escape hatch congestion control now silently swallows, and one from February 2021 that replaced the other escape hatch with PING frames. Neither is a bug alone; the defect lives in the overlap, and it took a post-quantum ServerHello to expose it.

Read guide 11 min read
Verification

A Leak Test Cannot Tell You Whether Your DNS Was Encrypted

A DNS leak test reports which resolver answered, and people read it as proof the query was encrypted. It is a different question: encryption happens on the hop a leak test never observes, so plaintext port 53 and DoH to the same resolver produce an identical result. The commands that do check it per protocol - DoH, DoH3, DoT, DoQ, ECH and DDR - plus what Windows, macOS, iOS and Android can and cannot show you, and why a browser is the only check that works on all four.

Read guide 12 min read
How-to

Accept DNS Configuration: Why Tailscale Replaced Your Resolver

Tailscale's --accept-dns defaults to true, so joining a tailnet hands DNS on that device to the tailnet and your configured encrypted resolver stops being consulted. Nothing fails and nothing is reported - the only notice is a comment written into resolv.conf. The three commands that show where queries actually go, and the three ways to keep both MagicDNS and your own encrypted DNS.

Read guide 5 min read
Post-mortem

Ten Browser Tabs Look More Robotic Than a Bot

Restoring ten tabs puts 61 DNS queries on the wire in 145 milliseconds at a 16 ms cadence, and every hostname is asked for twice. Measured against 226 real clients on this resolver, that burst is more regular than the most machine-like moment 164 of 167 of them produced in 76 minutes. Whether a timing check calls it automated comes down to one undocumented counting choice, plus three corrections to our own account of a false positive, the last of which reverses the conclusion the other two reached.

Read guide 25 min read
Post-mortem

Banned by Our Own Refusals: When a Defence Cites Its Own Output

Three verified Meta crawlers were hard-banned while asking for /robots.txt. The evidence against them was a status code our own configuration had just returned to them. A second loop ran the other way: a 59-second ban deleted a real user's earned history, and 69 seconds later the same client drew 72 hours. Both loops measured from the durable records, the test that separates a client's mistake from your own, and how to check your own Fail2Ban jail for the same shape.

Read guide 17 min read
Security

67,751 Challenges, Not One Attempt: Compute versus Memory-Hard Proof of Work

When a browser proof-of-work challenge is not slowing an attacker down, the obvious lever is to add difficulty bits. It is the wrong one. Timed in the browser's own WebAssembly solver, a compute-bound challenge at 26 bits has a median cost of 19.1 seconds for a real user and a worst run of 64.4, while a memory-hard Argon2id solve at 4 bits took a measured 1.4 seconds - because one memory-hard probe costs about 387,000 SHA-256 probes. Then a fleet of native solvers was built to answer the question the flood evidence could not: a botnet can earn about 0.6 tokens per second per core, at roughly 16 times our verification cost. A second, larger flood two days later reproduced the result - 2,036 challenges issued, none attempted - while the host sat at a load average of 1.31 across four cores. Includes four published corrections, one of them a pair of bad proofs that looked like the swarm finally trying and turned out to be the author's own phone. The benchmark scripts are published with the raw output of four passes.

Read guide 32 min read
Post-mortem

The Handshake That Failed One Time in Twenty: a QUIC Initial CRYPTO Deadlock

DoH3 here failed about one attempt in twenty, silently. The fault was upstream: when a post-quantum ServerHello spans two QUIC Initial packets and one is lost, nginx detects the loss and requeues the CRYPTO frame, but congestion control suppresses it - and the client cannot acknowledge anything until that frame arrives, so the window never reopens. The packet capture, the two lines in different files that cause it, the candidate fixes proposed upstream and how one of them measured on a different TLS library, two hypotheses we measured and discarded, and why post-quantum certificates remove the headroom that fix depends on.

Read guide 42 min read
Post-mortem

When Our Leak Test Invented a Leak: a SERVFAIL That Looked Like Google

Our leak test reported a phone leaking to Google Public DNS. It was not. The probe zone was delegated to a host whose port 53 ran only a recursive resolver, so every probe SERVFAILed: Quad9 retried 18 times in 194ms, gave up, and the phone fell back to a secondary resolver 57ms later, which we recorded as the leak. Why the three obvious fixes each destroy the test, the RD-bit hypothesis we measured and discarded, and the packet-layer split that fixed it.

Read guide 13 min read
Runbook

When Hardening Refused Every POST: the http2_body_preread_size Cliff

We lowered nginx's http2_body_preread_size to 16k as an anti-DDoS measure. Any value below 65535 makes nginx refuse every HTTP/2 request carrying a body - every RFC 8484 DoH POST - for at least five weeks. nginx -t passed, GET worked, and the error log was empty because the refusal logs at INFO and REFUSED_STREAM means retry is safe. The code path, why nginx is right to refuse, 211 measured refusals, and a 60-second reproduction on localhost.

Read guide 17 min read
How-to

Zero Open Admin Ports: Hiding AdGuard Home and SSH

The admin panel and SSH on this server answer two devices over Tailscale and nobody else. Stock AdGuard Home bound to localhost, an nginx geo allowlist that resets strangers, a DNS split view from the resolver itself, and one nftables rule that hides port 22 - each gate verified from both sides, plus the one-command version for a Raspberry Pi at home.

Read guide 14 min read
Runbook

When UDP Clamping Exposes a TCP Bug

Part two of the amplification post-mortem. Our internal resolver had been Flag-Day-clamped for years and it changed nothing: the clamp sat on a hop no attacker can reach. Moving the EDNS 1232 clamp to the public edge halved the residual - and testing the TC=1 promise found every answer over 4 KB failing with SERVFAIL, a silent legacy limit in dnscrypt-proxy's TCP path. Both fixes, plus DNS Cookies (RFC 7873) as the finishing layer.

Read guide 16 min read
Runbook

Is Your AdGuard Home or Pi-hole a DNS Amplification Weapon?

Our public resolver was turned into a 31.8x DNS amplifier aimed at strangers: 3.4 million spoofed queries for one fat TXT record, 4.6 Mbps of attack traffic sent by us. Why banning the source IPs would have made it worse, how to check your own resolver in two minutes, and the fixes - from a one-line filter rule to response rate limiting with a TC=1 slip.

Read guide 43 min read
Runbook

How to Create an IP SAN Certificate with Let's Encrypt

Let's Encrypt puts a bare IP address into a certificate free of charge - the foundation verified DDR stands on - at the price of a 160-hour lifetime. How to issue one, the pros and cons stated honestly, and the complete production automation: ARI renewal, watchdog, DANE guard.

Read guide 25 min read
Reference

Anatomy of a Hardened DNS Zone

A record-by-record tour of the real dnsdoh.art zone, grouped by what each record defends: DNSSEC identity (ECDSA P-256), DANE pins on four transports, an HTTPS record with monthly-rotated ECH, DDR discovery, mail lockdown and CAA. Every record is public, so every claim comes with the dig command that proves it.

Read guide 24 min read
Runbook

The Missing NSEC: When a Signed Zone Loses Its Delegation

Our signed zone delegates one subdomain, and on one provider every validating resolver refused it: SERVFAIL, EDE 22. The parent was serving the delegation without proving DS absence. The diagnosis across six providers, the report that got a platform-wide fix, the July re-test verifying it, and the five-minute audit to run against your own provider.

Read guide 14 min read
Runbook

When Your Blocklist Bans Googlebot

We import public IP blocklists to shed abusive traffic. One had crowd-listed real Googlebot addresses, our firewall dropped them before nginx, and the site slid out of search. How we saw it (a crawler-only nginx log), how we verified bots (forward-confirmed rDNS), and the exempt-not-whitelist fix that lets crawlers through without opening a spoofing hole.

Read guide 22 min read
Runbook

Verified DDR End to End

Running verified DDR in production: the SVCB answer clients discover, why the certificate has to carry the resolver's IP address, and what AdGuard Home's "certificates has no IP addresses; DNS-over-TLS won't be advertised via DDR" warning means, costs, and takes to clear.

Read guide 12 min read
Concept

How Devices Discover Encrypted DNS

A device handed a bare resolver address has to find out, unprompted, whether that resolver speaks anything encrypted. DDR and DNR are the two answers. Includes the single query that shows any resolver's designations, how the big three differ in what they advertise, and why Windows cannot inspect its own discovery.

Read guide 7 min read
Basics

Does DNS Use TCP or UDP?

Both, on port 53: UDP for almost every lookup, TCP for the answers that will not fit. Commands for Linux and Windows that show the truncation flag and the fallback happening, what six public resolvers advertise as their UDP limit, and what the fallback costs over 50 paired runs.

Read guide 15 min read
Security

What Is DNS Hijacking?

Hijacking does not forge a packet in a race; it takes over a control point your lookups already pass through: malware on the device, the home router, an ISP that intercepts port 53, or a resolver someone else handed you. The name in the address bar stays right while the destination goes wrong. Where each redirect lives, how to spot one, and why encrypting the link to a resolver you chose removes most of the places it can stand.

Read guide 5 min read
Reference

DNS Record Types Explained

A domain is not a single fact but a small set of records, each answering a different question: where the site lives, how to connect to it, where email goes, which certificates are legitimate. A plain-English reference to A, AAAA, CNAME, MX, TXT, NS, and CAA, plus the modern records that changed DNS: HTTPS and SVCB for HTTP/3 and Encrypted Client Hello, and TLSA (DANE). With worked examples and current best practice.

Read guide 10 min read
Concept

What Is Anycast DNS?

A large public resolver hands out one IP address, yet that single address lives in dozens of cities at once. Anycast lets the network deliver your query to the nearest copy, which is most of why a public resolver feels instant worldwide and stays up while under attack. How one address ends up in many places, and what it does and does not protect.

Read guide 5 min read
How-to

Why Encrypted DNS Breaks on Hotel Wi-Fi

Public Wi-Fi forces you through a sign-in page by hijacking your DNS. Encrypted DNS refuses to be hijacked, so the login never appears and the network looks dead until you authenticate. Why the standoff happens, what your device is doing in the background, and how to get online in seconds without giving up encryption.

Read guide 5 min read
Privacy

What Is QNAME Minimisation?

By default a resolver hands your full domain name to every server it asks, including the root and the TLD that only need the next label. QNAME minimisation trims each question to the minimum, so far fewer operators ever learn the whole name you looked up.

Read guide 4 min read
Privacy

What Is EDNS Client Subnet?

To help content networks send you to a nearby server, your resolver can staple a slice of your IP address onto the queries it forwards, handing a piece of your location to every server behind every name you look up. Why it exists, how precise the leak is, and why encrypting your DNS does not close it on its own.

Read guide 5 min read
Concept

Can DNS Be Blocked or Censored?

Because every connection starts with a lookup, the resolver is the cheapest place to block a site. How ISPs and regulators filter by returning a wrong or empty answer, why the same name resolves differently depending on where you ask, and exactly what encrypted DNS does and does not get around.

Read guide 7 min read
Basics

How DNS Actually Works

Every connection starts with a name-to-number lookup you never see. How a domain name is built as a hierarchy ending in a hidden root dot, the cascade of caches a lookup falls through, and the commands that show the walk happening on Linux and on Windows - including two servers that both answer authoritatively for the same name, with different addresses, and the delegation that decides which one counts.

Read guide 11 min read
Concept

DNS Spoofing and Cache Poisoning

Plain DNS accepts the first matching reply it gets. If an attacker's forged answer arrives before the real one, the resolver caches it and serves the same lie to everyone, while the address bar still shows the right name. How the race works, and the layers that stop it.

Read guide 6 min read
Privacy

Encrypted DNS vs VPN

They solve different problems: encrypted DNS deletes one signal, a VPN forwards all of them to a different company. Which to use for what, and three packet captures that show it - the name in the clear on a plain lookup, zero names once it is encrypted, and the site name still sitting in the TLS handshake either way.

Read guide 8 min read
Privacy

Can Your ISP See the Sites You Visit?

With plain DNS your provider can name every site you open without breaking any encryption. What encrypted DNS actually seals, what still leaks through the SNI and the destination IP, and what timing alone gives away.

Read guide 5 min read
Concept

How DNS Ad-Blocking Works

DNS-level blocking refuses to look up known ad, tracker and malware domains, so the request dies before any connection is made. Includes the two commands that show a name being refused on Linux and on Windows, the three shapes a refusal can arrive in and how to tell one from a dead domain, and a measurement against a live malware feed showing what name-based filtering cannot reach.

Read guide 14 min read
Privacy

What Incognito Mode Actually Hides

Private browsing wipes traces from your own device, but your ISP, your DNS resolver, the sites you visit and your network admin still see the same thing. What incognito does, what it does not, and what actually helps.

Read guide 5 min read
Concept

Harvest Now, Decrypt Later

Traffic recorded today can be stored until a quantum computer can open it, which is why the key exchange had to change first. What ML-KEM replaces, why it runs hybrid alongside X25519, and the commands that prove a server is really doing it - one curl flag for HTTPS and DoH, and a packet capture for DoT and DoQ, where no client exposes the setting.

Read guide 13 min read
Privacy

Encrypted DNS Still Leaks the Site Name

You encrypted your DNS, but the TLS handshake still names the site you visit in plaintext (SNI). What Encrypted Client Hello fixes, why it depends on encrypted DNS, and what it still cannot hide.

Read guide 14 min read
Privacy

What Your Browser Tells About You

Without cookies or your IP, a site can still recognise you from dozens of small browser details that combine into a near-unique signature. How fingerprinting works, why it survives cookie-clearing, and what actually helps.

Read guide 13 min read
Privacy

What Your IP Address Reveals

An IP shows your rough location, your provider, and your connection type, but not your home address or your identity. What can be read from an IP, how, and what cannot.

Read guide 3 min read
Basics

DNS Caching & TTL Explained

Almost every DNS answer is reused rather than looked up fresh, and the TTL decides for how long. What the number means, a full countdown-and-reset cycle you can watch on a 60-second record, and the part most explanations skip: resolvers rewrite that number at both ends, so what reaches you is not always what the domain published.

Read guide 6 min read
Runbook

Build a Validating, Hardened Resolver

A runbook for running your own DNS resolver: Unbound for DNSSEC validation, caching and hardening, with dnscrypt-proxy encrypting the upstream. The directives that matter and how to verify them.

Read guide 9 min read
Concept

What Is DNSSEC?

What DNSSEC signs, what it refuses, and what it leaves alone. Includes the one command that returns three different answers - validated, unsigned, and refused - the +cd flag that proves a SERVFAIL is a validation decision, and the PowerShell equivalents, which display a signature more legibly than dig does.

Read guide 9 min read
Basics

What Is a DNS Resolver?

What a DNS resolver is and what it does with your lookups. Includes the commands to find out which resolver your device was told to use, which one the authoritative server actually sees, and why those two answers differ - plus the caching trap that makes the popular one-liner report on a stranger.

Read guide 9 min read
Comparison

DNSCrypt vs DoH vs DoT vs DoQ

Which encrypted DNS protocol to use, and what each costs. DoT needs nothing installed and sits on a port a network can block; DNSCrypt needs a client but rides 443 and is the only one with working relays; DoQ and DoH3 finish in fewer round trips. All six are then measured at the wire with one client against one Quad9 address, so only the transport varies: a cold lookup costs 168 bytes over Do53, 1,052 over DNSCrypt, 7,186 over DoT and 12,420 over DoH3, and the QUIC transports are the only ones where the client sends more than it receives. Includes a published correction to an earlier version of that measurement.

Read guide 31 min read
Verification

Does Your VPN Leak DNS?

A VPN encrypts your traffic, but your DNS lookups can take a different path. What a leak is, how to check for one, and how to read the result.

Read guide 4 min read
How-to

You Found a DNS Leak: How to Fix It

A leak is almost always one layer letting lookups out, an app or OS setting. How to pin the layer, fix it app-side or OS-side, and confirm it is closed.

Read guide 5 min read
Concept

How the DNS Leak Test Works

The test mints a name that has never existed, so no cache can answer it and the lookup must reach a nameserver we run - which records the resolver that asked. How the delegation makes that work, how to run the whole test from a terminal with dig and curl, and why the address you see is usually not the resolver you configured.

Read guide 6 min read