BIND (Berkeley Internet Name Domain) ist der meistgenutzte DNS-Server weltweit. Er kann als autoritativer Server für eigene Domains oder als Caching-Resolver eingesetzt werden.

Installation

Debian/Ubuntu

apt install bind9 bind9utils bind9-doc dnsutils

CentOS/RHEL

dnf install bind bind-utils

Service starten

systemctl enable named    # CentOS
systemctl enable bind9    # Debian

systemctl start named     # CentOS
systemctl start bind9     # Debian

Verzeichnisstruktur

/etc/bind/                 # Debian
/etc/named/                # CentOS

├── named.conf             # Hauptkonfiguration
├── named.conf.options     # Optionen
├── named.conf.local       # Lokale Zonen
├── named.conf.default-zones  # Standard-Zonen
└── zones/
    ├── db.example.de      # Forward Zone
    └── db.192.168.1       # Reverse Zone

Grundkonfiguration

named.conf.options

// /etc/bind/named.conf.options

options {
    directory "/var/cache/bind";

    // Anfragen nur von diesen Netzen
    allow-query {
        localhost;
        192.168.1.0/24;
    };

    // Rekursion nur für lokale Netze
    allow-recursion {
        localhost;
        192.168.1.0/24;
    };

    // Forwarders (für nicht-autoritative Anfragen)
    forwarders {
        8.8.8.8;
        1.1.1.1;
    };

    // DNSSEC aktivieren
    dnssec-validation auto;

    // IPv6 deaktivieren (optional)
    listen-on-v6 { none; };

    // Auf allen Interfaces lauschen
    listen-on { any; };

    // Version verstecken
    version "not disclosed";
};

Autoritative Zone erstellen

Zone deklarieren

// /etc/bind/named.conf.local

zone "example.de" {
    type master;
    file "/etc/bind/zones/db.example.de";
    allow-transfer { 192.168.1.11; };  // Slave-Server
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
    allow-transfer { 192.168.1.11; };
};

Forward Zone

; /etc/bind/zones/db.example.de

$TTL    86400
@       IN      SOA     ns1.example.de. admin.example.de. (
                        2024012601      ; Serial (YYYYMMDDNN)
                        3600            ; Refresh (1 hour)
                        1800            ; Retry (30 min)
                        604800          ; Expire (1 week)
                        86400 )         ; Negative TTL (1 day)

; Nameserver
@       IN      NS      ns1.example.de.
@       IN      NS      ns2.example.de.

; A Records
@       IN      A       203.0.113.10
ns1     IN      A       203.0.113.10
ns2     IN      A       203.0.113.11
www     IN      A       203.0.113.10
mail    IN      A       203.0.113.20
ftp     IN      A       203.0.113.30

; CNAME Records
webmail IN      CNAME   mail.example.de.
shop    IN      CNAME   www.example.de.

; MX Records
@       IN      MX      10 mail.example.de.
@       IN      MX      20 mail2.example.de.

; TXT Records
@       IN      TXT     "v=spf1 mx a:mail.example.de -all"
_dmarc  IN      TXT     "v=DMARC1; p=reject; rua=mailto:dmarc@example.de"

; AAAA Record (IPv6)
@       IN      AAAA    2001:db8::1
www     IN      AAAA    2001:db8::1

Reverse Zone

; /etc/bind/zones/db.192.168.1

$TTL    86400
@       IN      SOA     ns1.example.de. admin.example.de. (
                        2024012601      ; Serial
                        3600            ; Refresh
                        1800            ; Retry
                        604800          ; Expire
                        86400 )         ; Negative TTL

; Nameserver
@       IN      NS      ns1.example.de.
@       IN      NS      ns2.example.de.

; PTR Records
10      IN      PTR     ns1.example.de.
11      IN      PTR     ns2.example.de.
20      IN      PTR     mail.example.de.
100     IN      PTR     server1.example.de.

Konfiguration prüfen

# Syntax prüfen
named-checkconf

# Zone prüfen
named-checkzone example.de /etc/bind/zones/db.example.de
named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1

# Service neu laden
systemctl reload bind9
rndc reload

DNS-Abfragen testen

# A-Record
dig @localhost example.de A

# MX-Record
dig @localhost example.de MX

# NS-Records
dig @localhost example.de NS

# Reverse Lookup
dig @localhost -x 192.168.1.10

# Alle Records
dig @localhost example.de ANY

# Kurze Ausgabe
dig +short @localhost www.example.de

Slave-Server

