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
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
Habe das als Ergebnis mal in eine einfach zu nutzende globale Funktion gepackt:
Die Funktion kann wenn sie einmal in einem Skript aufgerufen wurde so in Skripten oder auf der Konsole genutzt werden
Ergibt dann im Beispiel ein Array aus zwei Adressen:
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:
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
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]
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:
Funktion "$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
Ausgabe der Adressen auf der Konsole (gibt bei mehreren Adressen ein Array zurück)
:put [$resolveipv6 "dns.google.com"]
2001:4860:4860::8844;2001:4860:4860::8888
Ergebnis 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
Please also mark the comments that contributed to the solution of the article
Content-ID: 5151325448
Url: https://administrator.de/contentid/5151325448
Printed on: October 16, 2024 at 00:10 o'clock
1 Comment