Zum Inhalt

Unbound

Inhalt

  • Unbound 1.24.2
  • validierender rekursiver Resolver
  • DNSSEC
  • optionale Funktionen für DNSCrypt und TLS-Upstream
  • Ports-Version dns/unbound

Aktueller Portstand in FreeBSD Ports: unbound-1.24.2. Die Ports-Version bringt den eigenen Dienst unbound mit; local_unbound aus dem Basissystem ist laut FreeBSD-Handbook nur als lokaler caching/forwarding Resolver gedacht. (FreshPorts)


Einleitung

Dieses HowTo beschreibt die Installation und Konfiguration von Unbound auf FreeBSD 15+.

Dieses HowTo verwendet bewusst Unbound aus den FreeBSD Ports als validierenden rekursiven Resolver. Das ist für Resolver-Dienste über die lokale Maschine hinaus die richtige Basis: Das FreeBSD Handbook empfiehlt für diesen Fall ausdrücklich dns/unbound statt local_unbound aus dem Basissystem. Die aktuelle Ports-Version basiert auf Unbound 1.24.2. (FreeBSD Dokumentation)

Wichtig ist dabei: Dieses HowTo aktiviert weder TLS-Upstream noch DNSCrypt automatisch. In der Unbound-Dokumentation ist tls-upstream standardmäßig no; ebenso ist dnscrypt-enable standardmäßig no. Die FreeBSD-Portoptionen können DNSCrypt-Unterstützung zwar einkompilieren, aktiv wird sie dadurch aber noch nicht. (unbound.docs.nlnetlabs.nl)


Voraussetzungen

Zu den Voraussetzungen für dieses HowTo siehe bitte: Hosting System

Zusätzlich sollte bereits klar sein, aus welchen Netzen der Resolver Anfragen annehmen soll und ob er nur lokal oder für das gesamte Netz betrieben wird. Für einen netzweit erreichbaren Resolver ist die Ports-Version vorgesehen, nicht local_unbound. (FreeBSD Dokumentation)


Vorbereitungen

DNS Records

Für dieses HowTo sind keine DNS-Records erforderlich.

Unbound arbeitet hier als rekursiver Resolver und nicht als autoritativer Nameserver für eine eigene Zone.

Gruppen / Benutzer / Passwörter

Für dieses HowTo müssen keine zusätzlichen Systemgruppen, Systembenutzer oder Passwörter manuell angelegt werden.

Verzeichnisse / Dateien

Für dieses HowTo müssen vor der Installation keine zusätzlichen Verzeichnisse oder Dateien manuell angelegt werden.

Die Ports-Installation bringt das Konfigurationsverzeichnis /usr/local/etc/unbound sowie den Dienst unbound selbst mit. (FreshPorts)


Installation

Wir installieren dns/unbound und dessen Abhängigkeiten.

Bash
mkdir -p /var/db/ports/security_libsodium
cat <<'EOF' > /var/db/ports/security_libsodium/options
_OPTIONS_READ=libsodium-1.0.21
_FILE_COMPLETE_OPTIONS_LIST=DOCS
OPTIONS_FILE_UNSET+=DOCS

EOF

mkdir -p /var/db/ports/dns_unbound
cat <<'EOF' > /var/db/ports/dns_unbound/options
_OPTIONS_READ=unbound-1.24.2
_FILE_COMPLETE_OPTIONS_LIST=DEP-RSA1024 DNSCRYPT DNSTAP DOCS DYNLIB ECDSA EVAPI FILTER_AAAA GOST HIREDIS LIBEVENT MUNIN_PLUGIN PYTHON SUBNET TFOCL TFOSE THREADS
OPTIONS_FILE_UNSET+=DEP-RSA1024
OPTIONS_FILE_SET+=DNSCRYPT
OPTIONS_FILE_UNSET+=DNSTAP
OPTIONS_FILE_UNSET+=DOCS
OPTIONS_FILE_SET+=DYNLIB
OPTIONS_FILE_SET+=ECDSA
OPTIONS_FILE_SET+=EVAPI
OPTIONS_FILE_UNSET+=FILTER_AAAA
OPTIONS_FILE_SET+=GOST
OPTIONS_FILE_UNSET+=HIREDIS
OPTIONS_FILE_SET+=LIBEVENT
OPTIONS_FILE_UNSET+=MUNIN_PLUGIN
OPTIONS_FILE_UNSET+=PYTHON
OPTIONS_FILE_UNSET+=SUBNET
OPTIONS_FILE_UNSET+=TFOCL
OPTIONS_FILE_UNSET+=TFOSE
OPTIONS_FILE_SET+=THREADS

