3.2 Choosing DNS and DHCP engines
SpatiumDDI authors zones and records the same way on every engine, so it’s tempting to treat the engine as a detail. It isn’t. Views, RPZ, ALIAS records, encrypted DNS and DNSSEC all behave differently per engine, and the engine is fixed per server group. Choose well and a new requirement later is one more record; choose badly and it means moving zones between groups.
What you’ll learn
Section titled “What you’ll learn”- Compare the DNS engines on the features that decide real designs
- Apply the single-driver rule, and the one-signer rule for DNSSEC, when you plan server groups
- Pick a DHCP engine and know what Windows DHCP and FortiGate can and can’t do
- Plan a mixed estate and a BIND9-to-PowerDNS move without DNS downtime
The rule that shapes everything
Section titled “The rule that shapes everything”You choose the engine (the driver) for each server when you add it, but a DNS server group is single-driver: the control plane rejects a group that mixes engines. Catalog zones, zone transfers and the engine-only features all assume that every member runs the same driver.
Engine-only features are enforced server-side. Ask for one on the wrong group and the API returns 422 with a remediation message such as “move the zone to a PowerDNS-only group”.
| Feature | Allowed engines |
|---|---|
ALIAS and LUA records |
PowerDNS |
SVCB, HTTPS and DNAME records |
BIND9, PowerDNS, Technitium |
| DNSSEC sign | BIND9, PowerDNS, on a group with one agent server |
| DNSSEC unsign | BIND9, PowerDNS, Technitium |
| Manual key rollover | BIND9 |
A mixed estate is therefore one group per engine, and each zone lives in exactly one group. 1.0.0-beta.3 can move a server or a zone between groups: the zone move is a preview then commit, and the server move refuses to mix drivers or to add a second server to a group that holds DNSSEC-signed zones. At Ridgeline, the default group runs BIND9 through the auto-registered dns-bind9 agent.
DNS engines compared
Section titled “DNS engines compared”Engines SpatiumDDI runs for you
Section titled “Engines SpatiumDDI runs for you”These are agent-managed: the engine runs in a SpatiumDDI container with the agent baked in.
| Capability | BIND9 | PowerDNS | Technitium |
|---|---|---|---|
| How changes apply | TSIG-signed nsupdate over loopback; rndc for zones |
REST rrset PATCH over loopback | REST over loopback |
| Views (split-horizon) | Yes, first-class | Tag-based, not in the UI | No |
| RPZ blocklists | Yes | No | Native blocking instead of RPZ |
ALIAS / LUA records |
No | Yes | No |
| DNSSEC | Inline signing from a dnssec-policy; BIND rotates keys; manual rollover |
Online, one toggle | Not supported in 1.0; zones signed earlier keep serving, marked DNSSEC not managed |
| Catalog zones (RFC 9432) | Producer and consumer | Producer only | Not supported in 1.0 |
| Encrypted DNS | DoT and DoH natively; forwards over DoT only | DoT/DoH only through an optional dnsdist front (Compose only for now); doesn’t forward | DoT, DoH and DoQ natively; forwards over all three |
| Dynamic-update ACLs | IP, TSIG, name scope and record type | IP and TSIG only | None |
| Queries on the Logs page | Yes | Yes | Not yet |
Every agent engine signs with keys held on that server, and the control plane holds none of them. Two servers in one group would serve two different DNSKEY sets against one published DS, so SpatiumDDI allows signing only on a group with one agent server, and refuses a second server in a group that holds signed zones (#1762). To combine signing with redundancy, sign in a one-server group and serve copies from secondary zones in another group, the pattern under “Designing a mixed estate” below.
Engines that stay where they are
Section titled “Engines that stay where they are”These are agentless: the control plane drives a server you (or a provider) already run. It applies each record change right after the database commit, and retries with backoff if the server refuses it.
| Capability | technitium_api (experimental) |
Windows DNS | Cloud DNS drivers |
|---|---|---|---|
| Who runs the server | You; it already exists | Your domain controllers | The provider |
| How changes apply | Technitium’s HTTP API | Path A: RFC 2136 on port 53, always. Path B adds WinRM for zone create/delete and record reads | The provider’s API |
| Zone create | Primary zones only | Path B only | Yes; no rename (delete and create) |
| DNSSEC | Stays in Technitium’s console | Manual, outside SpatiumDDI | Not managed (a provider-level toggle) |
| Dynamic-update ACLs | Not offered | Coarse: None, Secure or NonsecureAndSecure |
None; the API returns 422 |
Views, RPZ, ALIAS/LUA |
No | No | No |
The cloud drivers cover Cloudflare, Route 53, Azure DNS and Google Cloud DNS, plus a token-only tier for DigitalOcean, Hetzner, Linode and Vultr.
Picking, in short
Section titled “Picking, in short”- BIND9 is the default and the reference implementation. It’s the only engine with views, RPZ and manual key rollover.
- PowerDNS when you need
ALIAS(a CNAME-like record at the zone apex) orLUAcomputed records.ALIAStargets resolve through the group’s own forwarders over plain DNS, so set forwarders on the group: without them, newALIASrecords are refused (#1353). - Technitium when you want to serve or forward encrypted DNS with no sidecar, DoQ included. In 1.0 it has no DNSSEC signing and no catalog zones (both are planned for 1.1.0), and its queries don’t reach the Logs page yet.
technitium_apiwhen a Technitium server already exists and should stay where it is. It’s experimental in 1.0: one server per group, Primary zones that SpatiumDDI creates, and their records; DNS pools, SOA and transfer settings, group options, catalog zones and blocklists are refused (#1784). It needs Technitium 15.0 or later and a permanent token from a dedicated user in Technitium’s built-in DNS Administrators group, not the admin account. Zones: Modify alone isn’t enough: it can’t delete zones, and it doesn’t see zones created before the user existed.- Windows DNS when zones are AD-integrated and your Windows team keeps using DNS Manager. Path B needs a service account in
DnsAdmins. SpatiumDDI doesn’t implement GSS-TSIG, so record writes to a zone set to Secure only fail. - A cloud driver when the provider hosts the zones. Import them first, then manage them like any other group. Providers bill per hosted zone, so a cloud group creates no reverse zones at the provider unless you turn on Auto-create reverse zones at the provider in the group’s settings; until you do, subnets’ PTR records are skipped (#1932).
Answer a few questions about the zones you need to serve. A DNS server group runs one engine, so if different zones need different engines, the answer is one group per engine.
DHCP engines
Section titled “DHCP engines”| Kea | Windows DHCP | FortiGate | |
|---|---|---|---|
| Shape | Agent-managed container | Agentless, over WinRM | Agentless, over the FortiOS REST API |
| Writes | Full: the group’s scopes, pools, reservations and classes, checked with kea-dhcp4 -t in a separate process, then applied with config-reload |
Read-mostly: lease and scope reads, plus per-object scope, reservation and exclusion writes; no config push | Full: the whole DHCP-server object for a scope, pushed before the database commits |
| HA | Kea’s own HA hook, configured on the group; DHCPv4 only | Windows failover relationships, read on each lease sync and managed from the group (needs CredSSP) | None |
| Leases into IPAM | The agent streams lease events | A scheduled pull (DHCP Lease Sync in Settings) | Read over REST |
| Credentials | Bootstrap key exchanged for an agent token | A service account in DHCP Users (read) or DHCP Administrators (writes and failover) |
An API token and VDOM; TLS verification on by default |
What to know before you pick:
- Kea is the full-featured choice. The agent drives it over Kea’s unix control socket. The image ships no HTTP control agent, so TCP
8000is only the HA peer port, and the peers authenticate each other there with a per-group TLS client certificate once every member’s agent supports it. - Windows DHCP suits estates that keep Windows. The lowest-risk pattern registers it read-only, so live leases mirror into IPAM while scopes stay managed in Windows. With two or more Windows servers in a group, SpatiumDDI reads their failover relationships and writes each scope only to the servers that hold it.
- FortiGate maps each scope to the interface whose primary IP and netmask match the scope’s CIDR. It records the object it created, and won’t overwrite a DHCP server it didn’t create unless you explicitly adopt it. If the REST push fails, the change is rolled back in SpatiumDDI too.
- Kea and Windows DHCP can’t share a group. The API refuses it with a
422, because Kea’s HA can’t coordinate with Windows failover, and a scope both served would be handed out twice (#1110).
Designing a mixed estate
Section titled “Designing a mixed estate”PowerDNS primary, BIND9 at the edge
Section titled “PowerDNS primary, BIND9 at the edge”Groups on different engines can serve the same namespace through plain zone transfers or RFC 9432 catalog zones. In this pattern a PowerDNS group takes the writes (online DNSSEC, ALIAS, LUA) and a BIND9 group serves the zones at the edge. Because PowerDNS signs, its group holds one server; the BIND9 secondaries carry the redundancy.
- In the PowerDNS group (
internal-pdnsin the docs), turn on catalog zones and name the catalog, for examplecatalog.example.com.. - In the BIND9 group (
edge-bind), create each zone as a secondary whosemasterslist points at the PowerDNS primary, and turn on catalog zones with the same catalog name. - Changes then flow from the UI to PowerDNS, which bumps the serial; BIND9 picks them up by NOTIFY and IXFR.
A Technitium group can stand in for either side over plain AXFR, but not with catalog zones in 1.0. The simpler alternative is per-zone placement: zones that need ALIAS or LUA live on PowerDNS, zones that need views or RPZ on BIND9, and zones that need DoQ or encrypted forwarding on Technitium.
Moving a BIND9 group to PowerDNS without downtime
Section titled “Moving a BIND9 group to PowerDNS without downtime”IPAM sync, RBAC and DDNS don’t change during this move, because they target zones by ID, not by engine.
- Pre-flight. Find the zones that use views or RPZ. PowerDNS can’t take them, so leave them on BIND9. If you’ll sign on PowerDNS, plan that group with one server and put redundancy in a secondary group.
- Stand up a PowerDNS group next to the BIND9 one and let its agent register.
- Copy by AXFR. Create each zone in the PowerDNS group as a secondary of the BIND9 primary. Wait a sync cycle (about 60 seconds) and check that
dig +short SOAreturns the same serial from both. Don’t edit records during this window. - Promote. Move each zone to the PowerDNS group and switch it from secondary to primary. BIND9 can stay on as a read-only secondary for a soft cutover.
With the zones on a one-server PowerDNS group, you can then sign them there and publish the new DS records at your registrar. If something goes wrong before you promote, BIND9 is still authoritative: switch the zones back. After you promote, the BIND9 secondary still serves the last good copy, so move the zone back to the BIND9 group and set it to primary.
Knowledge check
Section titled “Knowledge check”Go deeper
Section titled “Go deeper”- DNS driver specification: per-engine capabilities, the one-signer rule, dynamic-update ACLs, encrypted transports and the
technitium_apiscope - DHCP driver specification: Kea, Windows DHCP (including failover relationships) and FortiGate in detail
- DNS features: the driver-choice table and the feature gates
- Deployment topologies: the PowerDNS and BIND9 hybrid and the migration recipe
- Windows Server setup: WinRM, service accounts, zone settings and more than one Windows DHCP server in a group