Externe DNS-Einträge in bind9 - oder: "globale /etc/hosts Einträge"

Als Erweiterung zu meiner Anleitung zu Bind9 hier ein neues Kapitel:

Angenommen, man hat sein internes Netz wunderbar mit DHCP und DNS versorgt. Jetzt wollen wir einen DNS Eintrag für eine vermeintlich externe Seite hinzufügen, z.B. weil wir für test.externeseite.com eine Website auf unserem internen Server 192.168.1.2 testen wollen.

Für einen PC macht man das am einfachsten mit einem Eintrag in der hosts Datei (unter Linux: /etc/hosts). Wenn man aber alle Rechner im LAN damit versorgen will, nutzt man einfach den DNS Server! Dazu brauchen wir folgendes:

1. Zonendefinition

Wir kreieren eine neue Zonendefinitions-Datei namens /etc/bind/named.conf.dev. Diese müssen wir in /etc/bind/named.conf einbinden:

...
include "/etc/bind/named.conf.dev";
...

In /etc/bind/named.conf.dev definieren wir jetzt unsere Zone:

// temporary external zones
zone "test.externeseite.com" {
        type master;
        file "/var/lib/bind/db.dev";
};

Als Zone definieren wir den kompletten Host, weil wir sonst auch DNS Einträge für www.externeseite.com setzen müssten. Diese sollen aber unverändert bleiben.

2. DNS Einträge für die Zone

Die Zone verweist auf das File /var/lib/bind/db.dev, wo wir jetzt die Einträge hinterlegen können.

$ORIGIN .
$TTL 3600      ; 1 hour
test.externeseite.com IN SOA  ns.mylan.local. hostmaster.mylan.local. (
                                1 ; serial
                                3600       ; refresh (1 hours)
                                3600       ; retry (1 hour)
                                3600       ; expire (1 hour)
                                3600       ; minimum (1 hour)
                                )
                        NS      ns.mylan.local.
   A    192.168.1.2

Jetzt haben wir für test.externeseite.com die Einträge für SOA, Namesserver und einen A Record vergeben. Indem die erste Spalte leer gelassen wurde, wird das letzte Label übernommen. Das ist nicht ganz schön, aber spart Tipparbeit und für einzelne Hosts ist das vertretbar.

3. Es geht besser - HACK!

Wenn wir jetzt weitere Hosts aus anderen Domains hinzufügen wollen, so müssten wir nur die Zone und den Host in den beiden bestehenden Dateien hinzufügen:

/etc/bind/named.conf.dev:

zone "test.externeseite.com" {
        type master;
        file "/var/lib/bind/db.dev";
};
zone "test.externeseite2.com" {
        type master;
        file "/var/lib/bind/db.dev";
};

/var/lib/bind/db.dev:

$ORIGIN .
$TTL 3600      ; 1 hour
test.externeseite.com    IN      SOA     ns.mylan.local. hostmaster.mylan.local. (
                                2 ; serial
                                3600       ; refresh (1 hours)
                                3600       ; retry (1 hour)
                                3600       ; expire (1 hour)
                                3600       ; minimum (1 hour)
                                )
                        IN      NS      ns.mylan.local.
                        IN      A       192.168.1.2

test.externeseite2.com    IN      SOA     ns.mylan.local. hostmaster.mylan.local. (
                                2 ; serial
                                3600       ; refresh (1 hours)
                                3600       ; retry (1 hour)
                                3600       ; expire (1 hour)
                                3600       ; minimum (1 hour)
                                )
                        IN      NS      ns.mylan.local.
                        IN      A       192.168.1.2

Das ist aber eher mühsam, daher nutzen wir ein Feature, das man normalerweise bei einer schönen bind9 Konfiguration vermeiden sollte!

  1. Vermeide $ORIGIN: Man sollte immer $ORIGIN angeben, damit die Zonendefinition selbsterklärend ist. Wenn kein $ORIGIN definiert ist, so wird der Zonenname aus der bind Konfiguration verwendet.
  2. @ Referenziert immer den letzten $ORIGIN Eintrag - oder wenn dieser fehlt, den Zonennamen.

Daher können wir folgende Zonendefinition anlegen:

$TTL 3600      ; 1 hour
@ IN SOA ns.mylan.local. hostmaster.mylan.local. (
201510220013 ; serial
3600 ; refresh (1 hours)
3600 ; retry (1 hour)
3600 ; expire (1 hour)
3600 ; minimum (1 hour)
)
IN NS ns.mylan.local.
IN A 192.168.1.2

Hier wird also für die Zone (laut bind Konfiguration) der SOA, NS und A Record definiert. Welche Zone auch immer diese Definition erhält kreiert uns einen Redirect auf unseren Webserver.

Wir können die Hosts jetzt einfach per /etc/bind/named.conf.dev umleiten:

zone "foo.bar.com" {
type master;
file "/var/lib/bind/db.dev";
};
zone "test.example.com" {
type master;
file "/var/lib/bind/db.dev";
};
zone "not.even.valid" {
type master;
file "/var/lib/bind/db.dev";
};

(Nicht vergessen: service bind9 restart)

Zum Testen, der Beweis

~$ dig +short foo.bar.com
192.168.1.2
~$ dig +short test.example.com
192.168.1.2
~$ dig +short not.even.valid
192.168.1.2
Tags: