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).
