BIND (Berkeley Internet Name Domain) ist der am weitesten verbreitete DNS-Server. Er ermöglicht die Verwaltung eigener Domains und die interne Namensauflösung.

Installation

Debian/Ubuntu

apt update
apt install bind9 bind9utils bind9-doc dnsutils

CentOS/RHEL

dnf install bind bind-utils

Service aktivieren

systemctl enable --now named  # CentOS
systemctl enable --now bind9  # Debian/Ubuntu

Konfigurationsdateien

Struktur

/etc/bind/                    # Debian/Ubuntu
├── named.conf                # Hauptkonfiguration
├── named.conf.options        # Server-Optionen
├── named.conf.local          # Lokale Zonen
├── named.conf.default-zones  # Standard-Zonen
└── zones/                    # Zonendateien
    ├── db.example.com        # Forward-Zone
    └── db.192.168.1          # Reverse-Zone

Caching DNS-Server

Einfache Konfiguration

# /etc/bind/named.conf.options

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

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

    // Rekursion für lokale Clients
    recursion yes;
    allow-recursion { localhost; 192.168.1.0/24; };

    // Weiterleitungen zu öffentlichen DNS
    forwarders {
        8.8.8.8;
        8.8.4.4;
        1.1.1.1;
    };

    // DNSSEC aktivieren
    dnssec-validation auto;

    // IPv6 lauschen
    listen-on-v6 { any; };

    // Versionsnummer verstecken
    version "not available";
};

Konfiguration testen

named-checkconf
systemctl restart bind9

DNS-Test

# Lokale Auflösung
dig @localhost google.com

# Spezifischer Server
dig @192.168.1.1 example.com

Autoritative Zone einrichten

Zone deklarieren

# /etc/bind/named.conf.local

zone "example.com" {
    type master;
    file "/etc/bind/zones/db.example.com";
    allow-transfer { none; };
};

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

Forward-Zone erstellen

# /etc/bind/zones/db.example.com

$TTL    604800
@       IN      SOA     ns1.example.com. admin.example.com. (
                     2024012601         ; Serial (YYYYMMDDNN)
                         604800         ; Refresh (1 week)
                          86400         ; Retry (1 day)
                        2419200         ; Expire (4 weeks)
                         604800 )       ; Negative Cache TTL

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

; A-Records
@       IN      A       192.168.1.10
ns1     IN      A       192.168.1.1
ns2     IN      A       192.168.1.2
www     IN      A       192.168.1.10
mail    IN      A       192.168.1.20
ftp     IN      A       192.168.1.30

; CNAME-Records
webmail IN      CNAME   mail.example.com.
blog    IN      CNAME   www.example.com.

; MX-Records
@       IN      MX  10  mail.example.com.
@       IN      MX  20  mail2.example.com.

; TXT-Records
@       IN      TXT     "v=spf1 mx ip4:192.168.1.20 -all"

Reverse-Zone erstellen

# /etc/bind/zones/db.192.168.1

$TTL    604800
@       IN      SOA     ns1.example.com. admin.example.com. (
                     2024012601         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL

; Nameserver
@       IN      NS      ns1.example.com.

; PTR-Records
1       IN      PTR     ns1.example.com.
2       IN      PTR     ns2.example.com.
10      IN      PTR     www.example.com.
20      IN      PTR     mail.example.com.
30      IN      PTR     ftp.example.com.

Zonendateien prüfen

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

# BIND neu laden
rndc reload
# Oder
systemctl reload bind9

DNS-Records erklärt

Record-Typen

| Typ | Beschreibung | Beispiel | |-----|--------------|----------| | A | IPv4-Adresse | www IN A 192.168.1.10 | | AAAA | IPv6-Adresse | www IN AAAA 2001:db8::1 | | CNAME | Alias | blog IN CNAME www | | MX | Mailserver | @ IN MX 10 mail | | NS | Nameserver | @ IN NS ns1 | | TXT | Text (SPF, DKIM) | @ IN TXT "v=spf1..." | | PTR | Reverse (IP→Name) | 10 IN PTR www | | SRV | Service | _sip._tcp IN SRV 0 5 5060 sip |

Wildcard-Records

*       IN      A       192.168.1.10
# *.example.com → 192.168.1.10

Sekundärer DNS-Server (Slave)

Master konfigurieren

# /etc/bind/named.conf.local (Master)

zone "example.com" {
    type master;
    file "/etc/bind/zones/db.example.com";
    allow-transfer { 192.168.1.2; };  # Slave-IP
    also-notify { 192.168.1.2; };
};

Slave konfigurieren

# /etc/bind/named.conf.local (Slave)

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

Transfer testen

# Auf Slave
dig @localhost example.com AXFR

Split-DNS (Views)

Unterschiedliche Antworten intern/extern

# /etc/bind/named.conf

acl internal { 192.168.1.0/24; 10.0.0.0/8; };

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

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

view "external" {
    match-clients { any; };
    recursion no;

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

DNSSEC

Zone signieren

# Verzeichnis für Schlüssel
cd /etc/bind/zones

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

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

# Schlüssel zur Zone hinzufügen
cat Kexample.com.*.key >> db.example.com

# Zone signieren
dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) \
    -N INCREMENT -o example.com -t db.example.com

Signierte Zone verwenden

# named.conf.local
zone "example.com" {
    type master;
    file "/etc/bind/zones/db.example.com.signed";
};

Logging

Logging-Konfiguration

# /etc/bind/named.conf.options

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

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

    category queries { query_log; };
    category default { default_log; };
};
# Log-Verzeichnis erstellen
mkdir /var/log/named
chown bind:bind /var/log/named

