🌐 Jak zainstalować i skonfigurować serwer DNS na Ubuntu 20.04

System DNS (Domain Name System) stanowi fundament współczesnego internetu, tłumacząc przyjazne dla człowieka nazwy domen na adresy IP zrozumiałe dla komputerów. W tym kompleksowym przewodniku pokażemy, jak skonfigurować własny serwer DNS oparty na BIND9 na Ubuntu 20.04. Niezależnie od tego, czy chcesz stworzyć lokalny serwer nazw dla swojej sieci, czy skonfigurować autorytatywny serwer DNS dla swoich domen, ten poradnik krok po kroku przeprowadzi Cię przez cały proces.

⚡ Ekspresowe Podsumowanie:

  1. Instalacja BIND9: sudo apt update && sudo apt install bind9 bind9utils bind9-doc dnsutils
  2. Podstawowa konfiguracja: Edycja plików /etc/bind/named.conf.* do skonfigurowania ogólnych parametrów
  3. Konfiguracja stref DNS: Tworzenie stref forward i reverse dla tłumaczenia nazw domen na adresy IP i odwrotnie
  4. Zabezpieczenia i optymalizacja: Implementacja DNSSEC, filtrowania zapytań i monitoringu dla bezpieczeństwa i wydajności

🗺️ Spis Treści - Twoja Mapa Drogowa


📚 Podstawy DNS i BIND9

Zanim przejdziemy do instalacji, warto zrozumieć podstawowe koncepcje DNS i BIND9.

Czym jest DNS i dlaczego jest ważny?

DNS (Domain Name System) to hierarchiczny, zdecentralizowany system, który tłumaczy nazwy domen (np. iqhost.pl) na adresy IP (np. 192.168.1.1). Działa on jak książka telefoniczna internetu, umożliwiając użytkownikom korzystanie z łatwych do zapamiętania nazw zamiast ciągów liczbowych.

DNS jest kluczowy dla funkcjonowania internetu z kilku powodów:

  • Umożliwia intuicyjne nawigowanie po sieci
  • Zapewnia elastyczność - adresy IP mogą się zmieniać, ale nazwy domen pozostają stałe
  • Umożliwia równoważenie obciążenia i redundancję poprzez wskazywanie wielu adresów IP dla jednej nazwy

Co to jest BIND9?

BIND (Berkeley Internet Name Domain) to najpopularniejsze oprogramowanie serwera DNS na świecie. BIND9 to jego najnowsza stabilna wersja, która oferuje:

  • Pełną zgodność ze standardami DNS
  • Wsparcie dla DNSSEC (DNS Security Extensions)
  • Dynamiczne aktualizacje DNS
  • Wysoką wydajność i skalowalność
  • Zaawansowane funkcje zabezpieczeń

Rodzaje serwerów DNS

W ekosystemie DNS istnieje kilka typów serwerów:

  1. Rekursywny resolver - przyjmuje zapytania od klientów (komputerów) i wykonuje niezbędne zapytania do innych serwerów DNS, aby znaleźć odpowiedź
  2. Autorytatywny serwer - przechowuje rekordy DNS dla konkretnych domen i udziela "autorytatywnych" odpowiedzi
  3. Forwarding serwer - przekazuje zapytania do innych serwerów DNS
  4. Root serwer - najwyższy poziom hierarchii DNS, kieruje zapytania do odpowiednich serwerów TLD

W tym przewodniku skonfigurujemy BIND9 jako kombinację rekursywnego resolvera i autorytatywnego serwera dla naszych własnych domen.

💿 Krok 1: Instalacja BIND9 na Ubuntu 20.04

Przygotowanie systemu

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

sudo apt update
sudo apt upgrade

Warto również ustawić stały adres IP dla serwera DNS. Możesz to zrobić poprzez edycję pliku Netplan:

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

Przykładowa konfiguracja statycznego IP:

