layout: page title: Das meshname DNS-System permalink: /blog/meshname-de/ keywords: meshname,meship,dns,yggdrasil description: Was ist meshname? Wie löst man .meshname und .meship-Domains auf? Und wie funktioniert das Ganze? Was steckt dahinter? lang: de feed: true
meshname ist ein dezentrales DNS-System. Dezentral bedeutet bei Meshname, dass es ohne zentrale Server wie Root-Server auskommt. Je nach Auflösungsmethode wird auch überhaupt kein Server benötigt.
Die erste Implementierung wurde am 19. Januar 2020 von zhoreeq auf GitHub veröffentlicht und in Go geschrieben. Die Referenzimplementierung stellt lediglich ein Kommandozeilentool zur Auflösung bzw. Kodierung sowie einen einfachen DNS-Server bereit.
Am 24. Oktober 2021 kam die zweite Implementierung von acetone mit dem Namen mario-dns
auf. Diese wurde in C++ mit Qt5 geschrieben und bietet ein Web-Interface mit REST API an.
Die dritte Implementierung habe ich geschrieben und am 4. Januar 2022 erstmalig veröffentlicht. Ich habe diese in Ruby geschrieben und als Bibliothek konzipiert. Sie bietet die Möglichkeit an, meshname Kodierungen und einfache Auflösungen durchzuführen.
Das Meshname-Protokoll definiert zwei Top-Level-Domains (TLDs):
.meshname
.meship
.meship
-Domains können nur auf eine IPv6-Adresse aufgelöst werden. .meshname
-Domains brauchen einen autoritativen DNS-Server, welcher eine erreichbare IPv6-Adresse hat.
Die Auflösung und vollständige Erstellung von Domains unterscheiden sich daher nach TLD, jedoch ist das grundsätzliche Verfahren das Gleiche.
ipaddr
importiert hat: IPAddr.new("200:6fc8:9220:f400:5cc2:305a:4ac6:967e").hton
Wenn man die vollständige IPv6-Adresse mit führenden Nullen hat, kann man auch POSIX-Werkzeugen verwenden:
echo "0200:6fc8:9220:f400:5cc2:305a:4ac6:967e" | tr -d ':' | xxd -revert -plain
Das Ergebnis ist \x02\x00o\xC8\x92 \xF4\x00\\\xC20ZJ\xC6\x96~
.echo "0200:6fc8:9220:f400:5cc2:305a:4ac6:967e" | tr -d ':' | xxd -revert -plain | base32
Das Ergebnis ist hier AIAG7SESED2AAXGCGBNEVRUWPY======
.=
-Zeichen) und schreibt alle Buchstaben klein:
echo "0200:6fc8:9220:f400:5cc2:305a:4ac6:967e" | tr -d ':' | xxd -revert -plain | base32 | tr -d '=' | tr '[:upper:]' '[:lower:]'
Das Ergebnis ist dann aiag7sesed2aaxgcgbnevruwpy
.An das eben gewonnene Ergebnis kann man indessen .meship
anhängen. Wenn eine .meship
-Domain aufgelöst wird, wird das Verfahren umgekehrt und immer die kodierte IPv6-Adresse als AAAA-Rekord zurückgegeben. .meship
benötigen daher keinen zentralen Server, da die IP-Adresse im Domainnamen selber ist.
Man kann an das gewonnene Ergebnis jedoch auch .meshname
anhängen. In diesem Fall bedeutet dies, dass die kodierte Adresse, die IP-Adresse des autoritativen DNS-Servers ist. Wenn also der TXT-Rekord von aiag7sesed2aaxgcgbnevruwpy.meshname
abgefragt wird, wird die IP-Adresse dekodiert und der entsprechende DNS-Server 200:6fc8:9220:f400:5cc2:305a:4ac6:967e
nach einem TXT-Rekord für die Domain aiag7sesed2aaxgcgbnevruwpy.meshname
befragt.
Um eine meshname-Domain aufzulösen, wird als Erstes die Kodierung umgekehrt:
.meship
ist, wird die IPv6-Adresse als AAAA-Rekord zurückgegeben. Wird ein anderer Rekord oder eine Subdomain angefragt, wird nichts bzw. eine Fehlermeldung zurückgegeben..meshname
ist, wird der DNS-Server befragt, dessen IP-Adresse in der Domain kodiert ist. Daher sind bei dieser Methode auch andere Rekords als AAAA
sowie Subdomain möglich.Zooko's Dreieck beschreibt das Trilemma, dass eine Domain immer nur zwei von drei Eigenschaften haben kann:
- Frei wählbar: Der Domainname ist frei wählbar oder sehr leicht beeinflussbar.
- Dezentral: Die Auflösung der Domain ist nicht von einem zentralen Server abhängig.
- Sicher: Es werden die vom Eigentümer hinterlegten Rekords zurückgegeben und dies kann sichergestellt werden.
Beispiele:
meshname-Domains sind nicht frei wählbar, da sie von einer IP-Adresse abhängen. Durch eine geschickte Wahl der IP-Adresse (beispielsweise, wenn man ein größeres Subnetz hat) kann man zwar einfachere Domains generieren, jedoch hängen diese immer noch stark von der IP-Adresse ab. Darüber hinaus haben meshname-Domains immer dieselbe Länge.
.meship
-Domains sind sowohl dezentral (da man sie ohne externen Server auflösen kann) als auch sicher (da die IP-Adresse bereits im Namen selber kodiert ist).
.meshname
-Domains sind dezentral, da keine zentralen Server benötigt werden. Es wird lediglich ein einziger externer Server zur Auflösung benötigt. Jedoch sind .meshname
-Domains nur bedingt sicher. Es wird zwar immer der richtige autoritative DNS-Server befragt, jedoch kann die Antwort nicht validiert werden. .meshname
-Domains sind also für Man-in-the-Middle-Angriffe anfällig, wenn jemand die Verbindung zwischen Server, der auflöst und dem autoritativen DNS-Server kontrolliert.
Um die Referenzimplementierung zu bauen, muss diese als erstes heruntergeladen werden:
$ git clone https://github.com/zhoreeq/meshname.git
Danach kann man das Programm mit make
bauen:
$ cd meshname/
$ make
Danach erhält man im selben Verzeichnis eine Datei meshnamed
, welche ausführbar ist. Startet man diese ohne weitere Argumente, so wird ein DNS-Server auf [::1]:53535
gestartet, welchen man befragen kann:
$ ./meshnamed
2024/01/31 11:04:13 Listening on: [::1]:53535
$ dig @::1 -p 53535 aiag7sesed2aaxgcgbnevruwpy.meship AAAA +short
200:6fc8:9220:f400:5cc2:305a:4ac6:967e
Um eine IP-Adresse in eine Domain umzuwandeln, kann man folgenden Befehl nutzen:
$ ./meshnamed -getname 200:6fc8:9220:f400:5cc2:305a:4ac6:967e
aiag7sesed2aaxgcgbnevruwpy
Um die Domain wiederum in eine IP-Adresse umzuwandeln, kann man so etwas ausführen:
$ ./meshnamed -getip aiag7sesed2aaxgcgbnevruwpy
200:6fc8:9220:f400:5cc2:305a:4ac6:967e
meshname-Domains sollten laut Protokollspezifikation primär von Maschinen verwendet werden - beispielsweise um sich zu einem Peer oder Server zu verbinden. Dennoch finde ich es persönlich spaßig, meshname-Domains in Netzwerken wie Yggdrasil zu verwenden.