Sicherheit

Zugriffsbeschränkungen

options {
    // Nur lokale Netze
    allow-query { localhost; 192.168.1.0/24; };
    allow-recursion { localhost; 192.168.1.0/24; };

    // Keine Zonentransfers
    allow-transfer { none; };

    // Keine Rekursion für externe Clients
    recursion yes;
    allow-recursion { localhost; 192.168.1.0/24; };
};

Response Rate Limiting

options {
    rate-limit {
        responses-per-second 15;
        referrals-per-second 5;
        nodata-per-second 5;
        nxdomains-per-second 5;
        errors-per-second 5;
        all-per-second 20;
    };
};

chroot-Umgebung

# Debian/Ubuntu: /etc/default/bind9
OPTIONS="-u bind -t /var/lib/named"

Verwaltungsbefehle

rndc (Remote Name Daemon Control)

# Status
rndc status

# Konfiguration neu laden
rndc reload

# Bestimmte Zone neu laden
rndc reload example.com

# Cache leeren
rndc flush

# Statistiken anzeigen
rndc stats
cat /var/cache/bind/named.stats

Abfrage-Tools

# dig
dig example.com
dig @ns1.example.com example.com A
dig example.com MX
dig -x 192.168.1.10  # Reverse

# nslookup
nslookup example.com
nslookup -type=mx example.com

# host
host example.com
host -t ns example.com

Troubleshooting

Konfiguration prüfen

named-checkconf
named-checkzone example.com /etc/bind/zones/db.example.com

Logs prüfen

journalctl -u bind9 -f
tail -f /var/log/syslog | grep named

DNS-Auflösung testen

# Vollständiger Trace
dig +trace example.com

# Ausführliche Ausgabe
dig +short example.com
dig +noall +answer example.com

Häufige Fehler

# Serial vergessen zu erhöhen
# → Zone wird nicht aktualisiert

# Fehlender Punkt am Ende von FQDN
www    IN    CNAME    example.com.  # Richtig
www    IN    CNAME    example.com   # Falsch (→ example.com.example.com)

# Syntaxfehler
named-checkzone example.com /etc/bind/zones/db.example.com

Zusammenfassung

| Befehl | Funktion | |--------|----------| | named-checkconf | Konfiguration prüfen | | named-checkzone | Zonendatei prüfen | | rndc reload | Konfiguration neu laden | | rndc flush | Cache leeren | | dig @server domain | DNS-Abfrage |

| Datei | Beschreibung | |-------|--------------| | named.conf | Hauptkonfiguration | | named.conf.options | Server-Optionen | | named.conf.local | Lokale Zonen | | /etc/bind/zones/* | Zonendateien |

Fazit

BIND9 ist der Industriestandard für DNS-Server. Für einfache Caching-Server genügt eine minimale Konfiguration. Autoritative Server erfordern sorgfältige Zonendatei-Pflege mit korrekten Serial-Updates. DNSSEC erhöht die Sicherheit, erfordert aber zusätzlichen Verwaltungsaufwand. Für kleine Setups sind einfachere Alternativen wie dnsmasq oft ausreichend.