BIND
ist ein Server zur Auflösung von DNS-Namen.
Das DNS (Domain Name System) dient dazu, Namen von Internet-Servern auf IP-Adressen abzubilden. Es erfüllt also eine Funktion ähnlich einem Telefonbuch. Jeder Rechner, der an das Internet angeschlossen ist, hat eine eindeutige IP-Adresse. Diese sind allerdings einerseits nicht so leicht zu merken und andererseits hängt diese Adresse von der Topologie des Netzes und nicht vom Einsatzzweck des Servers ab. Das bedeutet, wenn ein Rechner im Rechenzentrum von z.B. Domainfactory steht, hat er immer eine Adresse aus deren IP-Adressraum. Damit mein Rechner jetzt unter z.B. thomasbayen.de zu erreichen ist, brauchen wir ein "Telefonbuch", das diesen Namen entgegennimmt und mir die entsprechende IP-Adresse zurückgibt. Diese Funktion erfüllt das DNS.
Prinzipiell ist das DNS hierarchisch aufgeteilt. Das bedeutet, das ein Nameserver, der Teil des DNS ist, immer nur für die Unterdomains eines einzelnen Domainnamens zuständig ist. Diesen Bereich nennt man eine Zone (es kann Unterschiede zwsichen Domain und Zone geben, aber das würde hier zu weit führen). Damit die Hierarchie einen ordentlichen Anfang hat, spricht man auf der obersten Ebene von der sog. Root-Zone. Hierfür wurde eine Anzahl von IP-Adressen festgelegt (14 Stück, die sogenannten Server A-M) und diese als Root-Nameserver definiert. Dadurch das einige dieser Adressen (sog. Anycast-Adressen) je nach geographischem Ort auf unterschiedliche physikalische Server umgeleitet werden, gibt es in Wahrheit noch einige Root-Server mehr. Die Root-Server enthalten eine Liste der Top-Level-Domains (TDL) wie .de, .com, .org, etc... Für jede dieser Zonen gibt es einen oder mehrere (praktisch natürlich immer mehrere) Nameserver-Einträge von Nameservern, die für diese Zone zuständig sind.
So betreibt z.B. die DENIC e.G., die der oberste Verwalter der de-Zone ist, Nameserver, die eine Datenbank mit allen deutschen Domains beinhalten. Die Root-Server A bis M geben daher Anfragen an eine Domain, die auf ".de" endet, an diese Server der DENIC weiter. Wenn ich jetzt z.B. eine Domain "lug-kr.de" habe, weiss die DENIC, von welchem Internet-Provider diese zur Verfügung gestellt wird. Die DENIC-Nameserver geben dazu den Nameserver dieses Providers an. Lautete die ursprüngliche Anfrage z.B. "www.lug-kr.de", so weiss der Nameserver des Providers nun, welcher Rechner genau "www" in dieser Domain ist.
Die meisten Nameserver können nicht nur eigene Domains auflösen, sondern auch andere Server des DNS-Systems abfragen. Hierzu benutzen sie entweder Forwarding (einfach einen anderen fragen) oder Rekursion (eigene Domains tiefer auflösen). Teilweise gibt es aber auch eine Aufteilung in Server, die authoritative Antworten geben (d.h. die für eine eigene Zone Antworten aus Ihrer eigenen Zonendatei geben) und die nur Anfragen an andere Server weiterleiten und dann ggf. cachen. Erstere geben manchmal sogar gar keine endgültige Antwort heraus (das dient dazu, das z.B. nicht alle Welt nur die Rootserver mit jedem Kleinkram bombardiert). Zweitere dienen dazu, das Endbenutzer Anfragen stellen können. Sie werden zumeist von Internet-Providern betrieben, die diesen Dienst für Ihre Kunden bereitstellen. Es gibt aber auch öffentliche wie z.B. den Server mit der schönen Nummer 8.8.8.8 von Google.
Um die Erklärung abzurunden, sei noch erwähnt, das die Zuordnung von Namen und IP-Adressen immer nur in eine Richtung eindeutig sein muss. Es können also viele Namen auf die gleiche Adresse abgebildet werden. Arbeitet dort ein Webserver, so kann dieser dann so konfiguriert werden, das er anhand des HTTP-Headers der Browser-Anfrage erkennt, welche Domain der Browser wirklcih haben will. Er kann dann die Webseite z.B. in unterschiedlichen Verzeichnissen suchen (sogenannte VHOST-Konfiguration des Webservers). Für Dienste, die keine Domain in der übermittelten Anfrage angeben, geht das aber nicht. Z.B. für ssh-Zugriffe gilt, das der Server nicht wissen kann, welchen Domainnamen ein Anwender angegeben hat und somit auch den Zugriff nicht anhand des Namens unterscheiden kann. Diese Unterscheidung kann dann z.B. bei ssh anhand des Benutzernamens erfolgen - bei anderen Diensten ggf. aber auch gar nicht.
Bind ist das Programm, das auf ca. 70% der Nameserver des Internets eingesetzt wird. Daher sind auch viele Anleitungen und Beispiele im Internet hierfür zu bekommen und beziehen sich oftmals auf das Format der Zonendatei, das Bind benutzt.
Bind speichert seine Daten in sogenannten Zonendateien. Eine solche Datei enthält im einfachsten Fall alle Einträge für eine einzelne Sub-Domain. Außerdem enthält sie Daten wie den für eine Domain zuständigen Nameserver, und auch das TTL-Feld. Dieses gibt an, wie lange ein Eintrag gültig ist. Das ist gerade für eigene Spielereien wichtig. Hat man nämlich etwas verändert, so muss sich diese Änderung ja auch in allen anderen Servern des DNS-Systems rumsprechen. Da der Sinn der meisten Server aber gerade ist, solche Anfragen zu cachen, dauert es, bis diese Ihre Information erneuern. Um diese Zeit zu beeinflussen, dient die TTL-Einstellung. Für Basteleien kann man diese auf z.B. 5 Minuten (300 Sekunden) setzen.
Um einen eigenen Nameserver aufzusetzen, mit dem man herumspielen kann, muss man sich irgendwo in das globale DNS-System einhängen. Dazu benötigt man ersten einen (selbst aufgesetzten) Nameserver mit einer festen IP-Adresse und zweitens einen Nameserver-Eintrag in einer bereits vorhandenen Domain (also bei einem Provider).
Je nach Provider und Problemstellung kann es gewünscht (oder einfacher) sein, eine Second- oder eine Third-Level-Domain selbst zu verwalten. Im Prinzip ist das aber vollkommen egal und wird identisch eingerichtet. Der Domainname enthält lediglich einen Punkt mehr. Bei DF war es einfacher, das so zu machen und es erfordert für meine Tests nicht, eine kostenpflichtige zusätzliche SLD zu beantragen.
Wer einen normalen Internet-Zugang (mit dynamisch zugewiesener IP-Adresse hat), kommt nicht umhin, hierfür einen (zumindest virtuellen) Server bei einem Provider zu mieten. (Ich selber habe gute Erfahrung mit der sog. Jiffybox von Domainfactory, weil die recht günstig ist und dynamisch erzeugt, schlafen gelegt und und ohne lange Vertragslaufzeit wieder gelöscht werden kann - deshalb nehme ich die hier als Beispiel).
Auf der Jiffybox habe ich das Bind-Paket installiert:
aptitude install bind9
Die Konfiguration beginnt mit der Datei /etc/bind/named.conf. In der Debian Basis-Konfiguration ist allerdings in dieser Datei gar nicht einzustellen. Sie enthält einen Verweis auf andere Dateien mit verschiedenen Einstellungen. Die lokalen Zonendateien sollten nach diesem Schema in /etc/bind/named.conf.local eingetragen werden. Dort füge ich folgendes an:
zone "dns.thomasbayen.de" {
type master;
file "/etc/bind/db.dns.thomasbayen.de";
allow-query { any; };
};
Hier habe ich einen Verweis auf meine eigene Zonendatei /etc/bind/db.dns.thomasbayen.de eingetragen. Diese sieht dann z.B. so aus:
$TTL 300
; Zonefile fuer
; dns.thomasbayen.de
;
; ttl 300 sind 5 Minuten
dns.thomasbayen.de. IN SOA ns1.dns.thomasbayen.de. tbayen.bayen.de. (
1 ; serial no
1800 ; refresh 30 Minuten
600 ; retry 10 Minuten
604800 ; expire 1 Woche
300 ; minimum ttl
)
; name servers
ns1 IN A 46.252.125.14
@ IN NS ns1
; server entries
www IN A 192.168.1.1 ;
ftp IN A 192.168.1.2 ;
google IN CNAME www.google.de.
; domainname ohne server
dns.thomasbayen.de. IN A 192.168.1.3
Zu dieser Zonendatei gibt es jetzt ein paar Anmerkungen zu machen:
(In meinem Beispiel habe ich das nicht genutzt)
Mit einem Befehl wie diesem kann man den Nameserver direkt abfragen:
dig @46.252.125.14 www.dns.thomasbayen.de
Damit nun auch die Nameserver meines Internet-Providers meine neuen Adressen auflösen können, muss ich ihnen sagen, das mein Nameserver da ist. Hierzu brauche ich Zugriff auf eine vorhandene und offizielle Zonendatei. In meinem Beispiel ist die Domain thomasbayen.de über meinen Provider (Domainfactory, kurz DF) registriert. Nun ist DF dafür verantwortlich, für die Domain "dns.thomasbayen.de" meinen eigenen Nameserver einzubinden. Ich weiss natürlich nicht, wie und ob das bei anderen Providern geht. Bei DF gibt es für sogenannte Reseller-Tarife eine schöne Weboberfläche hierzu.
Ich brauchte zwei Einträge: Zuerst einen A-Eintrag, der meinem Nameserver einen Namen zuordnet. Dieser Name darf natürlich nicht in der vom Nameserver selber verwalteten Zone liegen. Er kann aber eine Third-Level-Domain unter derselben Hauptdomain wie meine eigene Zone sein. Falls der Nameserver bereits einen DNS-Namen hat, kann man natürlich auch diesen benutzen. Das kann einerseits sein, wenn man den gleichen Server bereits für was anderes benutzt, andererseits stellt vielleicht der Hosting-Provider einen zur Verfügung (Die Jiffybox-Server z.B. haben Namen der Art "j97577.servers.jiffybox.net"). Als zweiten Eintrag erzeuge ich dann einen NS-Eintrag, der den soeben eingerichteten Namen als Nameserver angibt.
In Zonenfile-Notation sieht das dann so aus:
ns.thomasbayen.de. IN A 46.252.125.14 dns.thomasbayen.de IN NS ns.thomasbayen.de.
Falls die Zone thomasbayen.de vorher von irgendwoher benutzt wurde, kann es gut sein, das die alte Einstellung noch irgendwo gecachet ist. Deshalb kann es bis zu 48 Stunden dauern, bis alle Nameserver die neue Einstellung übernommen haben und der folgende Befehl weltweit funktioniert:
dig www.dns.thomasbayen.de
Wer das vorher schonmal ausprobieren möchte, kann evtl. schneller (bei DF nach wenigen Minuten) probieren, den Nameserver des Providers direkt anzurufen. Das geht bei DF dann so:
dig @ns.namespace4you.de www.dns.thomasbayen.de
Dabei ist zu beachten, das man bei DF nicht die TTL dieser Einträge anpassen kann. Das heisst, das die Tatsache, das mein eigener Nameserver für die Subdomains verantwortlich ist, nicht so schnell geändert werden kann. Die hosts innerhalb dieser Domain kann ich allerdings auf meinem eigenen Nameserver konfigurieren und dort die TTL auch kürzer setzen.
Für Bind gibt es eine Erweiterung, die sich DLZ
nennt. Diese erlaubt, Zonen-Informationen aus einer (z.B. SQL-) Datenbank zu holen anstatt aus den Zonen-Dateien. Für grosse und vor allem dynamische Einrichtungen kann das ein Weg sein. Leider ist das für SQL-Datenbanksysteme im Debian-Paket von BIND nicht einkompiliert (siehe Debian-Bug 273440
) und daher nicht out-of-the-box benutzbar. Man muss also ggf. BIND neu kompilieren, um das zu nutzen.
Natürlich kann man auch verschiedene andere Nameserver anstelle von Bind einsetzen. z.B. DnsMasq holt seine Informationen aus der /etc/hosts-Datei. Obwohl ihm viele Funktionen von Bind fehlen, ist er eine gute Alternative, um im lokalen Netz mal eben ein paar Rechner einzurichten.
Nun bleibt natürlich die Frage, was man mit so einem eigenen öffentlichen Nameserver machen kann. Wer als Mitglied der LUG Krefeld keinen Zugang zu einem Provider hat, der die Einstellung der DNS-Record erlaubt, kann mich übrigens gerne um Hilfe bitten (ThomasBayen).
Hier ein paar Beispiele:
Wer mehrere Rechner hat, die sich per VPN in das Unternehmensnetzwerk einfinden, hat u.U. ein Problem: Wer interne Rechner mit dem Laptop per VPN auffinden möchte, muss deren Namen auflösen. Sind diese Namen nur intern bekannt, muss hierzu ein interner Nameserver benutzt werden. Das bedeutet, das man den ganzen Laptop auf diesen Nameserver umstellen muss (normalerweise kann das beim VPN-Verbindungsaufbau automatisch konfiguriert werden). Allerdings werden dann alle DNS-Abfragen durch den VPN-Tunnel geschickt, der je nach Verbindung eine recht hohe Latenz hat. Wer bei bestehen einer VPN-Verbindung dennoch oft normale Webseiten aufruft, wird sehen, das hierdurch der Internet-Zugriff deutlich langsamer wird.
Hier bietet es sich an, interne Namen öffentlich zu definieren. Es ist kein Problem, im öffentlichen Webserver private IP-Adressen (z.B. der Form 192.168.x.x) anzugeben. Diese können dann natürlich nur sinnvoll von Rechnern benutzt werden, die im LAN stecken (oder per VPN ans LAN angeschlossen sind).
Wie auf der Seite DynamischesDNS bereits geschrieben, kann man für Wählverbindungen (also für normale Internet-Anschlüsse), die immer wechselnde IP-Adressen bekommen können, bei jedem Verbindungsaufbau den entsprechenden Namens-Eintrag selber ändern. Hierdurch kann man eine Art eigener DDNS-Provider werden. Dies kann insbesondere interessant sein, weil einige der bekannten DDNS-Provider (wie DynDNS) inzwischen nicht mehr kostenlos benutzt werden können. Ehrlich gesagt gibt es immer noch eine Menge kostenloser Dienste
, aber das ist nbatürlich lange nicht so cool wie selber machen.
Es gibt verschiedene Lösungen, die per CGI-Skript auf dem Webserver (z.B. in Perl oder PHP) die Zonendatei ändern (z.B. hier
). Das hat den Vorteil, das die API per http recht einfach und ggf. sogar kompatibel zu Lösungen wie DynDNS ist.
Es gibt aber auch die Möglichkeit, per nsupdate
direkt Änderungen in den laufenden Bind zu schieben. Eine schöne (deutsche) Anleitung zur einer nsupdate-Lösung gibt es hier
Eine ausgefallene Anwendung ist iodine
. Dabei handelt es sich um eine Implemetierung des IP-Protokolls, die ausschließlich über DNS funktioniert. Eine Anwendung wäre, das man einen Tunnel erzeugen kann, der IP-Daten überträgt, wo diese eigentlich gesperrt sind, aber DNS-Daten durchkommen. Das ist z.B. bei vielen öffentlichen und unverschlüsselten aber durch ein kostenpflichtiges Passwort geschützten Access Points der Fall (z.B. in Hotels oder an öffentlichen Plätzen).
Der eigentliche Grund, sowas zu machen, dürfte aber sein, das es einfach ein cooler Hack ist. ;-)
Iodine ist als einfaches Debian-Paket zu erhalten. Dabei ist darauf zu achten, das Server und Client die gleiche Version installiert haben (0.6.x in meinem Beispiel). Dann kann man folgendes in /etc/default/iodine konfigurieren:
START_IODINED="true" IODINED_ARGS="192.168.202.1 dns.thomasbayen.de" IODINED_PASSWORD="geheimespasswort"
Den Client startet man nun mit
iodine -P geheimespasswort dns.thomasbayen.de
Sofort öffnet sich ein tun-Device, das man benutzen kann, um eine Verbindung zu seinem Server aufzubauen.
Da iodine als eigenständiger Nameserver agiert, ersetzt er sozusagen einen Bind. Wer mit beidem gleichzeitig herumspielen will, muss entweder zwei Server dafür benutzen oder die Weiterleitung von iodine benutzen. Dazu fügt man in der Datei /etc/bind/named.conf.options diese Zeile ein (innerhalb des "options"-Blocks):
listen-on port 10053 { any; };
Dann kann man die Definition von IODINED_ARGS in /etc/default/iodine folgendermassen ändern:
IODINED_ARGS="-b 10053 192.168.99.1 dns2.thomasbayen.de"
Hierbei ist zu beachten, das man nun zwei Domains einrichten muss, da ja jeder der beiden Nameserver eine davon verwalten soll. Also müssen auch beide Domains (dns... und dns2...) beim Provider einen entsprechenden NS-Eintrag erhalten.
Weitere Tricks wie Routing durch den iosine-Server etc. habe ich noch nicht ausprobiert. Auch mit dem Android-Client für iodine würde ich bei Gelegenheit gerne nochmal herumspielen.