Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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-transfer z 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-checkzone i sprawdź logi journalctl -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 no i allow-query-cache { none; }.
  • Rejestrator odrzuca NS — brakuje glue record. Zarejestruj hostname + IP ns1.example.com u rejestratora przed ustawieniem NS.

Najczęstsze pytania

Czy warto stawiać własny BIND9 zamiast używać DNS u rejestratora? +
Dla prostych domen (kilka rekordów A/MX) DNS u rejestratora albo Cloudflare jest prostszy i szybszy — globalny anycast, brak utrzymania. Własny BIND9 ma sens gdy: (1) zarządzasz dziesiątkami domen i chcesz pełnej automatyzacji przez API, (2) potrzebujesz nietypowych rekordów lub własnej logiki, (3) budujesz wewnętrzny DNS dla VPC/kubernetes, (4) wymagasz DNSSEC podpisanego własnym kluczem. W 90% przypadków Cloudflare DNS lub rejestrator wystarczy.
Ile serwerów DNS potrzebuję dla domeny produkcyjnej? +
Minimum dwa — jeden master (primary) i jeden slave (secondary), najlepiej w różnych lokalizacjach/sieciach. Większość rejestratorów wymaga co najmniej 2 NS records. Dla ważnych usług rekomenduję 3-4 serwery w różnych AS — jeśli jeden ma awarię, inne odpowiadają. BIND obsługuje transfer strefy (AXFR/IXFR) z master do slave automatycznie po każdej zmianie, dzięki mechanizmowi NOTIFY.
Jak DNSSEC chroni przed atakami DNS spoofing? +
DNSSEC podpisuje każdą odpowiedź DNS kryptograficznie — resolver może zweryfikować że odpowiedź faktycznie pochodzi od autorytatywnego serwera i nie została zmodyfikowana po drodze. Chroni przed cache poisoning (np. Kamiński atak z 2008). Implementacja w BIND9: generujesz ZSK (Zone Signing Key) i KSK (Key Signing Key), podpisujesz strefę (auto-dnssec maintain), publikujesz DS record w strefie nadrzędnej (u rejestratora). Bez DS record w parent DNSSEC nie działa.
Co to jest glue record i kiedy go potrzebuję? +
Glue record to rekord A (IP) dla serwera NS który sam jest subdomeną tej samej domeny. Przykład: chcesz ustawić ns1.example.com jako NS dla example.com. Resolver musi znać IP ns1.example.com żeby zapytać o example.com, ale żeby znaleźć to IP musiałby... zapytać ns1.example.com. Krąg. Rozwiązanie: u rejestratora rejestrujesz glue record (hostname + IP) dla ns1.example.com. Jeśli używasz zewnętrznych NS (ns.cloudflare.com) glue nie jest potrzebny.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.