Step 05 · Delegate
Point it at the box. Then read what you just published.
Delegation itself is two records and five minutes. Set the nameservers at the registrar, create an address record for the host, wait for the change to propagate to the registry, and confirm it from outside your own network rather than from the machine that already knows the answer. What deserves the remaining forty minutes is everything the delegation makes visible afterwards.
dig +short NS example.com @1.1.1.1 # the delegation as the world sees it, not your cache
dig +short A app.example.com # must return the VPS address before you deploy anything
dig +short CAA example.com # empty today; step 05 fills it in
dig +short DS example.com # non-empty only if DNSSEC is actually signed
On who runs the authoritative servers, the honest answer is not the one the rest of this series usually gives. Self-hosting authoritative DNS is the one component where doing it yourself is generally worse: it wants two or more servers on separate networks, it has to keep working during exactly the outage that has taken your main box down, it needs ongoing care to avoid being abused for amplification, and when it fails everything fails with it — including the certificate renewal that would have let you repair the situation. It also creates a correlation you were trying to avoid, because a self-run nameserver shared between two projects publicly ties them together in datasets anybody can query. Use a DNS operator with an anycast network, choose it on whether it demands an identity document rather than on its feature list, and keep an exported zone file so moving is a paste rather than an excavation. This is a different job from the private recursive resolver in the series, which moves the log of what you look up onto your own machine and is worth doing.
Now the leak that undoes more careful setups than anything else on this page, because it operates silently and after you have stopped paying attention. Every certificate issued by a publicly trusted authority is submitted to append-only public logs, and browsers reject certificates that are not. The logs exist so that mis-issuance is detectable, which is a genuinely good thing, and they are indexed by free search interfaces. The consequence is that every hostname you have ever requested a certificate for is a keyword search away, for anybody, permanently — including staging., vpn., backup. and the administrative name you assumed nobody would guess.
# every certificate ever issued under the zone, and every hostname inside each one
curl -s 'https://crt.sh/?q=%25.example.com&output=json' | jq -r '.[].name_value' | sort -u
The mitigation is a single wildcard certificate for the zone, served for every internal hostname underneath it. The log entry then records that a certificate exists for the zone and nothing about what lives inside it. The cost is that a wildcard requires the DNS-based challenge rather than the simpler file-based one, which means an API token for your DNS operator on the box — ten minutes of setup, weighed against a permanent public list of your internal naming scheme. Issue one wildcard, keep it on the reverse proxy, and stop requesting per-hostname certificates.
Two records finish the job. A CAA record states which certificate authorities are permitted to issue for the name, so a mis-issuance by any other authority is refused at source rather than detected afterwards. And DNSSEC, if both your registry and your DNS operator support it, signs the delegation so a resolver can tell a forged answer from a real one — it is one switch at most operators and one record at the registrar, and the only thing to be careful about is that a signed zone whose keys are mishandled fails closed, which is to say completely.
; in the zone — only this authority may issue, and tell us if anyone tries
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issuewild "letsencrypt.org"
example.com. IN CAA 0 iodef "mailto:abuse@example.com"
Finally, the correlation layer, which is where two compartments become one without anybody making a mistake. Passive-DNS datasets record which names resolved to which addresses and when; a shared address, a shared nameserver set or a shared mail exchanger is enough to join two projects that have nothing else in common. If two names must stay unlinked, they need separate servers, separate nameserver sets and separate mail routing — and the same goes for the small things nobody counts, like an analytics identifier reused across both sites or an identical favicon, both of which are searchable at internet scale by anybody who cares to.