DynDNS mit OpenWrt und NSD

Da ich nach einer eigenen DynDNS Möglichkeit gesucht habe, hier meine Lösung.

Voraussetzungen:

Router (dyndns.sh):

#!/bin/sh

IP=$(ifconfig eth1 | grep "inet addr:" | cut -d: -f2 | awk '{ print $1}')
OLDIP=$(dig +short dyn.domain.tld @ns1.domain.tld)

if [ "$IP" != "$OLDIP" ]
then
    ssh server "echo $IP > /USERNAME/.home.ip";
else
    exit 0;
fi

Server (dyndns.pl):

#!/usr/bin/perl

use strict;

my $date=`date +%Y%m%d%H`;

my $oldip=`dig \@ns1.domain.tld +short dyn.domain.tld`;
my $newip=`cat /USERNAME/.home.ip`;

chomp $date;
chomp $oldip;
chomp $newip;

if ( $oldip ne $newip ) {
    my @template=`cat /etc/nsd/template/dyn.domain.tld.template`;
    open (ZONEFILE, '>/etc/nsd/dyn.domain.tld.zone') or die "Error opening file";
    foreach my $line (@template) {
        $line =~ s/SERIAL/$date/g;
        $line =~ s/NEWIP/$newip/g;
        print ZONEFILE $line or die;
    }
    close (ZONEFILE);

    system("/usr/bin/systemctl restart nsd.service");
}

Beide Scripte sollten per cron automatisiert werden.

Zonendatei Vorlage (/etc/nsd/template/dyn.domain.tld.template):

; zone file for dyn.domain.tld

$TTL 300

@       IN      SOA     ns1.domain.tld. hostmaster.domain.tld. (
                        SERIAL
                        10800
                        3600
                        604800
                        300
        )

                NS      ns1.domain.tld. 
                NS      ns2.domain.tld. 

@               A       NEWIP


$ORIGIN dyn.domain.tld.

Fertig.