Slave konfigurieren

// Auf Slave-Server: /etc/bind/named.conf.local

zone "example.de" {
    type slave;
    file "/var/cache/bind/db.example.de";
    masters { 192.168.1.10; };
};

zone "1.168.192.in-addr.arpa" {
    type slave;
    file "/var/cache/bind/db.192.168.1";
    masters { 192.168.1.10; };
};

Master konfigurieren

// Auf Master: Zone-Transfer erlauben
zone "example.de" {
    type master;
    file "/etc/bind/zones/db.example.de";
    allow-transfer { 192.168.1.11; };
    also-notify { 192.168.1.11; };
};

Transfer erzwingen

# Auf Slave
rndc retransfer example.de

DNSSEC

Keys generieren

cd /etc/bind/keys/

# Zone Signing Key (ZSK)
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.de

# Key Signing Key (KSK)
dnssec-keygen -a ECDSAP256SHA256 -f KSK -n ZONE example.de

Zone signieren

# Keys in Zone-Datei einbinden
cat Kexample.de.+*.key >> /etc/bind/zones/db.example.de

# Zone signieren
dnssec-signzone -o example.de -t /etc/bind/zones/db.example.de

named.conf anpassen

zone "example.de" {
    type master;
    file "/etc/bind/zones/db.example.de.signed";
    // ...
};

Caching-Resolver

Nur Forwarding

options {
    directory "/var/cache/bind";

    forwarders {
        8.8.8.8;
        8.8.4.4;
    };

    forward only;  // Nur Forwarders nutzen

    allow-query { localhost; 192.168.0.0/16; };
    allow-recursion { localhost; 192.168.0.0/16; };

    dnssec-validation auto;
};

Views (Split DNS)

// Unterschiedliche Antworten je nach Quelle

acl "internal" {
    192.168.0.0/16;
    localhost;
};

acl "external" {
    any;
};

view "internal" {
    match-clients { internal; };

    zone "example.de" {
        type master;
        file "/etc/bind/zones/internal/db.example.de";
    };
};

view "external" {
    match-clients { external; };

    zone "example.de" {
        type master;
        file "/etc/bind/zones/external/db.example.de";
    };
};

Logging

// /etc/bind/named.conf.local

logging {
    channel default_log {
        file "/var/log/named/named.log" versions 3 size 5m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };

    channel query_log {
        file "/var/log/named/query.log" versions 3 size 5m;
        severity info;
        print-time yes;
    };

    category default { default_log; };
    category queries { query_log; };
};
mkdir -p /var/log/named
chown bind:bind /var/log/named

Sicherheit

Rate Limiting

options {
    rate-limit {
        responses-per-second 10;
        window 5;
    };
};

Firewall

# Nur Port 53 TCP/UDP
ufw allow 53/tcp
ufw allow 53/udp

# Nur von bestimmten IPs
ufw allow from 192.168.1.0/24 to any port 53

Troubleshooting

Logs prüfen

# Journal
journalctl -u bind9 -f

# Oder named
journalctl -u named -f

# Syslog
tail -f /var/log/syslog | grep named

Häufige Fehler

# "zone not loaded due to errors"
named-checkzone example.de /etc/bind/zones/db.example.de

# "permission denied"
chown -R bind:bind /etc/bind/zones/
chmod 640 /etc/bind/zones/*

# "refused"
# → allow-query/allow-recursion prüfen

Zusammenfassung

| Record-Typ | Beschreibung | |------------|--------------| | A | IPv4-Adresse | | AAAA | IPv6-Adresse | | CNAME | Alias | | MX | Mailserver | | NS | Nameserver | | TXT | Text | | PTR | Reverse Lookup | | SOA | Start of Authority |

| Befehl | Funktion | |--------|----------| | named-checkconf | Config prüfen | | named-checkzone | Zone prüfen | | rndc reload | Neu laden | | rndc status | Status | | dig | DNS-Abfrage |

| Datei | Funktion | |-------|----------| | named.conf | Hauptkonfiguration | | named.conf.options | Optionen | | named.conf.local | Lokale Zonen | | zones/db.* | Zone-Dateien |

Fazit

BIND ist der Referenz-DNS-Server für Linux. Die Konfiguration erfordert sorgfältige Planung der Zonen. Serial-Nummern müssen bei Änderungen erhöht werden. DNSSEC erhöht die Sicherheit, ist aber aufwändig. Für einfache Setups sind Alternativen wie PowerDNS oder dnsmasq oft einfacher.