network:
  ethernets:
    enp0s3:
      addresses: [192.168.1.53/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [127.0.0.1, 8.8.8.8]
  version: 2

Po wprowadzeniu zmian, zastosuj nową konfigurację:

sudo netplan apply

Uwaga: Upewnij się, że adresy IP dostosowane są do Twojej sieci. 192.168.1.53 to przykładowy adres dla serwera DNS (tradycyjnie używa się adresów kończących się na .53 dla serwerów DNS, ponieważ DNS używa portu 53).

Instalacja pakietów BIND9

Teraz zainstalujmy BIND9 i powiązane narzędzia:

sudo apt install bind9 bind9utils bind9-doc dnsutils

Te pakiety zawierają:

  • bind9 - główny pakiet serwera DNS
  • bind9utils - narzędzia do zarządzania BIND9
  • bind9-doc - dokumentacja
  • dnsutils - dodatkowe narzędzia, takie jak dig i nslookup

Weryfikacja instalacji

Po instalacji sprawdź, czy BIND9 działa poprawnie:

sudo systemctl status bind9

Powinieneś zobaczyć informację, że usługa jest aktywna (running). Jeśli nie, uruchom ją:

sudo systemctl start bind9

Aby upewnić się, że BIND9 uruchamia się automatycznie przy starcie systemu:

sudo systemctl enable bind9

✨ Pro Tip: BIND9 działa pod nazwą usługi named (co jest skrótem od "name daemon"). Więc możesz również używać komend takich jak sudo systemctl status named.

🔧 Krok 2: Podstawowa konfiguracja BIND9

BIND9 używa kilku plików konfiguracyjnych w katalogu /etc/bind/. Główne z nich to:

  • named.conf - główny plik konfiguracyjny, który włącza pozostałe
  • named.conf.options - zawiera globalne opcje konfiguracyjne
  • named.conf.local - służy do definiowania stref lokalnych
  • named.conf.default-zones - zawiera definicje domyślnych stref DNS

Konfiguracja opcji BIND9

Zacznijmy od skonfigurowania podstawowych opcji. Otwórz plik named.conf.options:

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

Oto przykładowa konfiguracja z komentarzami:

options {
    // Katalog roboczy dla BIND
    directory "/var/cache/bind";

    // Jeśli nie ma innej konfiguracji, przekazuj zapytania do Google DNS
    forwarders {
        8.8.8.8;
        8.8.4.4;
    };

    // Do not query bogus/malicious servers
    dnssec-validation auto;

    // Zezwalaj na zapytania rekursywne z sieci lokalnej
    recursion yes;
    allow-recursion { localnets; localhost; };

    // Aktywuj querylog dla celów debugowania
    querylog yes;

    // Ukryj wersję BIND dla bezpieczeństwa
    version none;

    // BIND będzie nasłuchiwał na wszystkich interfejsach
    listen-on { any; };
    listen-on-v6 { any; };
};

Po wprowadzeniu zmian sprawdź konfigurację pod kątem błędów:

sudo named-checkconf

Jeśli polecenie nie zwróci żadnego wyjścia, oznacza to, że konfiguracja jest poprawna. Następnie zrestartuj BIND9:

sudo systemctl restart bind9

Weryfikacja działania forwardingu

Aby sprawdzić, czy przekazywanie zapytań działa poprawnie, użyj polecenia dig:

dig google.com @127.0.0.1

Powinieneś otrzymać odpowiedź zawierającą adres IP google.com, co oznacza, że Twój serwer DNS poprawnie przekazuje zapytania do forwarderów.

🏗️ Krok 3: Konfiguracja stref DNS

Teraz zajmiemy się konfiguracją własnych stref DNS. Strefy DNS dzielą się na dwa główne typy:

  1. Strefa forward - tłumaczy nazwy domen na adresy IP
  2. Strefa reverse - tłumaczy adresy IP na nazwy domen (tzw. reverse DNS)

Konfiguracja strefy forward

Załóżmy, że chcemy skonfigurować strefę dla domeny przyklad.local. Otwórz plik named.conf.local:

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

Dodaj definicję strefy:

// Strefa forward dla przyklad.local
zone "przyklad.local" {
    type master;
    file "/etc/bind/zones/db.przyklad.local";
    allow-update { none; };
};

Teraz utwórz katalog na pliki stref i skopiuj domyślny plik strefy jako szablon:

sudo mkdir -p /etc/bind/zones
sudo cp /etc/bind/db.local /etc/bind/zones/db.przyklad.local

Edytuj plik strefy:

sudo nano /etc/bind/zones/db.przyklad.local

Oto przykładowa zawartość:

; BIND data file for przyklad.local
$TTL    604800
@       IN      SOA     ns1.przyklad.local. admin.przyklad.local. (
                     2023091201         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
; Rekord NS
@       IN      NS      ns1.przyklad.local.

; Rekordy A
@       IN      A       192.168.1.53
ns1     IN      A       192.168.1.53
www     IN      A       192.168.1.100
mail    IN      A       192.168.1.101

; Rekordy MX
@       IN      MX      10 mail.przyklad.local.

; Rekordy CNAME
ftp     IN      CNAME   www.przyklad.local.

Objaśnienie rekordów:

  • SOA (Start Of Authority) - zawiera podstawowe informacje o strefie
  • NS (Name Server) - wskazuje serwer nazw odpowiedzialny za domenę
  • A (Address) - mapuje nazwę hosta na adres IPv4
  • MX (Mail Exchanger) - wskazuje serwer pocztowy dla domeny
  • CNAME (Canonical Name) - tworzy alias dla innej nazwy

Konfiguracja strefy reverse

Strefa reverse pozwala na tłumaczenie adresów IP na nazwy domen. Wróć do pliku named.conf.local:

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

Dodaj definicję strefy reverse:

// Strefa reverse dla sieci 192.168.1.0/24
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
    allow-update { none; };
};

Utwórz plik strefy reverse:

sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.168.1
sudo nano /etc/bind/zones/db.192.168.1

Edytuj plik:

; BIND reverse data file for 192.168.1.0/24
$TTL    604800
@       IN      SOA     ns1.przyklad.local. admin.przyklad.local. (
                     2023091201         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.przyklad.local.

; Rekordy PTR
53      IN      PTR     ns1.przyklad.local.
100     IN      PTR     www.przyklad.local.
101     IN      PTR     mail.przyklad.local.

Weryfikacja plików stref

Sprawdź poprawność konfiguracji strefy forward:

sudo named-checkzone przyklad.local /etc/bind/zones/db.przyklad.local

Oraz strefy reverse:

sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1

Jeśli wszystko jest OK, zrestartuj BIND9:

sudo systemctl restart bind9

🔍 Krok 4: Testowanie serwera DNS

Po skonfigurowaniu stref, najwyższy czas przetestować nasz serwer DNS.

Testowanie rozwiązywania nazw

Użyj polecenia dig do przetestowania strefy forward:

dig www.przyklad.local @127.0.0.1

Powinieneś zobaczyć w sekcji ANSWER odpowiedź z adresem IP 192.168.1.100.

Przetestuj strefę reverse:

dig -x 192.168.1.100 @127.0.0.1

Powinieneś otrzymać odpowiedź z nazwą www.przyklad.local.

Konfiguracja klienta do korzystania z Twojego serwera DNS

Aby komputery w sieci mogły korzystać z Twojego serwera DNS, musisz skonfigurować ich ustawienia DNS.

W Ubuntu/Debian, edytuj plik /etc/resolv.conf lub skonfiguruj Network Manager:

sudo nano /etc/resolv.conf

Dodaj linię:

nameserver 192.168.1.53

Uwaga: Na wielu systemach plik /etc/resolv.conf jest automatycznie generowany. W takim przypadku lepiej jest skonfigurować DNS w ustawieniach sieci.

W Windows, przejdź do:

  1. Panel sterowania > Sieć i Internet > Połączenia sieciowe
  2. Kliknij prawym przyciskiem myszy na połączenie i wybierz "Właściwości"
  3. Zaznacz "Protokół internetowy w wersji 4 (TCP/IPv4)" i kliknij "Właściwości"
  4. Wybierz "Użyj następujących adresów serwerów DNS" i wprowadź adres 192.168.1.53

🔒 Krok 5: Zabezpieczanie serwera DNS

Bezpieczeństwo serwera DNS jest kluczowe, ponieważ ataki na DNS mogą prowadzić do przekierowania ruchu, kradzieży danych czy ataków DDoS.

Ograniczanie dostępu

Edytuj plik named.conf.options:

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

Dodaj sekcję ACL (Access Control List):

acl "trusted" {
    192.168.1.0/24;    // Cała podsieć
    localhost;
    localnets;
};

options {
    // ... istniejące opcje ...

    allow-query { trusted; };
    allow-transfer { none; };
    allow-recursion { trusted; };

    // ... pozostałe opcje ...
};

To ograniczy zapytania, transfery stref i rekursję tylko do zaufanych hostów.

Implementacja DNSSEC

DNSSEC (Domain Name System Security Extensions) dodaje warstwę uwierzytelniania i integralności do DNS.

  1. Wygeneruj klucze DNSSEC dla strefy:
cd /etc/bind/zones
sudo dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE przyklad.local
sudo dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE przyklad.local
  1. Ustaw odpowiednie uprawnienia:
sudo chown -R bind:bind /etc/bind/zones/K*
  1. Aktualizuj plik strefy, aby zawierał klucze DNSSEC:
sudo nano /etc/bind/zones/db.przyklad.local

Dodaj na końcu pliku:

; DNSKEY records
$INCLUDE Kprzyklad.local.+008+xxxxx.key ; ZSK
$INCLUDE Kprzyklad.local.+008+yyyyy.key ; KSK

Gdzie xxxxx i yyyyy to identyfikatory wygenerowanych kluczy.

  1. Podpisz strefę:
sudo dnssec-signzone -A -3 $(head -c 16 /dev/random | od -t x -A n | tr -d ' \n') -N INCREMENT -o przyklad.local -t db.przyklad.local
  1. Zaktualizuj plik konfiguracyjny strefy:
sudo nano /etc/bind/named.conf.local

Zmień definicję strefy:

zone "przyklad.local" {
    type master;
    file "/etc/bind/zones/db.przyklad.local.signed";
    allow-update { none; };
    inline-signing yes;
    key-directory "/etc/bind/zones";
    auto-dnssec maintain;
};
  1. Zrestartuj BIND9:
sudo systemctl restart bind9

Monitorowanie i logowanie

Skonfiguruj rozszerzone logowanie w BIND9, edytując plik named.conf.logging:

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

Dodaj konfigurację logowania:

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

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

    category default { default_log; };
    category queries { query_log; };
};

Utwórz katalog logów i ustaw odpowiednie uprawnienia:

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

Włącz konfigurację logowania, dodając include do głównego pliku konfiguracyjnego:

sudo nano /etc/bind/named.conf

Dodaj linię:

include "/etc/bind/named.conf.logging";

Zrestartuj BIND9:

sudo systemctl restart bind9

🚀 Krok 6: Optymalizacja wydajności

Optymalizacja serwera DNS może znacznie poprawić wydajność i zmniejszyć opóźnienia.

Buforowanie i optymalizacja pamięci

Edytuj plik named.conf.options:

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

Dodaj opcje związane z buforowaniem:

options {
    // ... istniejące opcje ...

    // Rozmiar bufora pamięci podręcznej
    max-cache-size 256M;

    // Czas przechowywania rekordów negatywnych w cache
    max-ncache-ttl 3600;

    // Prefetch cache dla często używanych rekordów
    prefetch 2 9;

    // ... pozostałe opcje ...
};

Optymalizacja zapytań rekursywnych

Dodaj opcje, które pomogą w optymalizacji zapytań rekursywnych:

options {
    // ... istniejące opcje ...

    // Maksymalna liczba jednoczesnych zapytań rekursywnych
    recursive-clients 2000;

    // Minimalna wielkość pamięci podręcznej dla rekursji
    min-cache-size 10M;

    // ... pozostałe opcje ...
};

Zrównoleglenie obsługi zapytań

BIND9 może wykorzystać wiele rdzeni procesora:

options {
    // ... istniejące opcje ...

    // Liczba wątków obsługujących zapytania (dostosuj do liczby CPU)
    clients-per-query 100;
    max-clients-per-query 1000;

    // ... pozostałe opcje ...
};

Po wprowadzeniu zmian, zrestartuj BIND9:

sudo systemctl restart bind9

📊 Zaawansowane konfiguracje i przypadki użycia

Konfiguracja serwera DNS jako slave

Dla zwiększenia niezawodności, możesz skonfigurować dodatkowy serwer DNS jako slave (secondary):

Na serwerze master, zmodyfikuj definicję strefy, aby zezwolić na transfer do slave:

zone "przyklad.local" {
    type master;
    file "/etc/bind/zones/db.przyklad.local";
    allow-transfer { 192.168.1.54; };  // Adres IP serwera slave
    notify yes;
};

Na serwerze slave, dodaj definicję strefy:

zone "przyklad.local" {
    type slave;
    file "/var/cache/bind/db.przyklad.local";
    masters { 192.168.1.53; };  // Adres IP serwera master
};

Konfiguracja dynamicznych aktualizacji DNS

Aby umożliwić dynamiczne aktualizacje rekordów DNS (np. dla DHCP):

  1. Wygeneruj klucz TSIG:
sudo dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST dhcp-key
  1. Skonfiguruj strefę, aby akceptowała aktualizacje:
zone "przyklad.local" {
    type master;
    file "/etc/bind/zones/db.przyklad.local";
    allow-update { key "dhcp-key"; };
};
  1. Zintegruj z serwerem DHCP (np. ISC DHCP):
key "dhcp-key" {
    algorithm hmac-sha512;
    secret "wygenerowany-klucz";
};

zone przyklad.local. {
    primary 127.0.0.1;
    key dhcp-key;
}

Konfiguracja Split-Horizon DNS

Split-Horizon (lub Split-View) DNS umożliwia dostarczanie różnych odpowiedzi w zależności od źródła zapytania:

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

    zone "przyklad.local" {
        type master;
        file "/etc/bind/zones/internal/db.przyklad.local";
    };
};

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

    zone "przyklad.local" {
        type master;
        file "/etc/bind/zones/external/db.przyklad.local";
    };
};

