colinardo
Goto Top

Mikrotik Scripting: Domain zu IPv6 Adresse(n) auflösen

Servus Mikrotik-User.

Mikrotik bietet leider keine explizite Funktion für das Auflösen von DNS-Namen zu IPv6 Adressen an. Die :resolve Funktion liefert hier präferiert IPv4 Adressen zurück auch wenn für die Domain eine IPv6 Adresse existiert, was man hiermit sehen kann
:put [:resolve dns.google.com]
Wenn man aber darauf angewiesen ist die IPv6 Pendants zu erhalten lässt sich dies mit einem Trick über eine temporär angelegte IPv6 Firewall Adressliste erreichen.
Man könnte jetzt auch zu Webdiensten und externen APIs greifen und einen http-Aufruf mittels /tool fetch auf dem Mikrotik machen, wollte das aber auf Bordmittel ohne externe Dienste begrenzen.

Habe das als Ergebnis mal in eine einfach zu nutzende globale Funktion gepackt:

back-to-topFunktion "$resolveipv6"

# define global function to resolve IPv6 DNS Names to IPs
:global resolveipv6 do={
    :local result [:toarray ""]      
    :local maxwait 5
    :local cnt 0
    :local listname "tmp-resolve$cnt"  
    /ipv6 firewall address-list {
        :do {
            :while ([:len [find list=$listname]] > 0) do={
                :set cnt ($cnt + 1)
                :set listname "tmp-resolve$cnt"  
            }
            :set cnt 0
            add list=$listname address=$1
            :while ([find list=$listname && dynamic] = "" && $cnt < $maxwait) do={:delay 1;:set cnt ($cnt +1)}  
            :foreach i in=[find list=$listname && dynamic] do={
                 :local rawip [get $i address]
                 :set result ($result, [:pick $rawip 0 [:find $rawip "/"]])  
            }
            remove [find list=$listname && !dynamic]
        }
     }
    :return $result
}

Die Funktion kann wenn sie einmal in einem Skript aufgerufen wurde so in Skripten oder auf der Konsole genutzt werden

back-to-topAusgabe der Adressen auf der Konsole (gibt bei mehreren Adressen ein Array zurück)

:put [$resolveipv6 "dns.google.com"]  
Ergibt dann im Beispiel ein Array aus zwei Adressen:
2001:4860:4860::8844;2001:4860:4860::8888

back-to-topErgebnis in einer Variablen speichern und einzelne Adressen über Indizes abrufen

:local myvar [$resolveipv6 "dns.google.com"]  
# get first address of result
:put [:pick $myvar 0]
# get second address of result
:put [:pick $myvar 1]

Wichtiger Hinweis: Wenn man die Funktion in einem Startup-Skript hinterlegt hat man sie in allen Skripten und der Konsole verfügbar sobald man sie einmalig mit diesem Aufruf deklariert:
:global resolveipv6

Eventuell irgendwann mal hilfreich für alle die gerne auf dem Mikrotik Skripten und bis Mikrotik selbst eine IPv6 fähige Resolve-Variante bereitstellt.

Gruß und alles gute für das neue Jahr.
@colinardo

Content-ID: 5151325448

Url: https://administrator.de/contentid/5151325448

Ausgedruckt am: 21.11.2024 um 13:11 Uhr

colinardo
colinardo 04.03.2024 aktualisiert um 12:27:52 Uhr
Goto Top

back-to-topUpdate 04.03.2024:


Die aktuelle Beta Version von RouterOS 7.15beta4 (2024-Mar-04 08:04) führt nun den type Parameter ein der dem User die Wahl der Ergebnisse erlaubt.

What's new in 7.15beta4 (2024-Mar-04 08:04):
*) console - added "type" parameter to ":resolve" command;

Beispiel:
:put [:resolve type=ipv6 dns.google.com]