🌐 Jak skonfigurować serwer DNS na Ubuntu 20.04

System DNS (Domain Name System) jest fundamentalnym elementem infrastruktury internetowej, tłumaczącym przyjazne dla człowieka nazwy domen na adresy IP. W tym kompleksowym przewodniku przeprowadzimy Cię przez proces instalacji, konfiguracji i zabezpieczania własnego serwera DNS na Ubuntu 20.04 przy użyciu BIND9 - najpopularniejszego oprogramowania DNS na świecie.

⚡ Ekspresowe Podsumowanie:

  1. Instalacja BIND9 - prawidłowa instalacja pakietów i wstępna konfiguracja serwera DNS.
  2. Konfiguracja podstawowa - ustawienie plików konfiguracyjnych i stref DNS dla domen.
  3. Zaawansowane opcje - delegacja subdomen, konfiguracja DNSSEC i zabezpieczenia.
  4. Testy i diagnostyka - weryfikacja poprawności działania i rozwiązywanie typowych problemów.

🗺️ Spis Treści - Twoja Mapa Drogowa


📋 Podstawy DNS i przygotowanie środowiska

Zanim przystąpimy do instalacji, warto zrozumieć podstawowe koncepcje DNS oraz przygotować system.

Czym jest DNS i jak działa?

Domain Name System (DNS) to hierarchiczny, rozproszony system nazw, który tłumaczy nazwy domen na adresy IP:

  • Resolver - klient DNS, który inicjuje zapytania (np. przeglądarka internetowa)
  • Serwer rekursywny - serwer, który wykonuje pełne zapytanie dla klienta
  • Serwer autorytatywny - serwer zawierający oficjalne rekordy dla domeny
  • Strefa DNS - baza danych zawierająca rekordy dla domeny
  • Rekord DNS - pojedynczy wpis w strefie (np. A, AAAA, MX, CNAME, TXT)

Przygotowanie systemu Ubuntu 20.04

Przed instalacją BIND9, upewnij się, że Twój system jest zaktualizowany:

sudo apt update
sudo apt upgrade

Zalecamy również skonfigurowanie statycznego adresu IP dla serwera DNS:

  1. Otwórz plik konfiguracyjny Netplan:

    sudo nano /etc/netplan/00-installer-config.yaml
  2. Skonfiguruj statyczny adres IP:

    network:
      ethernets:
        ens3:
          dhcp4: no
          addresses: [192.168.1.53/24]  # Przykładowy adres IP i maska
          gateway4: 192.168.1.1         # Brama domyślna
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4]
      version: 2
  3. Zastosuj zmiany:

    sudo netplan apply

Uwaga: Zastąp ens3, adresy IP i bramę własnymi wartościami odpowiednimi dla Twojej sieci. Możesz sprawdzić nazwę interfejsu sieciowego przy pomocy polecenia ip a.

Wymagania systemowe

Dla efektywnego działania serwera DNS na Ubuntu 20.04, zalecane są następujące minimalne zasoby:

  • CPU: 1 vCPU (dla małych i średnich wdrożeń)
  • RAM: 1 GB (minimum), 2 GB (zalecane)
  • Dysk: 10 GB przestrzeni dyskowej
  • Sieć: Stabilne połączenie z internetem, najlepiej ze stałym adresem IP

✨ Pro Tip: W środowisku produkcyjnym zawsze warto mieć co najmniej dwa serwery DNS (główny i zapasowy) dla zapewnienia wysokiej dostępności.


🔧 Instalacja i podstawowa konfiguracja BIND9

Instalacja pakietów BIND9

Instalacja BIND9 na Ubuntu 20.04 jest prosta dzięki menedżerowi pakietów APT:

sudo apt install bind9 bind9utils bind9-doc dnsutils

Ten zestaw pakietów zawiera:

  • bind9 - serwer DNS
  • bind9utils - narzędzia do zarządzania BIND9
  • bind9-doc - dokumentacja
  • dnsutils - narzędzia diagnostyczne (dig, nslookup)

Po zakończeniu instalacji, BIND9 powinien automatycznie uruchomić się jako usługa systemowa. Możesz sprawdzić jej status:

sudo systemctl status bind9

Struktura katalogów i plików konfiguracyjnych

BIND9 używa następującej struktury katalogów w Ubuntu 20.04:

  • /etc/bind/ - główny katalog konfiguracyjny
  • /etc/bind/named.conf - główny plik konfiguracyjny
  • /etc/bind/named.conf.options - opcje globalne
  • /etc/bind/named.conf.local - konfiguracja lokalnych stref
  • /etc/bind/named.conf.default-zones - standardowe strefy
  • /var/cache/bind/ - miejsce przechowywania plików stref

Konfiguracja podstawowych opcji

Zacznijmy od edycji pliku opcji, aby skonfigurować podstawowe parametry serwera:

sudo nano /etc/bind/named.conf.options

Oto przykładowa konfiguracja z komentarzami:

options {
    // Katalog dla plików stref
    directory "/var/cache/bind";

    // Nasłuchiwanie na wszystkich interfejsach 
    // (można ograniczyć do konkretnych adresów IP)
    listen-on { any; };
    listen-on-v6 { any; };

    // Ograniczenie zapytań rekursywnych tylko do lokalnej sieci
    allow-recursion {
        127.0.0.1;
        192.168.1.0/24;  // Zastąp swoją siecią
    };

    // Przekazywanie zapytań do innych serwerów DNS (forwarders)
    forwarders {
        8.8.8.8;  // Google DNS
        8.8.4.4;
    };

    // Zabezpieczenia
    version "not disclosed";  // Ukrycie wersji BIND
    dnssec-validation auto;   // Włączenie walidacji DNSSEC
    auth-nxdomain no;         // Zgodność ze standardem RFC1035

    // Limity transferu stref
    allow-transfer { none; };

    // Zwiększenie wydajności
    minimal-responses yes;
};

Po dokonaniu zmian, sprawdź poprawność składni:

sudo named-checkconf

Jeśli polecenie nie zwróci żadnego błędu, konfiguracja jest poprawna. Następnie zrestartuj BIND9, aby zastosować zmiany:

sudo systemctl restart bind9

📝 Konfiguracja stref DNS

Strefy DNS to zbiory rekordów dla konkretnych domen. W BIND9 konfigurujemy je w pliku named.conf.local.

Tworzenie strefy do przodu (forward zone)

Strefa do przodu służy do tłumaczenia nazw domen na adresy IP. Edytuj plik konfiguracyjny:

sudo nano /etc/bind/named.conf.local

Dodaj definicję strefy dla swojej domeny:

zone "przyklad.pl" {
    type master;
    file "/var/cache/bind/db.przyklad.pl";
    allow-transfer { 192.168.1.54; };  // Adres IP serwera zapasowego (jeśli istnieje)
};

Teraz utwórz plik strefy, najlepiej kopiując istniejący szablon:

sudo cp /etc/bind/db.local /var/cache/bind/db.przyklad.pl
sudo nano /var/cache/bind/db.przyklad.pl

Edytuj plik strefy tak, aby wyglądał podobnie do poniższego:

$TTL    604800
@       IN      SOA     ns1.przyklad.pl. admin.przyklad.pl. (
                         2023042901     ; Serial
                         604800         ; Refresh
                         86400          ; Retry
                         2419200        ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.przyklad.pl.
@       IN      NS      ns2.przyklad.pl.
@       IN      A       192.168.1.10
@       IN      AAAA    ::1
@       IN      MX      10 mail.przyklad.pl.
www     IN      A       192.168.1.10
mail    IN      A       192.168.1.20
ns1     IN      A       192.168.1.53
ns2     IN      A       192.168.1.54
ftp     IN      CNAME   www

W powyższym przykładzie:

  • $TTL - Time To Live, określa jak długo rekord może być przechowywany w pamięci podręcznej
  • SOA - Start of Authority, zawiera informacje o strefie
  • Serial - numer seryjny, zwiększany przy każdej zmianie
  • NS - rekordy serwerów nazw
  • A - rekordy adresów IPv4
  • AAAA - rekordy adresów IPv6
  • MX - rekord serwera pocztowego
  • CNAME - alias dla innego rekordu

Tworzenie strefy odwrotnej (reverse zone)

Strefa odwrotna służy do tłumaczenia adresów IP na nazwy (reverse DNS lookup). Dodaj definicję strefy odwrotnej do pliku named.conf.local:

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/var/cache/bind/db.192.168.1";
    allow-transfer { 192.168.1.54; };  // Adres IP serwera zapasowego
};

Utwórz plik strefy odwrotnej:

sudo cp /etc/bind/db.127 /var/cache/bind/db.192.168.1
sudo nano /var/cache/bind/db.192.168.1

Edytuj plik strefy odwrotnej:

$TTL    604800
@       IN      SOA     ns1.przyklad.pl. admin.przyklad.pl. (
                         2023042901     ; Serial
                         604800         ; Refresh
                         86400          ; Retry
                         2419200        ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.przyklad.pl.
@       IN      NS      ns2.przyklad.pl.

10      IN      PTR     przyklad.pl.
10      IN      PTR     www.przyklad.pl.
20      IN      PTR     mail.przyklad.pl.
53      IN      PTR     ns1.przyklad.pl.
54      IN      PTR     ns2.przyklad.pl.

W rekordach PTR (Pointer) łączymy adres IP (ostatni oktet) z pełną nazwą domenową (FQDN).

Sprawdzanie poprawności plików stref

Po utworzeniu plików stref, sprawdź ich poprawność:

sudo named-checkzone przyklad.pl /var/cache/bind/db.przyklad.pl
sudo named-checkzone 1.168.192.in-addr.arpa /var/cache/bind/db.192.168.1

Jeśli wszystko jest poprawne, zrestartuj BIND9:

sudo systemctl restart bind9

✨ Pro Tip: Zawsze zwiększaj numer seryjny (Serial) w rekordzie SOA po każdej zmianie pliku strefy. Konwencja to często data w formacie YYYYMMDDNN, gdzie NN to numer rewizji danego dnia.


🛠️ Zaawansowana konfiguracja DNS

Delegacja subdomen

Delegacja pozwala na przekazanie kontroli nad subdomeną innemu serwerowi DNS. Dodaj następujące rekordy do pliku strefy głównej:

subdomena   IN    NS    ns1.subdomena.przyklad.pl.
subdomena   IN    NS    ns2.subdomena.przyklad.pl.
ns1.subdomena     IN    A     192.168.2.53
ns2.subdomena     IN    A     192.168.2.54

Ta konfiguracja informuje, że zapytania dotyczące subdomena.przyklad.pl powinny być kierowane do serwerów ns1.subdomena.przyklad.pl i ns2.subdomena.przyklad.pl.

Konfiguracja DNSSEC

DNSSEC (Domain Name System Security Extensions) zapewnia dodatkowe zabezpieczenia przez podpisywanie cyfrowe rekordów DNS. Aby włączyć DNSSEC:

  1. Wygeneruj klucze dla strefy:
cd /etc/bind/keys
sudo dnssec-keygen -a RSASHA256 -b 2048 -n ZONE przyklad.pl
sudo dnssec-keygen -a RSASHA256 -b 4096 -n ZONE -f KSK przyklad.pl
  1. Zaktualizuj plik strefy, dodając odniesienia do kluczy oraz zwiększając numer seryjny.

  2. Podpisz strefę:

sudo dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o przyklad.pl -t /var/cache/bind/db.przyklad.pl
  1. Zaktualizuj konfigurację strefy w named.conf.local:
zone "przyklad.pl" {
    type master;
    file "/var/cache/bind/db.przyklad.pl.signed";
    key-directory "/etc/bind/keys";
    auto-dnssec maintain;
    inline-signing yes;
    allow-transfer { 192.168.1.54; };
};
  1. Zrestartuj BIND9:
sudo systemctl restart bind9

Konfiguracja serwera zapasowego (slave)

Serwer zapasowy zwiększa niezawodność i dostępność usług DNS. Na serwerze głównym (master), zaktualizuj opcje transferu:

zone "przyklad.pl" {
    type master;
    file "/var/cache/bind/db.przyklad.pl";
    allow-transfer { 192.168.1.54; };  // Adres IP serwera zapasowego
    also-notify { 192.168.1.54; };    // Powiadomienie o zmianach
};

Na serwerze zapasowym, skonfiguruj strefę jako slave:

zone "przyklad.pl" {
    type slave;
    file "/var/cache/bind/db.przyklad.pl";
    masters { 192.168.1.53; };  // Adres IP serwera głównego
};

Inne zaawansowane opcje

Ograniczenie dostępu do zapytań

Możesz ograniczyć, które adresy IP mogą wysyłać zapytania do Twojego serwera DNS:

options {
    // ...
    allow-query {
        localhost;
        192.168.1.0/24;  // Dozwolona sieć
    };
    // ...
};

Konfiguracja widoków (views)

Widoki pozwalają na prezentowanie różnych odpowiedzi DNS w zależności od źródła zapytania:

view "internal" {
    match-clients { 192.168.1.0/24; };

    zone "przyklad.pl" {
        type master;
        file "/var/cache/bind/internal/db.przyklad.pl";
    };
};

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

    zone "przyklad.pl" {
        type master;
        file "/var/cache/bind/external/db.przyklad.pl";
    };
};

