Upgrading BIND without breaking DNS is surprisingly less about the new version and more about meticulously managing the transition of authority.

Let’s see BIND in action, specifically how it handles zone transfers and reloads. Imagine a primary DNS server ns1.example.com and a secondary ns2.example.com, both running BIND.

On ns1.example.com:

# Current zone file for example.com
$TTL 3600
@       IN      SOA     ns1.example.com. admin.example.com. (
                        2023102701 ; Serial
                        3600       ; Refresh
                        1800       ; Retry
                        604800     ; Expire
                        86400 )    ; Negative Cache TTL
;
@       IN      NS      ns1.example.com.
@       IN      NS      ns2.example.com.
ns1     IN      A       192.168.1.10
ns2     IN      A       192.168.1.11
www     IN      A       192.168.1.20

When ns1 is updated (e.g., a new record added, or the serial incremented), you’d typically signal BIND to reload:

sudo rndc reload example.com

On ns2.example.com, you’d see the transfer happening:

# Checking logs on ns2.example.com for zone transfer activity...
# Example log snippet:
# ... named[1234]: zone example.com/IN: Transfer of 'example.com/IN' from 192.168.1.10#53: Transfer completed: 10 records received, 10 added.

This is the core mechanism: the primary increments its serial, secondaries detect this change and pull the updated zone data. The upgrade process needs to ensure this dance continues uninterrupted.

The problem BIND solves is distributed, fault-tolerant name resolution. It’s the backbone that translates human-readable domain names into machine-readable IP addresses across the internet. Each BIND server holds copies of zone data, serving queries and ensuring that if one server is down, others can still resolve names. An upgrade must maintain this availability and accuracy.

Internally, BIND manages zone data in memory and on disk. When a zone is loaded or reloaded, BIND parses the zone file, stores it in its internal database, and makes it available for querying. For secondary servers, it uses the DNS protocol itself (specifically, zone transfers via AXFR or IXFR) to synchronize zone data from primary servers. The serial number in the SOA record is the key indicator for secondaries to request updates.

The levers you control are primarily the named.conf configuration file, zone file serial numbers, and the rndc utility for controlling the BIND process. You can also influence behavior through named.conf options like allow-transfer and notify.

Here’s the mental model: BIND is a stateful service. It maintains zone data and its own operational state. An upgrade is essentially replacing the binary (named) while the service is running, ensuring it picks up its existing state and continues serving queries without interruption, and critically, that its peers (other DNS servers) continue to recognize it as authoritative.

The most surprising true thing about upgrading BIND without breaking DNS is that the version of BIND on the secondary servers doesn’t strictly need to match the primary’s version during the upgrade process, as long as the protocol for zone transfers remains compatible. This is because the zone data itself, and the serial number negotiation, are the primary mechanisms for synchronization, not the BIND binary version on every single server. You can upgrade a primary to BIND 9.18.x, and as long as the secondaries are running a compatible BIND version (e.g., 9.11.x or later), they will still be able to perform zone transfers and receive the updated zone data, provided their configuration allows it. The critical part is ensuring the new primary is running the new version before its peers start relying on it.

The next challenge you’ll face is configuring DNSSEC signing and validation with the new BIND version.

Want structured learning?

Take the full Bind course →