Mikrotik Routerboard: DDNS-Update per Script

Update am 03.08.2020: Script-Variante für Strato hinzugefügt

In meinem Netzwerk arbeitet ein Mikrotik Routerboard RB2011UAS-RM und managed den Datenverkehr ins Internet. Zurecht werden Mikrotik-Router vielerorts gelobt. Allerdings haben sie auch eine kleine Schwäche: Dynamische DNS-Dienste wie DynDNS, NoIp, oder andere werden nicht unterstützt, sondern lediglich Mikrotiks Cloud-Lösung. Mein Domain-Anbieter bietet ebenfalls einen DDNS-Dienst und diesen möchte ich auch nutzen. Möglich macht das ein Script.

Grundlagen zur Scriptverarbeitung

Der Aufbau erfolgt in zwei Stufen:

  1. Das Script anlegen
  2. Einen Timer einsetzen, der das Script regelmäßig antriggert

Den Timer habe ich bei mir auf eine Minute gestellt, also wird das Script jede Minute ausgeführt. Jedoch bedeutet das nicht, dass auch jede Minute ein Update gesendet wird, denn das Script wertet aus, ob sich die IP-Adresse überhaupt geändert hat. Hat sie das nicht, wird auch kein Update an den DDNS-Dienst gesendet.

DDNS-Update-URL

Das DDNS-Update wird per einfachem HTTP-Request durchgeführt. Man könnte also die passende URL auch in einem Browserfenster eintippen und würde das gewünschte Ergebnis erreichen.

Mein alter Anbieter (Formality Deutschland) hatte mir folgende Angaben zum DDNS-Update gemacht:

Fritz-Box Dynamic DNS-Einstellungen
Dynamic DNS-Anbieter: Benutzerdefiniert
Update-URL:
https://dyndns.formality.de/nic/update/?username=<username>&password=<pass>&hostname=<domain>&myip=<ipaddr>

Domainname: xxx.domain.com
Benutzername: xxxxxxxxxxx
Kennwort: xxxxxxxxxxx

Beispiel-Update-URL:
https://dyndns.formality.de/nic/update/?username=xxxxxxxxxxx&password=xxxxxxxxxxx&hostname=xxx.domain.com&myip=127.0.0.1

Mein neuer Anbieter (Strato) hatte mir folgende Angaben zum DDNS-Update gemacht.

Fritz-Box Dynamic DNS-Einstellungen
Dynamic DNS-Anbieter: STRATO AG
Domainname: name.wunschname.de (Hinweis: in der bebilderten Anleitung von Strato steht in diesem Feld nur wunschname.de, allerdings soll hier die Subdomain eingetragen werden)
Benutzername: wunschname.de
Kennwort: xxxxxxxxxxx

Beispiel-Update-URL:
https://ihredomain.de:DynDNS-Passwort@dyndns.strato.com/nic/update?hostname=subdomain.ihredomain.de&myip=192.XXX.X.X

Update-Script

Scripte sind in WinBox unter System > Scripts zu finden. Dort klicken wir auf das +, tragen einen passenden Namen ein und kopieren das Script in das Source-Feld.

Mikrotik: DDNS-Update-Script

Mikrotik: DDNS-Update-Script

Die Vorlage für das Script habe ich aus dem Mikrotik-Forum und so angepasst, dass die URL wie durch meinen Anbieter vorgegeben zusammengesetzt wird. Auf den ersten 4 Zeilen müssen noch die Werte angepasst werden:

  • Zeile 1: Der vom Anbieter zugewiesene Benutzername
  • Zeile 2: Das vom Anbieter zugewiesene Passwort
  • Zeile 3: Das Interface, dessen IP-Änderung überwacht werden soll
  • Zeile 4: Den Hostnamen, unter dem der heimische Anschluss erreichbar sein soll

Formality:

:global ddnsuser "xxxxxxxxxxx"
:global ddnspass "xxxxxxxxxxx"
:global theinterface "pppoe-out1"
:global ddnshost1 "xxx.domain.com"

:global ipddns
:global ipfresh [/ip address get [find where interface=$theinterface] value-name=address]     

