netcup dyndns für Mikrotik Router

  • Moin,


    ich stehe aktuell vor einem Problem.

    Ich musste an meinem Offsite Standort die Technik austauschen. Also von einem raspberry Pi zu einem Mikrotik Hex als VPN Gateway.


    Für die DynDNS Aktualisierung über die netcup API hatte ich auf dem Pi den netcup-dyndns Docker Container verwendet
    https://hub.docker.com/r/b2un0/netcup-dyndns


    Der Mikrotik Router unterstützt keine Docker Container, da er eine mips CPU hat und routeros hier kein Docker zur Verfügung gestellt.


    Nun bin ich auf der Suche nach einer Lösung auf folgendes script für dyndns auf routeros gestoßen
    https://forum.mikrotik.com/viewtopic.php?t=180358


    Leider funktioniert das script nicht, weil wahrscheinlich Fehler drin sind.
    Ich habe mich versucht in die scripting Sprache von Mikrotik und JSON einzuarbeiten, bekomme es aber nicht auf die Kette.


    Hat jemand von euch ggf. ein dyndns Script auf Mikrotik RouterOS laufen, und kann dieses zur Verfügung stellen?

    Oder kann irgendwie weiterhelfen?


    Danke schon mal im Vorraus!

  • Ich habe gerade mal nachgeschaut. Lua wurde ab routeros 4 wurde Lua entfernt lt. Mikrotik (aktuell ist routeros 7) :(


    Die aktuell verwendete scripting Language ist hier erklärt:

    https://wiki.mikrotik.com/wiki/Manual:Scripting


    Ich muss auch sagen, das ich beim Thema scripten blutiger Anfänger bin :saint:


    Edit:
    Der Router kann auch kein bash oder phyton, sodass ich mir hier nicht auf diese Weise behelfen kann :(

  • Der funktioniert leider nicht richtig, da er Probleme mit dem Doppelnat hat (das ich zum aktuellen Zeitpunkt auch nicht ändern kann).


    Aktuell behelfe ich mir mit einer Subdomain eines Bekannten (der ist bei einem andern Hoster), welche durch einen simplen Webcall URL Aufruf die IP Änderung in den DNS Records übernimmt:

    https://docs.cpanel.net/cpanel/domains/dynamic-dns/



    Ist aber eigentlich nur eine vorrübergehende Notlösung.

  • Eine Update URL gibt es nicht fürs Netcup dyndns, dass muss über die API bedient werden. Von daher scheiden integrierte dyndns Updater üblicherweise aus. Ggf. geht was mit Scripten, was auch immer das RouterOS als Script-Sprache unterstützt. Ansonsten muss man auf externe Updater setzen, wie ddns oder so. Vielleicht gibt es sowas als Addon für den Router. Oder du lässt nur das ddns Update vom Raspi machen, unabhängig vom Router.

  • Eine Update URL gibt es nicht fürs Netcup dyndns, dass muss über die API bedient werden. Von daher scheiden integrierte dyndns Updater üblicherweise aus. Ggf. geht was mit Scripten, was auch immer das RouterOS als Script-Sprache unterstützt.

    Deshalb habe ich je auch gefragt, ob schonmal jemand ein Script für Mikrotiks routeros erstellt hat ;)


    ich würde mir routeros nicht mehr antun und gleich auf openwrt umflashen,

    dann kann man auch curl, jq etc. installieren und das problem in der bash lösen.

    Ich komme mit routeros super zurecht, bis auf das scripting :)


    Edit:

    So ich habe es jetzt immerhin soweit hinbekommen, das ich mich in der API einloggen kann mit einem routeros script.

    Mal sehen ob ich den rest auch noch im Laufe der nächten Tage hinbekomme :/

  • Update:

    Ich bin jetzt soweit, das ich den DNS Record über die API an Netcup senden kann :)


    Nur gibt es noch ein Problem dabei, es wird der Record zusätzlich angelegt, anstatt den vorhandenen zu ändern.

    D.h. existiert schon folgender Eintrag:


    Host Type Destination
    wurst A 1.1.1.1



    Wird daraus:

    Host Type Destination
    wurst A 1.1.1.1
    wurst A 2.2.2.2



    Mein befehl sieht aktuell folgendermaßen aus:

    Code
    http-data="{\"action\": \"updateDnsRecords\", \"param\": {\"apikey\": \"$APIkey\", \"apisessionid\": \"$SessionId\", \"customernumber\": \"$Number\",\"clientrequestid\": \"\" , \"domainname\": \"$Domain\", \"dnsrecordset\": { \"dnsrecords\": [ {\"id\": \"\", \"hostname\": \"$Hostname\", \"type\": \"$Type\", \"priority\": \"$Prio\", \"destination\": \"$Destination\", \"deleterecord\": \"false\", \"state\": \"yes\"} ]}}}" url="https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON"


    Was fehlt, damit der Record aktualisiert anstatt zusätzlich hinzugefügt wird?


    2. Frage:
    Gibt es irgendwo eine ausführliche Doku zur API?
    Im Wiki gibts nur diese "Kurzzusammenfassung", ich hab mir die Befehle nun aus anderen Projekten abgeschaut, angepasst.
    Ist aber nicht unbedingt einfach, das von anderen Programiersprachen zu übersetzen :(

  • Update 3:

    So das Script ist soweit fertig :thumbup:

    Bis auf den Problem, das der DNS Record immer noch ein weiteres mal erstellt wird :(


    Wie habt ihr das gelöst?

    Wäre es eine Möglichkeit den alten Record zu löschen und den neuen dann zu erstellen?


    Funktiosweise des Scripts für Mikrotik RouterOS:

    - überprüfen ob die WAN IP mit der IP des DNS Eintrags der Domain übereinstimmt.

    - entscheiden ob eine Änderung durchgeführt werden muss

    - Ergebnis ins Log schreiben

    - DNS Eintrag per API ändern wenn nötig

  • Also wenn ich mir das Script von oben ansehen, dann liest es den DNS Record aus, überschreibt nur die IP und schreibt den kompletten Datensatz wieder zurück. Machst du das genauso? Falls nicht, rate ich mal kühn, dass du einen Parameter in deinem Set anders setzt, als er bei netcup schon gesetzt ist, und das führt dann zur Generierung eines neuen Eintrags.

  • Also die Urschae ist wohl, das jeder DNS Eintrag eine ID hat.

    Diese muss vor dem Ändern einmal ausgelesen werden und bei der Änderung mitgeschickt werden.


    Das Problem ist nur, man kann nur alle DNS Einträge zusammen auslesen und bekommt dann eine entsprechende Ausgabe.

    In dieser Ausgabe muss dann nach der ID gesucht werden.


    Den passenden Regex Filter habe ich schonmal zusammengebastelt und getestet:

    Code
    /"id":"(?:\d{8})","hostname":"wurst"/gm



    Das Problem an dem ich jetzt sitze ist, das im RouterOS Script zu nutzen.
    Einige Zeichen sind beim "Mirkotik" Regex wohl anders :rolleyes:

  • Das Problem ist nur, man kann nur alle DNS Einträge zusammen auslesen und bekommt dann eine entsprechende Ausgabe.

    Genau. In dem Script oben schreibt er die Einträge in ein Array. Dann geht er in einer Schleife durch das Array, und wenn er den passenden Eintrag gefunden hat, aktualisiert er die IP und schreibt den ganzen Krempel zurück. Das wäre die Alternative zu "Suche die ID".

  • Das Problem ist, das alles was vom Server zurück kommt in ein Array geschrieben wird, das einen seltsamen Aufbau hat :rolleyes:

    In Zelle 1 kommt die komplette API Rückmeldung

    In Zelle 2 kommt immer "downloaded=0;status=finished"


    Um das ganze weiter bearbeiten zu können muss ich die Zelle 1 aus dem Array herauslösen und in einen String speichern.

    Den kann ich dann nach dem entsprechenden Inhalt durchsuchen.


    Für die Session ID hab ich das ganz einfach gelöst.

    Ich gebe ihm einfach vor, das er aus dem erstellten String den Inhalt von Zeichen 233 bis Zeichen 283 in eine eigene Variable kopiert.
    Ist zwar nicht oprimal, da aber die Rückmeldung vom Server immer gleich ist, geht das so aktuell.


    Bei den DNS Record IDs geht das natürlich nicht, da diese immer unterschiedlich sind.
    Hier kann ich nur mit Regex suchen und das dann in eine eigene Variable kopieren.


    Und nur daran hängt es noch, da ich kein Programmierer bin dauert alles etwas länger ^^

  • \d{8}

    aktuell sind es acht, in naher zukunft dann neun stellen.

    ich habe auch noch 5-stellige record-IDs.


    ich würde einfach auf digits prüfen, unabhängig der anzahl.

    ebenso auf type A (AAAA), alle anderen typen interessieren ja nicht.

    »Hauptsache BogoMIPS!«

    Fleischfresser

    6 Mal editiert, zuletzt von Olivetti ()

  • Ist das nix standardisiertes, JSON oder so, wo man einfach ne Bibliothek oder ein Executeable drauf loslässt? Den Parser muss man ja nicht selber implementieren.


    90% der Arbeit eines guten Entwicklers ist es, zu gucken, ob ein anderer Idiot das Problem schon gelöst hat.

  • normales json, deshalb schrieb ich oben in #7 'jq'.

    damit mache ich es jedenfalls (also nicht dyndns, sondern ncdapi.sh basiertes SOA und DNSSEC setzen, weil dnscontrol/netcup das (noch) nicht kann).


    das problem ist hier routeros. da kriegst du vermutlich nix drauf und LUA ist halt auch weg…

    In dem Script oben schreibt er die Einträge in ein Array.

    zwischenfrage: welches obige script – oder bin ich blind?!

    »Hauptsache BogoMIPS!«

    Fleischfresser

    5 Mal editiert, zuletzt von Olivetti ()