Skip to main content
26. Nov 2010

Spaß mit Zone FilesDomainnamen aus Zone Files extrahieren

Zonefile Access © Henry Schmitt - Fotolia.com

Vor ein paar Wochen habe ich mir die Zeit genommen die Formulare für den Verisign Zone File Access auszufüllen und abzuschicken. Heute kam dann der Anruf in dem mir meine Zugangsdaten zugeteilt wurden und 5 Minuten später hatte ich das .com und .net Zone File auf meinem Server liegen. Für mich als Domainfan/Programmierer, natürlich wie Weihnachten und Ostern zusammen und so konnte ich es kaum erwarten die Geschenke auszupacken. Nach dem Extrahieren sind die Files 6,8GB und 1,1GB groß, was nicht mehr jeder Editor laden kann, aber was kann man nun tolles damit anfangen? Erstmal ein bisschen rumstöbern.

$ cat net.zone | wc -l
31.588.624
$ cat com.zone | wc -l
210.354.660

Okay 31.588.624 Zeilen für .net und 210.354.660 Zeilen im .com Zonefile. Da viele Domains mehrere Nameserver haben, stehen diese natürlich doppelt in der Datei. Außerdem gibt es am Ende der Dateien noch einen Abschnitt mit A Records von Nameservern. Also erst mal die Domainnamen raus filtern und die Datei etwas Einschrumpfen, damit die Arbeit leichter wird. Das macht man am besten direkt auf der *NIX Console, wenn man nicht Stunden warten möchte. Hier meine Einzeilerlösung:

cat net.zone | \
awk 'NR > 43' | \
awk 'split($1, x, / /) {print x[1]}' | \
grep -v '\.' | \
sed '$d' | \
sort -u > netdomains
$ cat netdomains | wc -l
13.502.688

Erklärung: Cat liest die Datei ein und gibt sie Zeile für Zeile aus. Durch das pipen (|) kann man mehrere Befehle aneinander fügen und die stdin/stdout benutzen. Der zweite Teil gibt erst alles ab Zeile 44 aus, da am Anfang noch allgemeine Informationen über das Zonefile stehen. Dann wird die Zeile an Hand des ersten Leerzeichens geteilt und nur der erste Teil wird weiter benutzt (dort steht der Domainname). Das grep -v entfernt alle Zeilen in denen ein Punkt vorkommt (das sind die Nameserverentries am Ende). sed '$d' entfernt dann noch die letzte Zeile und sort -u entfernt alle doppelten Zeilen und sortiert die Liste.

Das läuft dann 2 Minuten 30 Sekunden lang und am Ende hat man alle .net Domainnamen in einer extra Datei. Das sort -u dauert am längsten. Wenn man das nicht braucht, kann man die Ausführung um ca. 2 Minuten verkürzen. Geht sicher noch einfacher, aber ich bin auch nur ein awk Anfänger. Tipps sind Willkommen! :)

Hier der Aufruf für das .com Zonefile. Mit sort -u läuft dies 18 Minuten 53 Sekunden und ohne 5 Minuten 20 Sekunden.

cat com.zone | \
awk 'NR > 28' | \
awk 'split($1, x, / /) {print x[1]}' | \
grep -v '\.' | \
sed '$d' | \
sort -u > comdomains
$ cat comdomains | wc -l
91.096.948

Zurück zur Frage vom Anfang. Was macht man damit nun?

Die Daten sind super um Statistiken zu erstellen. Wie viele Domains wurden neu registriert? Wie viele wurden gelöscht? Man kann seine eigene Pending Delete Liste erstellen in dem man die aus dem Zonefile verschwundenen Domains näher betrachtet. Schaut man sich nur den Aufwand an den man bei .de Domains betreiben muss um überhaupt an diese Daten zu kommen, dann sieht man den Nutzen sehr schnell. Außerdem ist es schon sehr spannend, was Leute so alles registrieren. :)

Eine der ersten Funktionen die ich bauen werde ist eine Lösung um die Dateien täglich abzurufen, sie zu parsen und in eine MySQL Datenbank zu schreiben um sie weiter verwerten zu können. Dann stehen sicher die ersten Statistiken an. Stay tuned.