EOF

portmaster -w -B -g -U --force-config dns/unbound -n

Dienst in rc.conf eintragen

Anschließend deaktivieren wir local_unbound aus dem Basissystem und aktivieren die Ports-Version unbound. Genau diese Trennung ist auf FreeBSD für Resolver-Dienste über die lokale Maschine hinaus vorgesehen. Das Ports-rc.d-Skript unterstützt außerdem explizit unbound_enable und optional unbound_config. (FreeBSD Dokumentation)

Bash
sysrc local_unbound_enable=NO
sysrc unbound_enable=YES
sysrc unbound_config="/usr/local/etc/unbound/unbound.conf"

Konfiguration

Konfigurationsdatei

Die Konfigurationsdatei wird unter /usr/local/etc/unbound/unbound.conf abgelegt.

Bash
cat <<'EOF' > /usr/local/etc/unbound/unbound.conf
server:
  verbosity: 1

  # localhost-only Resolver
  interface: 127.0.0.1
  interface: ::1
  port: 53

  access-control: 127.0.0.0/8 allow
  access-control: ::1 allow
  access-control: ::ffff:127.0.0.1 allow
  access-control: 0.0.0.0/0 refuse
  access-control: ::0/0 refuse

  do-ip4: yes
  do-ip6: yes
  do-udp: yes
  do-tcp: yes

  logfile: "/usr/local/etc/unbound/unbound.log"
  root-hints: "/usr/local/etc/unbound/root.hints"
  auto-trust-anchor-file: "/usr/local/etc/unbound/root.key"
  tls-cert-bundle: "/usr/local/share/certs/ca-root-nss.crt"

  num-threads: 4

  msg-cache-size: 128m
  rrset-cache-size: 256m

  so-rcvbuf: 4m
  so-sndbuf: 4m
  so-reuseport: yes

  cache-max-ttl: 14400
  cache-min-ttl: 1200

  hide-identity: yes
  hide-version: yes

  qname-minimisation: yes
  aggressive-nsec: yes
  prefetch: yes
  prefetch-key: yes

  serve-expired: yes
  serve-expired-ttl: 86400
  serve-expired-reply-ttl: 30
  serve-expired-client-timeout: 1800

  rrset-roundrobin: yes
  minimal-responses: yes
  val-clean-additional: yes

  harden-glue: yes
  harden-dnssec-stripped: yes
  harden-below-nxdomain: yes

  harden-referral-path: no
  harden-algo-downgrade: no
  harden-large-queries: no
  use-caps-for-id: no

  unwanted-reply-threshold: 10000
  do-not-query-localhost: yes

  private-address: 10.0.0.0/8
  private-address: 172.16.0.0/12
  private-address: 192.168.0.0/16
  private-address: 169.254.0.0/16
  private-address: fd00::/8
  private-address: fe80::/10

  private-domain: "example.lan"

  local-zone: "localhost." static
  local-data: "localhost. 10800 IN NS localhost."
  local-data: "localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800"
  local-data: "localhost. 10800 IN A 127.0.0.1"

  local-zone: "127.in-addr.arpa." static
  local-data: "127.in-addr.arpa. 10800 IN NS localhost."
  local-data: "127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 2 3600 1200 604800 10800"
  local-data: "1.0.0.127.in-addr.arpa. 10800 IN PTR localhost."

remote-control:
  control-enable: yes
  control-interface: 127.0.0.1
  control-interface: ::1
  control-port: 8953
  server-key-file: "/usr/local/etc/unbound/unbound_server.key"
  server-cert-file: "/usr/local/etc/unbound/unbound_server.pem"
  control-key-file: "/usr/local/etc/unbound/unbound_control.key"
  control-cert-file: "/usr/local/etc/unbound/unbound_control.pem"

#forward-zone:
#  name: "."
#  forward-tls-upstream: yes
#  forward-addr: 1.0.0.1@853#one.one.one.one
#  forward-addr: 8.8.4.4@853#dns.google
#  forward-addr: 149.112.112.112@853#dns.quad9.net
#  forward-addr: 1.1.1.1@853#one.one.one.one
#  forward-addr: 8.8.8.8@853#dns.google
#  forward-addr: 9.9.9.9@853#dns.quad9.net
EOF

Root Hints