❓ FAQ - Odpowiedzi na Twoje Pytania

Jak sprawdzić, czy mój serwer DNS działa poprawnie?
Użyj narzędzi takich jak dig, nslookup lub host do testowania rozwiązywania nazw. Na przykład: dig www.przyklad.local @192.168.1.53

Jak często należy aktualizować seryjny numer SOA?
Numer seryjny powinien być zwiększany za każdym razem, gdy wprowadzasz zmiany w pliku strefy. Zalecany format to YYYYMMDDNN, gdzie NN to numer zmiany w danym dniu.

Czy mogę używać BIND9 jako cachującego resolwera DNS?
Tak, domyślna konfiguracja BIND9 działa jako cachujący resolver. Wystarczy skonfigurować forwarders i włączyć recursion.

Jak długo trwa propagacja zmian DNS?
Zależy to od ustawień TTL (Time To Live) dla rekordów. Domyślnie może to trwać od kilku minut do 24 godzin.

Jak zabezpieczyć serwer DNS przed atakami cache poisoning?
Włącz DNSSEC, używaj losowych portów źródłowych, aktualizuj regularnie BIND9 i ogranicz rekursję tylko do zaufanych klientów.

Czy BIND9 obsługuje protokół DNS over TLS lub DNS over HTTPS?
BIND9 od wersji 9.16 obsługuje DNS over TLS (DoT). DNS over HTTPS (DoH) wymaga dodatkowego proxy.

