BIND9 — konfiguracja autoritative DNS, slave i DNSSEC
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / DNS
BIND9 (Berkeley Internet Name Domain) to najstarszy i wciąż najpopularniejszy serwer DNS w internecie — stoi za dużą częścią infrastruktury rejestratorów i hostingów. W tym przewodniku postawimy BIND9 jako autorytatywny serwer dla własnej domeny, skonfigurujemy slave na drugim VPS, dodamy rekordy email (SPF/DKIM/DMARC) i na koniec podpiszemy strefę DNSSEC. Całość na Debian/Ubuntu, ale komendy przenoszą się na inne dystrybucje.
Instalacja i struktura plików
sudo apt update sudo apt install bind9 bind9utils bind9-doc dnsutils # Struktura katalogów # /etc/bind/named.conf - główny plik (includes) # /etc/bind/named.conf.options - opcje globalne (listen-on, forwarders, allow-query) # /etc/bind/named.conf.local - definicje stref # /etc/bind/zones/ - pliki zone (utwórz ręcznie) # /var/cache/bind/ - runtime data i dynamic zones sudo mkdir -p /etc/bind/zones sudo chown -R bind:bind /etc/bind/zones
named.conf.options — globalne ustawienia
Autorytatywny serwer DNS NIE powinien odpowiadać na zapytania rekursywne od obcych — to otwarty resolver, który może być wykorzystany do ataków DNS amplification. Wyłączamy rekursję i ograniczamy zapytania do strefy, którą obsługujemy:
// /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
// Tylko publiczny IP serwera (nie 0.0.0.0)
listen-on { 203.0.113.10; 127.0.0.1; };
listen-on-v6 { any; };
// Autoritative only — zero rekursji
recursion no;
allow-recursion { none; };
allow-query { any; };
allow-query-cache { none; };
// Kto może zrobić transfer strefy (tylko slave)
allow-transfer { 198.51.100.20; };
// Bezpieczeństwo
version "redacted";
hostname none;
server-id none;
// DNSSEC walidacja dla queries iteracyjnych (jeśli kiedyś włączysz recursion)
dnssec-validation auto;
}; Definicja strefy — named.conf.local
// /etc/bind/named.conf.local
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
allow-transfer { 198.51.100.20; }; // slave IP
also-notify { 198.51.100.20; }; // powiadom slave po zmianie
};
zone "113.0.203.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.203.0.113"; // reverse DNS
}; Zone file — rekordy A/AAAA/MX/TXT/SPF/DKIM
; /etc/bind/zones/db.example.com
$TTL 3600
$ORIGIN example.com.
@ IN SOA ns1.example.com. admin.example.com. (
2026040901 ; Serial YYYYMMDDNN - zwieksz przy kazdej zmianie
3600 ; Refresh (slave pyta co 1h)
900 ; Retry (ponow po 15 min)
1209600 ; Expire (14 dni)
86400 ; Minimum TTL (negative cache)
)
; Rekordy NS - autoritative nameservers
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; Glue records dla NS
ns1 IN A 203.0.113.10
ns2 IN A 198.51.100.20
; A i AAAA dla apex i www
@ IN A 203.0.113.10
@ IN AAAA 2001:db8::10
www IN A 203.0.113.10
www IN AAAA 2001:db8::10
; CNAME
blog IN CNAME www
mail IN A 203.0.113.11
; MX - priority lower = preferred
@ IN MX 10 mail.example.com.
; SPF w TXT
@ IN TXT "v=spf1 mx ip4:203.0.113.11 -all"
; DKIM (skrocony - prawdziwy klucz jest dluzszy)
default._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb..."
; DMARC
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]"
; CAA - kto moze wystawiac certyfikaty SSL
@ IN CAA 0 issue "letsencrypt.org"
@ IN CAA 0 iodef "mailto:[email protected]" Ważne: zawsze inkrementuj numer serial (format YYYYMMDDNN). Slave porównuje serial i nie pobiera strefy jeśli jest taki sam. Jeśli zapomnisz, slave nie zsynchronizuje zmian.
Walidacja konfiguracji i restart
# Sprawdz skladnie named.conf sudo named-checkconf # Sprawdz zone file sudo named-checkzone example.com /etc/bind/zones/db.example.com # Reload bez restartu (szybsze) sudo rndc reload # Albo restart sudo systemctl restart bind9 # Sprawdz status sudo systemctl status bind9 sudo rndc status
Slave server (secondary)
Na drugim VPS instalujemy BIND9 identycznie, ale strefa ma typ slave — BIND automatycznie
pobierze dane z mastera przez AXFR i zaktualizuje przy każdym NOTIFY:
// Slave - /etc/bind/named.conf.local
zone "example.com" {
type slave;
file "/var/cache/bind/db.example.com";
masters { 203.0.113.10; };
allow-notify { 203.0.113.10; };
}; Rekordy DNS — typy i zastosowanie
| Typ | Zastosowanie | Przykład |
|---|---|---|
| A | IPv4 dla hosta | www IN A 203.0.113.10 |
| AAAA | IPv6 dla hosta | www IN AAAA 2001:db8::10 |
| CNAME | Alias (przekierowanie nazwowe) | blog IN CNAME www |
| MX | Serwer pocztowy (z priority) | @ IN MX 10 mail |
| TXT | Dowolny tekst (SPF, DKIM, weryfikacje) | @ IN TXT "v=spf1..." |
| NS | Delegacja do innego serwera DNS | @ IN NS ns1.example.com. |
| PTR | Reverse DNS (IP to nazwa) | 10 IN PTR mail.example.com. |
| CAA | Autoryzacja CA do wystawiania SSL | @ IN CAA 0 issue "letsencrypt.org" |
DNSSEC — podpisanie strefy
Nowoczesny BIND9 obsługuje automatyczne podpisywanie strefy — wystarczy włączyć
dnssec-policy i BIND sam wygeneruje i rotuje klucze. Tryb auto-maintain pilnuje też
rollover ZSK.
// named.conf.options - polityka DNSSEC
dnssec-policy "default" {
keys {
ksk lifetime P1Y algorithm ECDSAP256SHA256;
zsk lifetime P30D algorithm ECDSAP256SHA256;
};
};
// named.conf.local - wlaczenie dla strefy
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
dnssec-policy "default";
inline-signing yes;
}; # Po reload - zobacz wygenerowane DS record sudo rndc reload sudo rndc dnssec -status example.com # Pokaz DS record (wklej u rejestratora domeny) sudo dnssec-dsfromkey /var/cache/bind/K*.key # Weryfikacja - odpytaj serwer z flaga +dnssec dig +dnssec example.com @203.0.113.10
Kluczowy krok: DS record wygenerowany przez BIND musisz opublikować u rejestratora
domeny (panel zarządzania NS) — bez tego parent zone nie potwierdza kluczy i DNSSEC nie działa.
Weryfikacja: dnssec-analyzer.verisignlabs.com.
Troubleshooting
- Slave nie aktualizuje się — sprawdź czy zwiększyłeś serial, czy master ma
allow-transferz IP slave, czy firewall przepuszcza TCP 53 (AXFR używa TCP, nie UDP). - SERVFAIL dla wszystkich zapytań — błąd składni w zone file. Uruchom
named-checkzonei sprawdź logijournalctl -u bind9. - Domena dalej wskazuje stary IP — TTL. Jeśli TTL=3600, musisz czekać godzinę na wygaśnięcie cache u resolverów. Przed migracją obniż TTL do 300 na 24h.
- DNS amplification — skargi od ISP — masz włączoną rekursję. Ustaw
recursion noiallow-query-cache { none; }. - Rejestrator odrzuca NS — brakuje glue record. Zarejestruj hostname + IP ns1.example.com u rejestratora przed ustawieniem NS.