Knot DNS na FreeBSD: Superszybki, autorytatywny serwer DNS

Autor:

w

Kiedy budujesz własny serwer hostingowy na FreeBSD, prędzej czy później pojawia się potrzeba obsługi własnych domen. Zamiast polegać na zewnętrznych operatorach, możesz uruchomić własny serwer nazw (NS). Od lat standardem był tu BIND, jednak jego zasobożerność i podatności skłaniają do poszukiwania alternatyw. Idealnym rozwiązaniem jest Knot DNS – czeski demon stworzony do ekstremalnie szybkiego i bezpiecznego serwowania stref autorytatywnych.

Knot DNS to oprogramowanie typu „zrób jedną rzecz, a zrób ją perfekcyjnie”. Nie wyszukuje adresów w sieci, nie buforuje zapytań użytkowników. Obsługuje wyłącznie te domeny, które mu wskażesz. Dzięki temu jest całkowicie odporny na ataki typu DNS Amplification i może działać nawet na najtańszych instancjach VPS, zużywając kilkadziesiąt megabajtów RAM-u. Poniżej dowiesz się, jak wdrożyć go na swoim systemie (lub wewnątrz izolowanej klatki Jail).

Instalacja paczki

W repozytoriach FreeBSD nowoczesna linia Knota to obecnie wersja 3.x, dlatego szukamy odpowiedniej nazwy paczki:

pkg update
pkg install knot3

Podczas instalacji system automatycznie utworzy dedykowanego użytkownika i grupę knot, z uprawnieniami na których będzie pracować demon.

Konfiguracja demona

Główny plik konfiguracyjny Knota używa czytelnego formatu YAML. Edytujemy /usr/local/etc/knot/knot.conf. Usuwamy domyślną zawartość i wprowadzamy naszą czystą, bezpieczną konfigurację:

server:
    rundir: "/var/run/knot"
    user: knot:knot
    listen: [ 0.0.0.0@53 ] # Zmień 0.0.0.0 na konkretne IP, jeśli używasz klatek Jails

log:
  - target: syslog
    any: info

database:
    storage: "/var/db/knot"

template:
  - id: default
    storage: "/usr/local/etc/knot/zones"
    file: "%s.zone"

zone:
  - domain: example.com

Co tu się dzieje?

Sekcja template wskazuje mu, że pliki stref (domen) leżą w podkatalogu zones, a zmienna %s.zone sprawia, że demon automatycznie szuka pliku o nazwie zdefiniowanej w sekcji zone (w tym wypadku example.com.zone).

Tworzenie pliku strefy (Zone file)

Najpierw tworzymy katalog na strefy:

mkdir -p /usr/local/etc/knot/zones

Następnie tworzymy klasyczny plik strefy zgodny z formatem BIND: /usr/local/etc/knot/zones/example.com.zone.

$ORIGIN example.com.
$TTL 3600

@   IN  SOA ns1.example.com. admin.example.com. (
            2026090601 ; Serial (YYYYMMDDNN)
            3600       ; Refresh (1h)
            1800       ; Retry (30m)
            1209600    ; Expire (14d)
            86400      ; Minimum TTL (1d)
            )

@       IN  NS      ns1.example.com.
@       IN  NS      ns2.example.com.
@       IN  A       1.2.3.4
ns1     IN  A       1.2.3.4
ns2     IN  A       1.2.3.4
www     IN  CNAME   example.com.

(Pamiętaj o podmienieniu 1.2.3.4 na fizyczny, publiczny adres IP Twojego serwera).

Uprawnienia i Uruchomienie

Knot musi mieć prawo do odczytu swoich konfiguracji oraz zapisu w swojej w bazie (gdzie trzyma m.in. skompilowane wersje stref i klucze DNSSEC).

chown -R knot:knot /usr/local/etc/knot
chown -R knot:knot /var/db/knot

Dodajemy usługę do autostartu i uruchamiamy:

sysrc knot_enable="YES"
service knot start

Testowanie i integracja z Firewallem (PF)

Sprawdzamy, czy demon odpowiada lokalnie, używając natywnego dla FreeBSD narzędzia drill:

drill @127.0.0.1 example.com

Jeśli w odpowiedzi widzisz flagę aa (Authoritative Answer) i status NOERROR, serwer działa prawidłowo.

Ważne: Aby systemy z zewnątrz mogły odpytywać Twój serwer, musisz otworzyć port 53 zarówno dla UDP, jak i TCP w zaporze sieciowej PF. Protokół UDP obsłuży 95% standardowego ruchu, jednak otwarcie TCP jest dziś absolutnie krytyczne dla obsługi dużych odpowiedzi (np. po wdrożeniu DNSSEC lub długich kluczy DKIM dla poczty).

Przegląd prywatności

Ta strona korzysta z ciasteczek, aby zapewnić Ci najlepszą możliwą obsługę. Informacje o ciasteczkach są przechowywane w przeglądarce i wykonują funkcje takie jak rozpoznawanie Cię po powrocie na naszą stronę internetową i pomaganie naszemu zespołowi w zrozumieniu, które sekcje witryny są dla Ciebie najbardziej interesujące i przydatne.