🏁 Podsumowanie - Twój własny serwer DNS

Gratulacje! Udało Ci się skonfigurować własny serwer DNS na Ubuntu 20.04 przy użyciu BIND9. Teraz masz pełną kontrolę nad rozwiązywaniem nazw w swojej sieci i możesz:

  1. Zarządzać własnymi domenami - konfigurować rekordy DNS dla swoich witryn i usług
  2. Przyspieszyć przeglądanie internetu - dzięki lokalnemu buforowaniu zapytań DNS
  3. Zwiększyć bezpieczeństwo sieci - filtrując i monitorując ruch DNS
  4. Zapewnić niezawodność usług sieciowych - poprzez redundancję i zaawansowane konfiguracje

Pamiętaj o regularnych aktualizacjach BIND9, monitorowaniu logów i tworzeniu kopii zapasowych konfiguracji. DNS jest krytycznym elementem infrastruktury sieciowej, więc warto poświęcić czas na jego właściwe utrzymanie.

✅ Twoja checklista DNS:

  • 🔍 Regularnie sprawdzaj logi pod kątem błędów lub podejrzanej aktywności
  • 🔄 Twórz kopie zapasowe konfiguracji i plików stref
  • 🔒 Zabezpiecz serwer poprzez DNSSEC i właściwe ACL
  • 🛠️ Monitoruj wydajność i dostępność serwera
  • 📊 Dostosowuj konfigurację do zmieniających się potrzeb sieci
  • 🚀 Regularnie aktualizuj BIND9 i system operacyjny

🚀 Potrzebujesz profesjonalnego hostingu z zaawansowaną konfiguracją DNS?

Sprawdź ofertę serwerów wirtualnych IQHost

Nasze serwery VPS oferują pełną kontrolę nad konfiguracją DNS wraz z profesjonalnym wsparciem technicznym, które pomoże Ci w optymalizacji i zabezpieczeniu Twojej infrastruktury sieciowej. Z naszymi usługami możesz skoncentrować się na rozwijaniu swojego biznesu, a nie na zarządzaniu infrastrukturą.

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