RDAP liefert strukturierte Informationen zu einer Domain. Neben handlichen CLI-Abfragewerkzeugen gibt es auch Bibliotheken für die Integration des Protokolls in eigene Programme.
Seit den Anfängen des Internets und der Auffächerung auf verschiedene organisatorische Bereiche braucht man eine Möglichkeit, um Informationen zu einer Domain, der benutzten IP-Adresse und zu deren Inhaber zu erhalten und sie einander zuzuordnen. Dafür wurde 1981 das Whois-Protokoll erdacht und via RFC 812 eingeführt [1]. Man erreicht den Dienst über das gleichnamige Kommandozeilenwerkzeug whois. Das Alter und die Bedeutung des Protokolls lassen sich unter anderem an der sehr niedrigen Nummer 43 in der Liste der standardisierten Ports für Netzwerkdienste [2] erkennen, wiederzufinden in der Datei /etc/services [3].
Bislang hat sich das Klartextprotokoll aufgrund seiner Einfachheit bewährt, auch wenn nur Anfrage und Antwort in einem recht groben Rahmen standardisiert wurden. Die letzte Aktualisierung im RFC 3912 stammt aus dem Jahr 2004 [4]. Seit einiger Zeit läuft die Suche nach einem Ersatz. Der Wunschkandidat dafür ist das Registration Data Access Protocol (RDAP) [5], genauer definiert im RFC 9082 [6].
Regulierungen zu Whois in Deutschland
Seit 2018 gilt in Deutschland die Datenschutz-Grundverordnung (DSGVO [7]), die nur noch wenige Auskünfte zu Domain-Inhabern gestattet. Whois liefert daher als Ergebnis ausschließlich die technischen Informationen der Nameserver sowie die E-Mail-Adressen zur Kontaktaufnahme mit dem Inhaber der Domain zurück (Listing 1). Während für registrierte Benutzer die Ergebnisse zumindest zeitlich begrenzt bereitstehen, haben Dritte lediglich “Zugriff nur über gesonderte Formulare als Behörde sowie bei nachweisbaren Rechtsstreitigkeiten” [3].
Listing 1
Whois-Anfrage zu linux-community.de
$ whois linux-community.de
% Restricted rights.
%
% Terms and Conditions of Use
%
% The above data may only be used within the scope of technical or
% administrative necessities of Internet operation or to remedy legal
% problems.
% The use for other purposes, in particular for advertising, is not permitted.
%
% The DENIC whois service on port 43 doesn't disclose any information concerning
% the domain holder, general request and abuse contact.
% This information can be obtained through use of our web-based whois service
% available at the DENIC website:
% http://www.denic.de/en/domains/whois-service/web-whois.html
%
%
Domain: linux-community.de
Nserver: eva.ns.cloudflare.com
Nserver: jay.ns.cloudflare.com
Status: connect
Changed: 2021-01-07T10:44:58+01:00
RDAP
Das Registration Data Access Protocol RDAP soll Whois letztlich komplett ablösen. Es liefert die Informationen zu einer Domain über das HTTP-Protokoll. Das Freischalten des Ports 43 in der Firewall entfällt damit. RDAP wurde bereits 2015 von einer Arbeitsgruppe der Internet Engineering Task Force (IETF) standardisiert.
Von den Zielen her deckt sich RDAP mit Whois, ermöglicht also die Recherche nach Domain-Namen, der IP-Adresse sowie der Autonomous System Number (ASN) von Internet-Ressourcen. Vereinfacht gesagt, referenziert eine ASN eine Menge von Routern, die Teil eines gemeinsamen Netzwerks sind, und erlaubt, sie als Einheit anzusprechen, beispielsweise in einem Content Delivery Network (CDN) für Web- und Medieninhalte.
Zugriff via Kommandozeile
Hier kommt zunächst das Kommando whois ins Spiel. Der Aufruf umfasst eine IP-Adresse (Abbildung 1) oder einen Domain-Namen, in Listing 2 auszugsweise für linux-magazine.com. Das Resultat verdeutlicht, dass nicht mehr alle Angaben so einfach zugänglich sind. Die textbasierte Ausgabe von Whois hat zudem je nach abgefragter Domain eine andere Struktur. Das macht das Parsen der Ausgabe zu einer kleinen Herausforderung und erschwert eine maschinelle Weiterverarbeitung. Dagegen strebt RDAP ein strukturiertes Ausgabeformat an, um die Auswertung zu erleichtern.
Listing 2
Whois-Aufruf für linux-magazine.com
$ whois linux-magazine.com
Domain Name: LINUX-MAGAZINE.COM
Registry Domain ID: 1968247_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.godaddy.com
Registrar URL: http://www.godaddy.com
Updated Date: 2023-09-14T12:41:34Z
Creation Date: 1998-09-15T04:00:00Z
Registry Expiry Date: 2024-09-14T04:00:00Z
Registrar: GoDaddy.com, LLC
Registrar IANA ID: 146
Registrar Abuse Contact Email: abuse@godaddy.com
Registrar Abuse Contact Phone: 480-624-2505
Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited
Domain Status: clientRenewProhibited https://icann.org/epp#clientRenewProhibited
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Domain Status: clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited
Name Server: NS27.DOMAINCONTROL.COM
Name Server: NS28.DOMAINCONTROL.COM
DNSSEC: unsigned
URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
>>> Last update of whois database: 2023-12-12T15:02:13Z <<<
[...]
Wir haben vier RDAP-Werkzeuge aufgestöbert, die sich für den Einsatz unter Linux eignen: OpenRDAP [8], den RDAP Query Service [9], Icann-rdap-cli [10] und Rdapper [11].
OpenRDAP wurde in der Programmiersprache Go geschrieben. Es unterstützt beispielsweise Anfragen anhand der IP-Adresse, des Domain-Namens und von Nameservern. Abbildung 2 zeigt einen Ausschnitt des Aufrufs zur Domain Linux-magazine.com auf der Demo-Seite des Projekts, die Sie direkt über die Projektwebseite erreichen. OpenRDAP bietet drei Ausgabeformate an: JSON, reinen Text und einen Whois-ähnlichen Stil.
Beim RDAP Query Service handelt es sich lediglich um ein Web-Frontend, das auf OpenRDAP zurückgreift und darauf weiterleitet. Im Gegensatz dazu steht Icann-rdap-cli: Die Entwicklung dieses in der Programmiersprache Rust geschriebenen RDAP-Clients wurde von der ICANN gefördert, der Internet Corporation for Assigned Names and Numbers. Über die Projektseite auf Github stehen neben dem Quellcode auch Binärpakete für Linux, MacOS und Windows bereit.
Nummer vier im Bunde ist das in Perl programmierte Rdapper. Es stützt sich auf das RDAP-Perl-Modul [12] und stellt somit lediglich einen kleinen Wrapper dar. Als Parameter verarbeitet Rdapper neben Domain-Namen sowie IPv4- und IPv6-Adressen auch ASN-Angaben. Sie erhalten es über die Projektseite auf Github.
Datenzugriff via Python
Was über die Kommandozeile geht, lässt sich genauso gut mit wenigen Zeilen Python-Code realisieren. Drei gut gepflegte Bibliotheken erleichtern dabei die Arbeit: Python-whois [13], Rdap und Ipwhois. Sie alle stehen über den Python Package Index zur Installation, Python-whois gibt es zusätzlich als Paket für Debian GNU/Linux und Ubuntu [14].
Listing 3 zapft das Whois-Modul an. Nach dem Import des Moduls in den Namensraum des Skripts (erste Zeile) legen Sie den Domain-Namen fest, über den Sie Informationen erhalten möchten. In Zeile 3 ist das linux-magazine.com, wobei auch jede andere Domain denkbar wäre, die einen aussagekräftigen Datensatz als Antwort liefert.
Die tatsächliche Whois-Abfrage erledigt Zeile 4; die Antwort landet in der Variablen reply. Die folgenden Zeilen extrahieren aus der Antwort das Ablaufdatum der Domain (Zeile 5), den tatsächlichen Domain-Namen (Zeile 7), den Registrar (Zeile 9) und die eingetragenen Nameserver. Da mehr als ein Nameserver hinterlegt sein darf, erfolgt das in einer For-Schleife (Zeile 10 und 11). Das Ergebnis des Aufrufs zeigt Listing 4, wieder mit zwei Nameservern wie in Listing 2.
Listing 3
Aufrufen von Whois
import whois
domainName = "linux-magazine.com"
reply = whois.query(domainName)
expirationDate = reply.expiration_date
print("Name: %s" % reply.name)
print("Ablaufdatum: %i.%i.%i" % (expirationDate.day, expirationDate.month, expirationDate.year))
print ("Registrar: %s" % reply.registrar)
for entry in reply.name_servers:
print("Nameserver: %s" % entry)
Listing 4
Aufruf von Listing 3
$ python3 detect-domain.py
Name: linux-magazine.com
Ablaufdatum: 13.9.2024
Registrar: GoDaddy.com, LLC
Nameserver: ns27.domaincontrol.com
Nameserver: ns28.domaincontrol.com
RDAP-Bibliothek
Die RDAP-Bibliothek [15] fokussiert auf das neuere Protokoll. Zum Lieferumfang gehört als mitgelieferte Anwendung das Kommandozeilenwerkzeug rdap, das die Bibliothek verwendet und analog zu den bereits oben vorgestellten Whois-Kommandos funktioniert.
Um einen eigenen RDAP-Client zu programmieren, bringt die RDAP-Bibliothek eine Klasse namens RdapClient() mit. Die Dokumentation dazu fällt bislang minimal aus. Die Grundlage für das Listing 5 bilden daher das Beispiel aus dem Repository des Projekts und etwas Reverse Engineering der Ausgabe.
Nach dem Import der Klasse RdapClient() aus dem RDAP-Modul (Zeile 2) legen Sie die Domain fest, deren RDAP-Record Sie beziehen möchten, im Beispiel wieder linux-magazine.com (Zeile 4). Im nächsten Schritt erzeugen Sie ein Objekt der Klasse RdapClient() (Zeile 7), die eine Methode namens get_domain() für die eigentliche RDAP-Anfrage mitbringt. Als Parameter benötigt sie die zuvor festgelegte Domain (Zeile 9). Die verbleibenden Zeilen dienen zur Auswertung der erhaltenen Antwort. Sie liefern den Domain-Namen (Zeile 12), das Verfallsdatum (Zeile 15 bis 20), den Registrar (Zeile 23 und 24) sowie die hinterlegten Nameserver (Zeile 27 bis 30). Die zugehörige Ausgabe finden Sie in Listing 6; inhaltlich entspricht sie Listing 4.
Listing 5
RDAP-Zugriff über Python
# import class RdapClient from rdap module, only
from rdap import RdapClient
# define domain name
domainName = "linux-magazine.com"
# create RdapClient
rdapc = RdapClient()
# send RDAP request
reply = rdapc.get_domain(domainName)
# extract domain name
print("Name:", reply.data["ldhName"].lower())
# extract expiration date
events = reply.data["events"]
for entry in events:
if entry["eventAction"] == "expiration":
expirationTimestamp = entry["eventDate"]
expirationDate = expirationTimestamp.split("T")[0]
print("Ablaufdatum:", expirationDate)
# extract registrar
registrar = reply.data["entities"][0]["vcardArray"][1][1][3]
print ("Registrar:", registrar)
# extract nameservers
nameservers = reply.data["nameservers"]
for entry in nameservers:
name = entry["ldhName"].lower()
print("Nameserver:", name)
Listing 6
Aufruf von Listing 5
$ python3 detect-domain-using-rdap.py
Name: linux-magazine.com
Ablaufdatum: 2024-09-14
Registrar: GoDaddy.com, LLC
Nameserver: ns27.domaincontrol.com
Nameserver: ns28.domaincontrol.com
Ipwhois
Das Modul Ipwhois [16] unterstützt sowohl Whois als auch RDAP. Erfreulicherweise haben es seine Entwickler ausführlich und vor allem verständlich dokumentiert, was eine zügige Einarbeitung deutlich vereinfacht.
Zur Bibliothek gehören die zwei kleinen Werkzeuge ipwhois_cli.py und ipwhois_utils.py. Ersteres fungiert als Client für die Kommandozeile und akzeptiert IPv4- und IPv6-Adressen als Parameter, jedoch keine Domain-Namen. Abbildung 3 zeigt die farbige Ausgabe des RDAP-Records der Domain Heise.de, hier in Form der korrespondierenden IPv6-Adresse übergeben. ipwhois_utils.py stellt vielerlei Hilfsfunktionen zur Verfügung, beispielsweise die Berechnung von CIDR-Bereichen sowie eine Berechnung von derzeit unbenutzten IP-Adressen.
Listing 7 demonstriert, wie Sie die Ipwhois-Bibliothek benutzen. Die Zeilen 1 bis 3 binden zunächst die beiden Module Pprint [17] für eine schönere Ausgabe und Ipwhois für den Zugriff auf das Whois-Protokoll ein. Aus Letzterem benötigen Sie lediglich die Klasse IPWhois. Zeile 6 legt die abzufragende IP-Adresse fest, hier ist es die IPv6-Adresse der Domain Heise.de. Ein passendes Abfrageobjekt erzeugt der Aufruf aus Zeile 8.
Die eigentliche RDAP-Anfrage findet in Zeile 10 mithilfe der Methode lookup_rdap() statt. Der Parameter depth=1 beschränkt die Rekursionstiefe bei der Abfrage auf die erste Ebene. Anschließend folgt in Zeile 12 die Ausgabe des Ergebnisses mittels pprint(). Das Resultat in Listing 8 macht alle öffentlich verfügbaren Informationen zur angefragten IP-Adresse sichtbar. Einer weiteren Verwertung der Daten in eigenen Werkzeugen sind keine Grenzen gesetzt.
Listing 7
Skript, welches Ipwhois nutzt
from pprint import pprint # import class ipwhois from ipwhois module, only from ipwhois import IPWhois # define IPv6 address ipAddress = "2a02:2e0:3fe:1001:302::" # create IPWhois object request = IPWhois(ipAddress) # send RDAP request reply = request.lookup_rdap(depth=1) # print result nicely pprint(reply)
Listing 8
Aufruf von Listing 7
$ python3 detect-domain-using-ipwhois.py
{'asn': '12306',
'asn_cidr': '2a02:2e0:3fe::/48',
'asn_country_code': 'DE',
'asn_date': '2008-04-22',
'asn_description': 'PLUSLINE, DE',
'asn_registry': 'ripencc',
'entities': ['AS20016-RIPE', 'HHH40-RIPE', 'PLUSLINE-MNT', 'PA7148-RIPE'],
'network': {'cidr': '2a02:2e0:3fe::/48',
'country': 'DE',
'end_address': '2a02:2e0:3fe:ffff:ffff:ffff:ffff:ffff',
'events': [{'action': 'registration',
'actor': None,
'timestamp': '2012-05-21T10:06:27Z'},
{'action': 'last changed',
'actor': None,
'timestamp': '2012-05-21T10:06:27Z'}],
'handle': '2a02:2e0:3fe::/48',
'ip_version': 'v6',
[...]
Fazit
Die Darstellung der Informationen zu einer Domain oder IP-Adresse bleibt durch die Struktur der übermittelten Antwort letztlich unbefriedigend. Ein grafisches Frontend, das eine substanziell bessere Ausgabe als das Textformat liefern würde, ist uns nicht bekannt.
Das Werkzeug Gnome-nettool [18] (siehe Abbildung 4 für die Domain Heise.de) ruft im Hintergrund das Werkzeug Whois auf und bindet dessen Ausgabe in einem Textfenster ein, ohne sie durch eine farbliche Hervorhebung oder Strukturierung aufzubereiten. RDAP unterstützt das Tool bislang nicht.
Eine weitaus bessere Figur macht der Webservice des Who’s Who. Die Schreibweise dazu ist der originäre Domain-Name, jeweils ergänzt um die Angabe .whoswho, also Who’s Who ohne Leerzeichen und Apostroph. Abbildung 5 zeigt einen Ausschnitt der zugänglichen Informationen zur Domain Linux-magazine.com.
Wie die Quellcodeschnipsel aus diesem Artikel verdeutlichen, lässt sich die Abfrage von Informationen zu einer Domain oder IP-Adresse mit vergleichsweise wenig Aufwand umsetzen. Der notwendige Programmcode bleibt überschaubar, insbesondere dank der verfügbaren Bibliotheken, die den Löwenanteil der Kommunikation übernehmen. (jlu)
Danksagung
Der Autor bedankt sich bei Werner Staub, Thomas Osterried und Axel Beckert für deren Kritik und Anregungen bei der Erstellung des Artikels.
Über den Autor
Frank Hofmann arbeitet zumeist von unterwegs als Entwickler, Trainer und Autor, bevorzugt aus Berlin, Genf und Kapstadt. Er gehört zu den Verfassern des Debian-Paketmanagement-Buchs [19].
Infos
-
RFC 812 zu Whois: https://www.rfc-editor.org/rfc/rfc812
-
“The /etc/services file”: https://tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/chap5sec40.html
-
RFC 3912 zu Whois: https://www.rfc-editor.org/rfc/rfc3912
-
RFC 7482 zu RDAP: https://datatracker.ietf.org/doc/html/rfc7482
-
RFC 9082 zu RDAP: https://datatracker.ietf.org/doc/html/rfc9082
-
DSGVO: https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX:32016R0679
-
OpenRDAP: https://www.openrdap.org/
-
RDAP Query Service: https://www.rdap.net
-
Icann-rdap-cli: https://lib.rs/crates/icann-rdap-cli
-
Rdapper: https://github.com/gbxyz/rdapper
-
RDAP-Perl-Modul: https://metacpan.org/pod/Net%3A%3ARDAP
-
Python-whois: https://pypi.org/project/python-whois/
-
DEB-Paket python3-whois: https://packages.debian.org/bookworm/python3-whois
-
Ipwhois: https://pypi.org/project/ipwhois/
-
Pprint-Modul: https://docs.python.org/3/library/pprint.html
-
Gnome-nettool: https://gitlab.gnome.org/GNOME/gnome-nettool
-
Debian-Paketmanagement-Buch: https://dpmb.org