Unbound kann ohne separate root.hints-Datei mit eingebauten Root Hints arbeiten. Wenn deine Konfiguration aber ausdrücklich root-hints: auf eine Datei setzt, musst du diese Datei natürlich auch bereitstellen. Laut unbound.conf(5) ist der Standard builtin hints, eine separate Datei bleibt aber gute Praxis. (unbound.docs.nlnetlabs.nl)

Wenn deine unbound.conf eine Root-Hints-Datei verwendet:

Bash
fetch -o "/usr/local/etc/unbound/root.hints" "https://www.internic.net/domain/named.root"
chown root:wheel /usr/local/etc/unbound/root.hints
chmod 644 /usr/local/etc/unbound/root.hints

DNSSEC Trust Anchor

Für DNSSEC ist unbound-anchor der richtige Weg. unbound-anchor(8) beschreibt genau dafür die Datei root.key; auto-trust-anchor-file erwartet außerdem eine Datei, die vom laufenden Unbound-Prozess gelesen und geschrieben werden kann. Wichtig: Das Ports-rc.d-Skript ruft vor dem Start selbst bereits unbound-anchor auf. Ein manueller Vorab-Lauf ist daher nur dann nötig, wenn du die Trust-Anchor-Datei bewusst vor dem ersten Start initialisieren willst. (unbound.docs.nlnetlabs.nl)

Optional vor dem ersten Start:

Bash
su -m unbound -c 'unbound-anchor -a "/usr/local/etc/unbound/root.key"'

Remote Control nur bei Bedarf

unbound-control funktioniert nur dann sinnvoll, wenn deine unbound.conf auch wirklich einen remote-control:-Block mit control-enable: yes enthält. Standardmäßig ist control-enable no. Die Schlüssel und Zertifikate dafür werden mit unbound-control-setup erzeugt. (unbound.docs.nlnetlabs.nl)

Wenn du remote-control aktiv nutzt:

Bash
su -m unbound -c 'unbound-control-setup -d /usr/local/etc/unbound'

Konfiguration prüfen

Vor dem ersten Start sollte die Konfiguration immer geprüft werden. unbound-checkconf ist genau dafür vorgesehen. Das Ports-rc.d-Skript prüft die Konfiguration zusätzlich ebenfalls vor dem Start und vor reload. (unbound.docs.nlnetlabs.nl)

Bash
unbound-checkconf /usr/local/etc/unbound/unbound.conf

Datenbanken

Für dieses HowTo sind keine Datenbanken erforderlich.


Zusatzsoftware

Mögliche Zusatzsoftware wird hier installiert und konfiguriert.

DNSCrypt / TLS-Upstream

Nicht Bestandteil dieses HowTos.

Die Ports-Version kann DNSCrypt-Unterstützung enthalten, und Unbound kennt Optionen für TLS-Upstream, aber beides ist laut aktueller Dokumentation standardmäßig nicht aktiviert und braucht zusätzliche Konfiguration. DNSCrypt benötigt außerdem eigene Schlüssel- und Zertifikatsdateien; diese erzeugt Unbound nicht automatisch für dich. (FreshPorts)


Aufräumen

Überflüssige oder temporäre Verzeichnisse und Dateien entsorgen.

Zusatzsoftware Installation

Nicht erforderlich.

Zusatzsoftware Konfiguration

Nicht erforderlich.


Abschluss

Falls local_unbound aus dem Basissystem aktuell noch läuft, stoppen wir es einmalig. Danach starten wir die Ports-Version von Unbound.

Bash
service local_unbound onestatus >/dev/null 2>&1 && service local_unbound onestop
service unbound start

Für spätere Änderungen:

Bash
service unbound reload
service unbound restart

Das Ports-rc.d-Skript unterstützt reload explizit. Beim Start führt es außerdem selbst unbound-anchor und unbound-checkconf aus. (GitHub)


Referenzen

  • FreeBSD Handbook – Hinweis zu local_unbound und dns/unbound. (FreeBSD Documentation)
  • FreshPorts – dns/unbound, aktueller Portstand, Default-Optionen und Dienstskript. (FreshPorts)
  • NLnet Labs – unbound.conf(5) zu root-hints, auto-trust-anchor-file, tls-upstream, control-enable und DNSCrypt. (unbound.docs.nlnetlabs.nl)
  • NLnet Labs – unbound-anchor(8) zu root.key, Default-Pfaden und Initialisierung des Trust Anchors. (unbound.docs.nlnetlabs.nl)
  • FreeBSD Ports rc.d-Skript – unbound_enable, unbound_config, automatischer unbound-anchor-Lauf beim Start und unterstütztes reload. (GitHub)