Ta konfiguracja pozwala na różne odpowiedzi dla zapytań z sieci wewnętrznej i zewnętrznej.


🔍 Testowanie i diagnostyka serwera DNS

Podstawowe narzędzia diagnostyczne

dig - narzędzie do zapytań DNS

# Zapytanie o rekord A
dig @127.0.0.1 przyklad.pl A

# Zapytanie o rekord MX
dig @127.0.0.1 przyklad.pl MX

# Zapytanie o rekord NS
dig @127.0.0.1 przyklad.pl NS

# Zapytanie odwrotne (PTR)
dig @127.0.0.1 -x 192.168.1.10

nslookup - alternatywne narzędzie do zapytań DNS

# Zapytanie o rekord A
nslookup przyklad.pl 127.0.0.1

# Zapytanie o rekord MX
nslookup -type=MX przyklad.pl 127.0.0.1

host - proste narzędzie do konwersji między nazwami i adresami IP

host przyklad.pl 127.0.0.1
host 192.168.1.10 127.0.0.1

Monitorowanie logów BIND9

BIND9 zapisuje logi w systemowym dzienniku. Możesz je przeglądać:

sudo journalctl -u named
# lub
sudo tail -f /var/log/syslog | grep named

Aby zwiększyć poziom szczegółowości logów, zmodyfikuj plik named.conf.options:

options {
    // ...
    logging {
        channel default_debug {
            file "/var/log/named/named.log";
            severity dynamic;
        };
    };
    // ...
};

Upewnij się, że katalog istnieje i ma odpowiednie uprawnienia:

sudo mkdir -p /var/log/named
sudo chown bind:bind /var/log/named

Rozwiązywanie typowych problemów

Problem: Serwer DNS nie uruchamia się

Rozwiązanie:

  1. Sprawdź logi: sudo journalctl -u named
  2. Zweryfikuj składnię plików konfiguracyjnych: sudo named-checkconf
  3. Sprawdź uprawnienia do plików: sudo ls -la /etc/bind/ /var/cache/bind/

Problem: Strefa nie ładuje się prawidłowo

Rozwiązanie:

  1. Sprawdź poprawność pliku strefy: sudo named-checkzone przyklad.pl /var/cache/bind/db.przyklad.pl
  2. Upewnij się, że numer seryjny został zwiększony
  3. Sprawdź uprawnienia do plików stref

Problem: Serwer nie odpowiada na zapytania

Rozwiązanie:

  1. Sprawdź, czy BIND nasłuchuje: sudo ss -tulpn | grep named
  2. Sprawdź konfigurację zapory: sudo ufw status
  3. Upewnij się, że port 53 (TCP i UDP) jest otwarty: sudo ufw allow 53/tcp i sudo ufw allow 53/udp

✅ Checklista poprawnej konfiguracji:

  • 🔍 Serwer DNS uruchamia się bez błędów
  • 🔄 Odpowiada na zapytania z lokalnego hosta dig @127.0.0.1 przyklad.pl
  • 🔒 Port 53 jest otwarty dla ruchu TCP i UDP
  • 📱 Strefy forwardowa i odwrotna są poprawnie skonfigurowane
  • 🛡️ Ograniczenia dostępu są prawidłowo ustawione
  • 📊 Rekordy MX, A, AAAA i inne są poprawnie skonfigurowane

💻 Integracja z systemem i automatyzacja

Konfiguracja klienta DNS

Aby wykorzystać lokalny serwer DNS na maszynie, na której jest zainstalowany:

sudo nano /etc/netplan/00-installer-config.yaml

Zmień konfigurację nameservers:

nameservers:
  addresses: [127.0.0.1, 8.8.8.8]

Zastosuj zmiany:

sudo netplan apply

Alternatywnie, możesz edytować plik /etc/resolv.conf (uwaga: może być nadpisany przez system):

nameserver 127.0.0.1
nameserver 8.8.8.8

Automatyczne aktualizacje stref

Dla dynamicznie zmieniających się środowisk, możesz zautomatyzować aktualizacje stref DNS za pomocą skryptów. Oto prosty przykład skryptu bash:

