# Having MaraDNS be a master DNS server

A master (sometimes called primary) DNS server is a DNS server that other DNS servers can automatically transfer zone files from. There are limitations to this way of transferring zone files; zone files transferred this way lose all comments and the ordering of records in the zone file is usually changed.

In other words, DNS has a mechanism for automatically having multiple different servers have the same zone file data. This is akin to the `rsync` program; this allows one to change a zone file on the master machine, then have the slave machines automatically transfer the zone file from the master machine.

This is useful when one wants to have multiple machines serving DNS data. This is also useful when one wants to register a domain, but only has a single IP on the internet. There are a number of free DNS secondary (slave) services out there that one can use to have a second IP for a DNS server of a domain.

To set this up, one needs to run the `zoneserver` daemon in addition to the `maradns` daemon. Both daemons use the same `mararc` configuration file; there are a few `mararc` variables that affect the `zoneserver` daemon but not the `maradns` daemon (and vice versa).

When setting up a master DNS server, only one additional `mararc` variable needs to be set up, `zone_transfer_acl`. This variable needs to list the IPs of the slave DNS servers that will transfer zones from the master server. For example, if the slave DNS servers have the IPs 192.168.72.34, 10.34.56.98, and 172.17.23.37, the line will look like this:

> `zone_transfer_acl = "192.168.72.34, 10.34.56.98, 172.17.23.37"`

If you do not know the IPs of the slave DNS servers, you can allow any computer on the internet to connect to your zone server thusly:

> `zone_transfer_acl = "0.0.0.0/0"`

Note that this will make potentially private information public.

Something like this can also be done:

> `zone_transfer_acl = "192.168.42.0/24, 10.0.0.0/8, 172.19.0.0/16"`

This will allow any IP starting with "192.168.42" to connect to the zone server, any IP starting with "10" to connect to the zone server, and any IP starting with "172.19" to connect to the zone server.

Here is a example mararc file which is on the ip 10.1.2.3, and serves the zone `example.com` to the IPs 192.168.72.34, 10.34.56.98, and 172.17.23.37:

    ipv4_bind_addresses = "10.1.2.3"
    chroot_dir = "/etc/maradns"
    csv2 = {}
    csv2["example.com."] = "db.example.com"
    zone_transfer_acl = "192.168.72.34, 10.34.56.98, 172.17.23.37"

## How SOA records affect slave zone servers

The SOA record tells the slave zone servers how often to check to see if a zone file needs to be reloaded. Here is what a SOA record looks like:

> `example.com. SOA example.com. hostmaster@example.com. 1 7200 3600 604800 1800`

The first field is the name of the zone this SOA record is for.

The second field tells the csv2 parser that this is a SOA record.

The third field is the name of the machine which is the DNS master server for this zone.

The fourth field is the email address for the person in charge of this zone.

The fifth field (first numeric field) is what is called the "serial" number. This number is used by slave DNS servers to see if the zone file has changed. This number should be increased every time a zone file is changed. MaraDNS, when generating a synthetic SOA record, looks to see when the zone file was last changed, and uses a time stamp which updates every six seconds as the SOA serial number.

The sixth field (second numeric field) is the "refresh" for the domain; this is how often (in seconds) a slave DNS server could check to see if the serial on the master DNS server has changed.

The seventh field (third numeric field) is the "retry" for the domain; when the master DNS server is down, this is how often the slave DNS server will check to see if the master DNS server is up again. This value, like all time values, is in seconds.

The eight field (fourth numeric field) is the "expire" for the domain; this is how long the slave server will wait before no longer attempting to get a zone from a master DNS server when the master DNS server is down. This should be a large value.

The ninth field (fifth numeric field) is the "minimum" for the domain; this does not affect how MaraDNS processes a zone file and is not used by slave DNS servers (it determines the default/minimum TTL with other DNS servers).

The `zoneserver` program can also be used to serve other DNS records over TCP; see the file dnstcp for details.