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 dnsutilsCentOS/RHEL
dnf install bind bind-utilsService aktivieren
systemctl enable --now named # CentOS
systemctl enable --now bind9 # Debian/UbuntuKonfigurationsdateien
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-ZoneCaching 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 bind9DNS-Test
# Lokale Auflösung
dig @localhost google.com
# Spezifischer Server
dig @192.168.1.1 example.comAutoritative 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 bind9DNS-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.10Sekundä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 AXFRSplit-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.comSignierte 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/namedSicherheit
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.statsAbfrage-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.comTroubleshooting
Konfiguration prüfen
named-checkconf
named-checkzone example.com /etc/bind/zones/db.example.comLogs prüfen
journalctl -u bind9 -f
tail -f /var/log/syslog | grep namedDNS-Auflösung testen
# Vollständiger Trace
dig +trace example.com
# Ausführliche Ausgabe
dig +short example.com
dig +noall +answer example.comHä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.comZusammenfassung
| 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.