
Schnelle DNS-Nachschlagebibliothek und CLI-Tool
ZDNS ist ein Hochgeschwindigkeits-DNS-Resolver und ein Befehlszeilenwerkzeug zur Durchführung von großflächigen DNS-Messungen. ZDNS ist in Go geschrieben und enthält einen eigenen rekursiven Auflösungscode sowie einen Cache, der für die Suche einer Vielzahl von Namen optimiert ist. Wir verwenden https://github.com/zmap/dns zum Erstellen und Parsen von rohen DNS-Paketen. Weitere Informationen zur Architektur und Leistung von ZDNS finden Sie im folgenden Paper, das auf der ACM Internet Measurement Conference '22 erschienen ist.
[!TIP] Das ZDNS Wiki enthält zusätzliche Informationen zu ZDNS und führt durch Anwendungsfälle und Beispiele.
ZDNS kann installiert werden, indem das Repository ausgecheckt und make install ausgeführt wird.
git clone https://github.com/zmap/zdns.git
cd zdns
make install
ZDNS besteht aus einer rekursiven Resolver-Bibliothek und einem CLI-Wrapper.
Die Bibliothek besteht aus einer ResolverConfig-Struktur, die alle Konfigurationsoptionen für alle durchgeführten Lookups enthält. Die ResolverConfig wird verwendet, um 1+ Resolver-Strukturen zu erstellen, die alle Lookups durchführen. Ein Resolver sollte nur einen einzelnen Lookup gleichzeitig durchführen (er ist nicht threadsicher) und mehrere Resolver-Strukturen sollten für Parallelisierung verwendet werden. Siehe unsere Beispiele zur Verwendung der Bibliothek. Module werden verwendet, um das Verhalten der Lookups zu definieren.
ZDNS bietet verschiedene Arten von Modulen:
Raw DNS-Module liefern die rohe DNS-Antwort vom Server, ähnlich wie dig, jedoch im JSON-Format. Es gibt ein Modul für (fast) jeden DNS-Record-Typ.
Lookup-Module liefern hilfreichere Antworten, wenn mehrere Abfragen erforderlich sind (z. B. Durchführung einer zusätzlichen A-Abfrage für IP-Adressen, wenn ein NS in NSLOOKUP empfangen wird).
Sonstige Module bieten weitere zusätzliche Möglichkeiten zur Abfrage von Servern (z. B. bind.version).
Wir beschreiben die Module im Folgenden:
Die Module A, AAAA, AFSDB, ANY, ATMA, AVC, AXFR, BINDVERSION, CAA, CDNSKEY, CDS, CERT, CNAME, CSYNC, DHCID, DMARC, DNSKEY, DS, EID, EUI48, EUI64, GID, GPOS, HINFO, HIP, HTTPS, ISDN, KEY, KX, L32, L64, LOC, LP, MB, MD, MF, MG, MR, MX, NAPTR, NID, NINFO, NS, NSAPPTR, NSEC, NSEC3, NSEC3PARAM, NSLOOKUP, NULL, NXT, OPENPGPKEY, PTR, PX, RP, RRSIG, RT, SVCBS, MIMEA, SOA, SPF, SRV, SSHFP, TALINK, TKEY, TLSA, TXT, UID, UINFO, UNSPEC und URI liefern die rohe DNS-Antwort im JSON-Format, ähnlich wie dig.
Zum Beispiel liefert der Befehl:
echo "censys.io" | zdns A
zurück:
{
"name": "censys.io",
"results": {
"A": {
"data": {
"additionals": [
{
"flags": "",
"type": "EDNS0",
"udpsize": 512,
"version": 0
}
],
"answers": [
{
"answer": "104.18.10.85",
"class": "IN",
"name": "censys.io",
"ttl": 300,
"type": "A"
},
{
"answer": "104.18.11.85",
"class": "IN",
"name": "censys.io",
"ttl": 300,
"type": "A"
}
],
"protocol": "udp",
"resolver": "[2603:6013:9d00:3302::1]:53"
},
"duration": 0.285295416,
"status": "NOERROR",
"timestamp": "2024-08-23T13:12:43-04:00"
}
}
}
Rohe DNS-Antworten liefern häufig nicht die Daten, die Sie möchten. Beispielsweise enthält eine MX-Antwort möglicherweise nicht die zugehörigen A-Records im zusätzlichen Abschnitt, was eine zusätzliche Abfrage erforderlich macht. Um diese Lücke zu schließen und eine benutzerfreundlichere Oberfläche bereitzustellen, bieten wir auch mehrere Lookup-Module an: alookup, mxlookup und nslookup.
alookup verhält sich ähnlich wie nslookup und folgt CNAME-Records.
mxlookup führt zusätzlich eine A-Abfrage für die IP-Adressen durch, die einem Exchange-Record entsprechen.
nslookup führt zusätzlich eine A/AAAA-Abfrage für IP-Adressen durch, die einem NS-Record entsprechen.
Zum Beispiel:
echo "censys.io" | zdns mxlookup --ipv4-lookup
gibt zurück:
{
"name": "censys.io",
"results": {
"MXLOOKUP": {
"data": {
"exchanges": [
{
"class": "IN",
"ipv4_addresses": [
"209.85.202.27"
],
"name": "alt1.aspmx.l.google.com",
"preference": 5,
"ttl": 300,
"type": "MX"
},
{
"class": "IN",
"ipv4_addresses": [
"142.250.31.26"
],
"name": "aspmx.l.google.com",
"preference": 1,
"ttl": 300,
"type": "MX"
}
]
},
"duration": 0.154786958,
"status": "NOERROR",
"timestamp": "2024-08-23T13:10:11-04:00"
}
}
}
ZDNS unterstützt auch spezielle "Debug"-DNS-Abfragen. Zu den Modulen gehören: BINDVERSION.
ZDNS unterstützt die Bereitstellung von Eingaben in verschiedenen Formaten, abhängig vom gewünschten Verhalten.
Die grundlegendste Eingabe ist eine Liste von Namen, die durch Zeilenumbrüche getrennt sind. Zum Beispiel:
Über stdin:
echo "google.com\nyahoo.com" | zdns A
cat list_of_domains.txt | zdns A
Aus einer Datei:
zdns A --input-file=list_of_domains.txt
Wenn Sie nicht viele Domains auflösen müssen, wird die Angabe der Domain als CLI-Argument ähnlich wie bei dig aus Gründen der Benutzerfreundlichkeit unterstützt.
Zum Beispiel:
zdns A google.com --name-servers=1.1.1.1
Entspricht dig -t A google.com @1.1.1.1
Normalerweise wählt ZDNS für jede Domain-Abfrage einen zufälligen Nameserver aus --name-servers aus. Wenn Sie stattdessen für jede Domain einen anderen Nameserver angeben möchten, können Sie dies tun, indem Sie Paare von domainName,nameServerIP durch Zeilenumbrüche getrennt angeben. Dies überschreibt alle mit --name-servers angegebenen Nameserver.
Zum Beispiel:
echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
Sie sehen den resolver wie angegeben für jede Domain in der Ausgabe (zur Kürze redigierte Zusätze/Antworten):
$ echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
{"name":"google.com","results":{"A":{"data":{"additionals":...,"answers":[...],"protocol":"udp","resolver":"1.1.1.1:53"},"duration":0.030490042,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}
{"name":"facebook.com","results":{"A":{"data":{"additionals":[...],"answers":[...],"protocol":"udp","resolver":"8.8.8.8:53"},"duration":0.061365459,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}
Zonendateien (von ICANN CZDS oder ähnlich) können als Eingabequelle für ZDNS mit dem Flag --zone-file verwendet werden. Dies ermöglicht das Parsen von Zonendateien entweder von stdin (Standard) oder aus einer Datei mit dem Flag --input-file.