You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.8 KiB

homeserverdns: Dynamic DNS updater for home servers

homeserverdns monitors the IPv6 addresses (using the ip tool from iproute2). When it detects a change, it updates the A and AAAA records for a set of domains (and subdomains).

So far it has modules for these domain provider APIs:


  • iproute2
  • curl
  • miniupnpc (optional, see the Configuration section)
  • bind (optional, when using the DNS API)


There's no automated installation yet. As an example we install the two scripts homeserverdns-daemon and homeserverdns-update to /usr/bin and the configuration file to /etc.

sudo cp homeserverdns-daemon homeserverdns-update /usr/bin
sudo cp homeserverdns.cfg /etc

We create a user and adjust the permissions of the config file, so only that user can read it (and the credentials in it).

sudo useradd --system homeserverdns
sudo chown homeserverdns:root /etc/homeserverdns.cfg
sudo chown 0600 /etc/homeserverdns.cfg

If we want to use systemd to control homeserverdns, we need to install the service file homeserverdns.service. We have to make sure that the path of the config file and the User variable are correct in that file.

sudo cp homeserverdns.service /etc/systemd/system

Once the configuration is done we can start homeserverdns using

sudo systemctl start homeserverdns


All configuration options are described in more detail in homeserverdns.cfg. This is only an overview on the most important options.

First a protocol has to be defined, e.g.


For authentication at the domain provider, an authentication token has to be given. Some protocols require a user name and an API address, too.

user=           # not required for gandi
api_address=    # not required for gandi

Now the domains (and subdomains) we want to update A and AAAA records for have to be defined.

By default UPNP is used for detecting the server's public IPv4 address. So we should check if upnp works and returns the correct IPv4 address.

$ upnpc -s
ExternalIPAddress =

If we don't get a value for ExternalIPAddress, we should check our router and firewall settings. If UPNP does not work for us (e.g. in case the server is behind a Carrier Grade NAT), we can define our own method for looking up our public IPv4 address using the public_ip4_hook config option, e.g.

public_ip4_hook=curl -s -4