#!/bin/bash
# Zwiększ numer seryjny
SERIAL=$(date +%Y%m%d01)
sed -i "s/[0-9]\{10\}/$SERIAL/" /var/cache/bind/db.przyklad.pl

# Zrestartuj BIND9
systemctl restart bind9

Dla bardziej zaawansowanej automatyzacji, rozważ użycie narzędzi takich jak Ansible, Puppet lub Chef.

Kopie zapasowe konfiguracji

Regularne kopie zapasowe konfiguracji DNS są kluczowe. Prosty skrypt kopii zapasowej:

#!/bin/bash
BACKUP_DIR="/backup/bind/$(date +%Y-%m-%d)"
mkdir -p $BACKUP_DIR
cp -r /etc/bind/ $BACKUP_DIR/
cp -r /var/cache/bind/ $BACKUP_DIR/

Możesz uruchomić ten skrypt jako zadanie cron dla regularnych kopii zapasowych:

sudo crontab -e

Dodaj linię, aby wykonywać kopię zapasową codziennie o północy:

0 0 * * * /path/to/backup_script.sh

❓ FAQ - Odpowiedzi na Twoje Pytania

Czy mogę uruchomić BIND9 w kontenerze Docker?
Tak, BIND9 może być uruchomiony w kontenerze Docker. Istnieje wiele gotowych obrazów, np. internetsystemsconsortium/bind9. Pamiętaj o udostępnieniu portów 53/TCP i 53/UDP oraz odpowiednim montowaniu woluminów dla plików konfiguracyjnych.

Jaka jest różnica między serwerem rekursywnym a autorytatywnym?
Serwer rekursywny wykonuje pełne zapytania w imieniu klienta, przechodząc przez hierarchię DNS. Serwer autorytatywny przechowuje rekordy dla konkretnych domen i odpowiada na zapytania dotyczące tylko tych domen.

Jak zabezpieczyć serwer DNS przed atakami DDoS?
Możesz ograniczyć ruch poprzez konfigurację zapory (iptables/ufw), wdrożyć limitowanie zapytań w BIND9 (rate-limiting), użyć usługi anty-DDoS lub umieścić serwer za odwrotnym proxy z funkcjami mitygacji DDoS.

Jak skonfigurować BIND9 jako serwer tylko dla cachingu?
Ustaw type na recursor w konfiguracji, wyłącz funkcje autorytatywne i skonfiguruj odpowiednie ograniczenia dostępu dla zapytań rekursywnych.

Jak często powinienem aktualizować BIND9?
Zalecamy regularne aktualizacje systemu, co najmniej raz w miesiącu lub natychmiast po ogłoszeniu poprawek bezpieczeństwa dla BIND9 lub systemu operacyjnego.


🏁 Podsumowanie - Twój serwer DNS gotowy do działania

Konfiguracja własnego serwera DNS na Ubuntu 20.04 przy użyciu BIND9 daje wiele korzyści, w tym pełną kontrolę nad rozwiązywaniem nazw, możliwość tworzenia niestandardowych stref i potencjalnie szybsze rozwiązywanie nazw w sieci lokalnej.

W tym przewodniku omówiliśmy:

  1. Instalację i podstawową konfigurację BIND9
  2. Tworzenie i konfigurację stref do przodu i odwrotnych
  3. Zaawansowane funkcje, takie jak DNSSEC i delegacja subdomen
  4. Testowanie, monitorowanie i rozwiązywanie problemów
  5. Integrację z systemem i automatyzację zadań

Pamiętaj, że prawidłowo skonfigurowany serwer DNS jest kluczowym elementem infrastruktury sieciowej. Regularnie monitoruj jego działanie, aktualizuj konfigurację i dbaj o bezpieczeństwo.

🚀 Potrzebujesz profesjonalnego hostingu z zarządzanymi serwerami DNS?

Sprawdź ofertę hostingu w IQHost

W IQHost oferujemy w pełni zarządzane, redundantne usługi DNS z globalną siecią dystrybucji, zapewniając maksymalną dostępność i wydajność dla Twojej domeny, bez potrzeby samodzielnej konfiguracji i zarządzania serwerami DNS.

Czy ten artykuł był pomocny?

Wróć do listy wpisów

Twoja strona WordPress działa wolno?

Sprawdź nasz hosting WordPress z ultraszybkimi dyskami NVMe i konfiguracją serwera zoptymalizowaną pod kątem wydajności. Doświadcz różnicy już dziś!

Sprawdź ofertę hostingu
30-dniowa gwarancja zwrotu pieniędzy