MikroTik – Automatische Updates für dynamisches DNS

ACHTUNG: Aktuell gibt es ein Bug in RouterOS 7.13, was den “fetch” für IPv6-Adressen unmöglich macht. Es ist daher mit ROS7.13 nur möglich, IPv4 Adressen zu ermitteln!
HIER gibts mehr Infos dazu.


Wer ein DDNS-Dienst nutzen möchte, um sich z.B. per Domain bequem von unterwegs aus per VPN in sein Heimnetz einwählen zu können, steht vor einem kleinen Problem.
Wie kann ich dem MikroTik Router beibringen, die aktuelle IP-Adresse an den DNS-Dienst zu übermitteln?
Es gib kein Tool was das für uns automatisch erledigt.
Was bleibt uns also noch übrig?
Richtig, ein kleines Script.

In dieser kurzen Anleitung will ich dir zeigen, wie du eine automatische Aktualisierung der IP-Adressen hin bekommst.
Das Script kann für viele DDNS-Anbieter angepasst werden.
Ich gehe hier das ganze am Beispiel mit dem Anbieter deSEC durch.

Was brauchen wir?
– Vollen Zugriff zu RouterOS
– Einen Account mit funktionierenden Zugangsdaten bei einem DNS-Anbieter
– Eine Internetverbindung

1. Logge dich bei deinem DNS-Anbieter ein und erkundige dich dort, wie wir ein Update der IP-Adressen anstoßen können.
Im Fall von deSEC, müssen wir die IP-Adressen per API an den Dienst übermitteln, welche hinterlegt werden sollen.
2. Besorge dir falls notwendig, einen API-Schlüssel
>> deSEC-Tokens
>> IPv64.net

3. Öffne WinBox und logge dich auf deinem MikroTik-Router einwählen
4. Gehe auf System → Scheduler
5. Lege eine neue Aufgabe an
– Name: Wähle ein guten Namen aus
– Start Date: Wähle ein Datum in der Vergangenheit am besten aus
– Start Time: Wähle eine Uhrzeit aus, ab wann das Script starten soll (am besten auch in der Vergangenheit)
– Interval: Setze hier einen Intervall von z.B. einer Stunde, um die IP-Adressen jede Stunden an den Dienst zu schicken (ist meiner Meinung nach ganz gut)
– Policy: Hake alles an
6. Füge nun folgendes Script bei „On Event“ ein und passe es auf deine Bedürfnisse an:

:local domain "TRAGE HIER DEINE DOMAIN VON deSEC EIN";
:local token "TRAGE HIER DEIN API-TOKEN EIN";

log info "Aktualisiere die IP-Adressen"

:local ipv4 ([/tool fetch url="https://checkipv4.dedyn.io/" as-value output=user]->"data");
log info "Die aktuelle IPv4 ist $ipv4"

:local ipv6 ([/tool fetch url="https://checkipv6.dedyn.io/" as-value output=user]->"data");
log info "Die aktuelle IPv4 ist $ipv6"

:local result [/tool fetch user="$domain" password="$token" url="https://update.dedyn.io/update?myipv4=$ipv4&myipv6=ipv6" output=user as-value]

:if ($result->"status" = "finished") do={
   log info "Die IP-Adresse wurde erfolgreich aktualisiert!"
} else={
   log error "FEHLER! Es gab wohl ein Problem beim aktualisieren der IP-Adresse!"
}

Was tut es?

:local domain + token
Hier wird nach deiner deSEC-URL und deinem API-Schlüssel gefragt, die im Script dann mitgegeben werden.

:local ipv4
Wir ermitteln durch das aufrufen der Check-Seite, welche öffentliche IPv4 wir haben.
Dieser Wert wird im RAM festgehalten und ist über die Variable „ipv4“ nutzbar.
Hast du keine eigene öffentliche IPv4-Adresse, kommentiere diese Zeile einfach per # aus und entferne den Bereich der Übergabe bei :local result.

:local ipv6
Wir ermitteln durch das aufrufen der Check-Seite, welche öffentliche IPv6 wir haben.
Dieser Wert wird im RAM festgehalten und ist über die Variable „ipv6“ nutzbar.
Hast du keine eigene öffentliche IPv6-Adresse, kommentiere diese Zeile einfach per # aus und entferne den Bereich der Übergabe bei :local result.

:local result
Hier wird nun die URL zusammengebaut, um an deSEC die aktuellen IP-Adressen zu übermitteln.
Wenn du z.B. keine öffentliche IPv4-Adresse hast, entferne einfach bei der URL den Bereich „myipv4=$ipv4&“.
Das gleiche gilt für IPv6. Dort einfach bei Bedarf den Part „&myipv6=ipv6“ entfernen, sofern nicht benötigt.

:if
Hier wird einfach ein Log ausgegeben, um den aktuellen Status des Scripts im Log zu sehen.

7. Speichere das Script ab und lass es laufen


Je nach dem was für einen DNS-Anbieter du ausgewählt hast, kann das Script noch kürzer gefasst werden.
Manche Anbieter haben eine API-Schnittstelle, welche direkt die IPv4 und IPv6-Adresse ermitteln kann.
Somit muss nur eine Abfrage mit dem „fetch“-Befehl gemacht werden.


Alle Infos lokal ermitteln

Falls du die IP-Adressen lieber direkt von der Schnittstelle auslesen willst, hier ein kleines Script.
Dies muss allerdings auf deine Bedürfnisse angepasst werden.

# Globale Variablen erstellen
:global addressWithoutSubnetAndDoubleColonAtTheEnd
:global ipv4addressWithoutSubnet

# IPv4 ermitteln
:local ipv4Address [/ip address find where interface="XXXXXXXXXXXX"]
:if ($ipv4Address != "") do={
  :local address [/ip address get $ipv4Address value-name=address]
  :set ipv4addressWithoutSubnet [:pick $address 0 ([:find $address "/"] - 0)]
  :put $ipv4addressWithoutSubnet
  log info "Die erkannte IPv4 Adresse ist $ipv4addressWithoutSubnet"
} else={
  :put "Habe keine IPv4 Adresse auf der Schnittstelle XXXXXXXXXXXX gefunden"
}
														  

# IPv6 ermitteln
:local ipv6Address [/ipv6 address find where interface="XXXXXXXXXXXX" and address~"2a"]
:if ($ipv6Address != "") do={
  :local address [/ipv6 address get $ipv6Address value-name=address]
  :local addressWithoutSubnet [:pick $address 0 ([:find $address "/"] - 1)]
  :set addressWithoutSubnetAndDoubleColonAtTheEnd ($addressWithoutSubnet . ":")
  :put $addressWithoutSubnetAndDoubleColonAtTheEnd
  log info "Die aktuelle IPv6 ist $addressWithoutSubnetAndDoubleColonAtTheEnd"
} else={
  :put "Habe keine IPv6 Adresse auf der Schnittstelle XXXXXXXXXXXX gefunden"
}

log info "$addressWithoutSubnetAndDoubleColonAtTheEnd"
log info "$ipv4addressWithoutSubnet"

Du musst in diesem Script, die XXXXXXXXXXXX durch die jeweiligen Schnittstellennamen ersetzen.
Bei IPv4 ist es in der Regel die WAN-Schnittstelle oder z.B. PPPoE.
Bei IPv6 kann es die WAN-Schnittstelle sein, es kann aber hier auch z.B. die LAN-Brücke sein.


Noch mehr Scripts benötigt?

Ich bin auf die Seite eworm gestoßen.
Hier gibts jede Menge Scripts für RouterOS!
https://git.eworm.de/cgit/routeros-scripts/about/

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.