:if ([ :typeof $ipfresh ] = nil ) do={

    :log info ("DynDNS: No ip address on $theinterface .")

} else={

    :for i from=( [:len $ipfresh] - 1) to=0 do={ 

        :if ( [:pick $ipfresh $i] = "/") do={ 

            :set ipfresh [:pick $ipfresh 0 $i];

        } 
    }

    :if ($ipddns != $ipfresh) do={

        :log info ("DynDNS: IP-DynDNS = $ipddns")
        :log info ("DynDNS: IP-Fresh = $ipfresh")
        :log info "DynDNS: Update IP needed, Sending UPDATE...!"

        :global str1 "/nic/update/\?username=$ddnsuser&password=$ddnspass&hostname=$ddnshost1&myip=$ipfresh"
        /tool fetch address=dyndns.formality.de src-path=$str1 mode=https dst-path=("/DynDNS.".$ddnshost1)

        :delay 1

        :global str1 [/file find name="DynDNS.$ddnshost1"];
        /file remove $str1
        :global ipddns $ipfresh
        :log info "DynDNS: IP updated to $ipfresh!"

    } else={

        :log info "DynDNS: dont need changes";

    }
}

Strato:

:global ddnsuser "xxxxxxxxxxx"
:global ddnspass "xxxxxxxxxxx"
:global theinterface "pppoe-out1"
:global ddnshost1 "xxx.domain.com"

:global ipddns
:global ipfresh [/ip address get [find where interface=$theinterface] value-name=address]     

:if ([ :typeof $ipfresh ] = nil ) do={

	:log info ("DynDNS: No ip address on $theinterface .")

} else={

	:for i from=( [:len $ipfresh] - 1) to=0 do={ 

		:if ( [:pick $ipfresh $i] = "/") do={ 

			:set ipfresh [:pick $ipfresh 0 $i];

		} 
	}

	:if ($ipddns != $ipfresh) do={

		:log info ("DynDNS: IP-DynDNS = $ipddns")
		:log info ("DynDNS: IP-Fresh = $ipfresh")
		:log info "DynDNS: Update IP needed, Sending UPDATE...!"

		:global str1 "/nic/update\?hostname=$ddnshost1&myip=$ipfresh"
		/tool fetch address=dyndns.strato.com src-path=$str1 user=$ddnsuser password=$ddnspass mode=https dst-path=("/DynDNS.".$ddnshost1)

		:delay 1

		:global str1 [/file find name="DynDNS.$ddnshost1"];
		/file remove $str1
		:global ipddns $ipfresh
		:log info "DynDNS: IP updated to $ipfresh!"

	} else={

		:log info "DynDNS: dont need changes";

	}
}

Auf den Zeilen 30 und 31 kann man den Aufbau der URL und den Zielserver nach belieben anpassen.

Vergleicht man die Scripte für beide Anbieter, so stellt man schnell fest, dass man nur geringfügige Änderungen vornehmen muss. Natürlich ist die Update-Adresse (Domain) eine andere, sonst unterscheiden beide nur in einem / in der Adresse, sowie der Art und Weise, wie Benutzername und Passwort übergeben werden:

Formality möchte beides als Parameter am Ende der Adresse übergeben haben, Strato hingegen setzt auf Basic Auth, wobei Benutzername und Passwort vor den Domainnamen gesetzt werden. Dafür werden die Parameter user und password des fetch-Befehls verwendet.

Periodischer Aufruf per Timer

Fehlt nur noch, das Script regelmäßig aufzurufen, damit es seinen Dienst verrichten kann. Dazu nutzen wir die Funktion Scheduler, die unter System > Scheduler zu finden ist. Wir legen mit + einen neuen Timer an, verpassen ihm einen gefälligen Namen, tragen als Intervall 00:01:00 ein und als Event den Scriptaufruf /system script run dynDNS.

Mikrotik: der Scheduler ruft das Script regelmäßig auf

Mikrotik: der Scheduler ruft das Script regelmäßig auf

Das ganze läuft ziemlich zuverlässig. Zu beachten gibt es eigentlich nur eins: Wenn man das Script umbenennt, muss mal auch den Aufruf im Timer entsprechend anpassen.

Weblinks

Sebastian

2 Comments

  1. Avatar
    Antworten Frank

    Hallo Sebastian,
    zunächst vielen Dank für die fabelhafte Anleitung!
    Zu Zeile 31 des Scripts habe ich eine Verständnisfrage und zwar dem folgenden Teil:

    dst-path=(„/DynDNS.“
    Was gibt dieser Teil des Scripts an bzw was bewirkt er?

    Vorab vielen Dank.

    Gruß,
    Frank

    • Avatar
      Antworten Stefan

      @Frank: Das ist der Präfix der Ausgabedatei, wo das Ergebnis dess https-requests hingeschrieben wird.
      Die Datei könntest du dir zB mit der Winbox ansehen, wenn sie nicht in Zeile 36 gleich wieder gelöscht würde.

      Ansonsten könnte man den Query-String auch als Variable gestalten.
      So wie das Script geschrieben ist, passt es nur für dyndns.formality.de, das muss natürlich auch angepasst werden.

      VG Stefan

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.