Summary
git Use ID
Collection of scripts to manage various aspects of dynamic DNS
Download as zip
jdm 97459518fad8
5 months ago
jdm cb0e1dd0e84a
5 months ago
jdm 2da68157a599
5 months ago
jdm 7b0bfba024a1
5 months ago
jdm a1e78d462666
5 months ago
jdm 545b985cae31
5 months ago
jdm 7061896edbda
5 months ago
jdm 726ed2a21c45
5 months ago
jdm 59542bb87f17
6 months ago
jdm b5d846201758
6 months ago

DDNS-Utils

A collection of scripts to manage various aspects of using dynamic DNS, usually to cope with dynamic IP addressing

he-dyndns

A Python-based script to update dynamic DNS records when using the Hurricant Electric DNS service at dns.he.net. This code is designed to ba maximally portable by relying on standard Python 3 libraries. It is not compatible with Python 2.

ddns-update-rfc2136

A Python-based script to update DNS records in a master server that is RFC2136-compliant and supports TSIG-based updates. This script is a wrapper around nsupdate(1). Properly configured TSIG keys are needed.

RouterOS Script for Address List Updates (ros-ddns-addrlist)

A small RouterOS script for Mikrotik RouterOS to query a DNS name and put that IP address into an AddressLis. Note that the :resolve function doesn't support RR types. If there's an A you get that. If there's no A, you get AAAA. If there's neither, the script will bomb.

he-dyndns Installation / Use

There is really nothing to install unless you need to add Python3 stock libraries to your system. Copy he-dyndns somewhere useful such as /usr/local/bin.

For Debian/Ubuntu systems: apt install python3-dns python3-dnspython python3-urllib3

For Fedora systems: dnf install python3-dns python3-urllib3

Configuration

Unless using the --key argument, keys for the dyanmic record are read from /etc/he-dyndns.conf or from an alternative location specified by --keyfile. The configuration file format is one section [keys] with record = key pairs. For example:

[keys]
dynamic.example.com = 123412341234

Other configuration sections will be ignored.

Usage

usage: he-dyndns [-h] [--v4] [--v6] [--addr4 ADDR4] [--addr6 ADDR6] [--key KEY] [--debug] record

Update Hurricane Electric DNS dynamic record

positional arguments:
  record             DNS record to update

optional arguments:
  -h, --help         show this help message and exit
  --v4               Update IPv4 A record (default)
  --v6               Update IPv6 AAAA record
  --addr4 ADDR4      Update A record with provided IP rather than detected IP
  --addr6 ADDR6      Update AAAA record with provided IP rather than detected IP
  --keyfile KEYFILE  Alternate location for key config file (default /etc/he-dns-secret.conf)
  --key KEY          HE DDNS key for record (by default read from /etc/he-dns-secret.conf or --keyfile)
  --debug            Enable debug logging

Return Values

Returns 0 on success (successful change or no change) or 1 on failure. Failures also include a single line error message.

ddns-update-rfc2136 Installation/Use

This script relies on the netifaces and subprocess libraries that are not always installed by default in Python3. Install those modules from apt, dnf, or pip as appropriate for your system.

Copy ddns-update-rfc2136 somewhere useful such as /usr/local/bin.

Configuration

The script expects there to be a file /etc/ddns-RECORD.key for every record being updated containing only the TSIG key for that record. For example, updating the record foo.example.com should have a file named /etc/ddns-foo.example.com.key available with that RR's key. It's possible to specify --keyfile to select an alternate location. Make sure that the key file is properly protected so only authorized users can view the contents.

General Use

This script finds the appropriate IP address from the interface specified in the interface position and then updates the record record in the zone zone on server server.

For IPv4, each address is on a unique sub interface - e.g. eth0 vs eth0:0. To use the IP address other than the main interface's, specify the sub interface as show by ifconfig or ip addr list (see global secondary addresses)

For IPv6, the script will take the numerically first address assigned to the interface. If there is no IPv6 address other than a link-scope address (i.e. an fe80:: address), then it will use the link-scope address - however that's probably not what's really desired.

The script defaults to IPv6 addresses because that's what the original issue it was written for was solved to address and it's long past time the Internet has a v6-first attitude. It is not necessary to use the --v6 flag, but it's included for pretty completeness.

Example Usage

To /usr/local/bin/ddns-update-rfc2136 enp1s0 foo.example.com example.com 192.0.2.2

Usage

usage: ddns-update-rfc2136 [-h] [--v4] [--v6] [--addr4 ADDR4] [--addr6 ADDR6] [--ttl TTL] [--keyfile KEYFILE] [--debug]
                           interface record zone server

Update dynamic DNS records using RFC2136

positional arguments:
  interface          interface to obtain IP from (for IPv6, takes the numerically first global address on the interface)
  record             DNS record to update
  zone               Zone name to update (e.g. example.com)
  server             Server to update (IP or FQDN)

optional arguments:
  -h, --help         show this help message and exit
  --v4               Update IPv4 A record
  --v6               Update IPv6 AAAA record (default)
  --addr4 ADDR4      Update A record with provided IP rather than detected IP (causes 'interface' to be ignored)
  --addr6 ADDR6      Update AAAA record with provided IP rather than detected IP (causes 'interface' to be ignored)
  --ttl TTL          TTL to assign to record (default 300)
  --keyfile KEYFILE  Alternate location for key config file (default /etc/ddns-RECORD.key where RECORD is the record name provided
                     as the argument)
  --debug            Enable debug logging