Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:dns_unbound_archlinux

DNS unbound ArchLinux

DNS unbound ist ein validierender, rekursiver und caching (zwischenspeichernder) DNS-Resolver. unbound ist schnell und schlank konzipiert und verfügt über moderne Funktionen, die auf offenen Standards basieren.

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Zielsetzung

Nachfolgend soll ein im lokalen Netzwerk unbound als DNS-Resolver VOR einem im lokalen Netzwerk laufendem ISC (Internet System Consortium) BIND DNS-Server agieren.

                           +--------------+      +--------------+
                           |    unbound   |      |     BIND     |
---> lokales Netzwerk -->  | 192.168.0.20 | <->  |  127.0.0.1   | 
                           |   resolver   |      | tachtler.net |
                           |    DNSSec    |      |    DNSSec    |
                           +--------------+      +--------------+
                                  |
                                  +--> Internet für NICHT (*.)tachtler.net/0.168.192.in-addr.arpa -->

Problem: Autoritative DNS-Server

:!: WICHTIG :!:

Ein autoritativer DNS-Server antwortet niemals mit dem ad-Flag, sondern nur mit dem aa-Flag!

Dies ist absichtlich so, da der autoritative DNS-Server nicht seine eigenen DNS-Records überprüfen muss, da dieser direkten Zugriff auf die Quelle hat und sich selbst vertraut !

:!: WICHTIG :!:

Lösung: DNS-Resolver

Der ISC (Internet System Consortium) BIND DNS-Server hält eigene lokale Zonen, und liefert DNSSec gesicherte Antworten aus.
Der unbound als DNS-Resolver soll nun ebenfalls DNSSec gesicherte Antworten ausliefern, welche jedoch das ad-Flag gesetzt haben!

Ziel ist es eine lokale Antwort –>

  • rechner10.intra.tachtler.net IN A 192.168.0.10

zu erhalten, welche via

  1. DNSSec abgesichert ist und
  2. bei der die (DNS) Chain-of-Trust (Vetrauenskette)

im lokalen Netzwerk überprüfbar ist, was durch

  • das ad-Flag

in der Antwort bestätigt wird.

(Siehe nachfolgendes Beispiel)

# dig @192.168.0.20 rechner10.intra.tachtler.net +dnssec +multi

; <<>> DiG 9.16.23 <<>> @192.168.0.20 rechner10.intra.tachtler.net +dnssec +multi
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8214
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;rechner10.intra.tachtler.net. IN A

;; ANSWER SECTION:
rechner10.intra.tachtler.net. 10505 IN A 192.168.0.10
rechner10.intra.tachtler.net. 10505 IN RRSIG A 15 4 10800 (
				20211217203021 20211130133211 10887 intra.tachtler.net.
				Ds49XZOZ1p87ygjVtBYPk5qZED3MmbVybLoKIc8o4KPW
				P4xhS3R1Z9rAWBjHMi2XGxqIn7BB403SUh1quM03CA== )

;; Query time: 0 msec
;; SERVER: 192.168.0.20#53(192.168.0.20)
;; WHEN: Tue Nov 30 15:38:06 CET 2021
;; MSG SIZE  rcvd: 187

:!: HINWEIS - Nachfolgend muss das ad-Flag in der Antwort enthalten sein, siehe nachfolgende Zeile:

  • ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

Überblick

Im nachfolgenden soll die Konfiguration eines DNS-Resolvers welcher als interner agierender DNS-Server für ein privates Netzwerk mit zwei Zonen durchgeführt werden. Nachfolgende Zonen werden dabei ausgeliefert:

  • Intranet - Domain: intra.tachtler.net - IP-Adressbereich: private Adressen
  • Internet - Domain: tachtler.net - IP-Adressbereich: öffentliche Adresse

Installation

Zur Installation eines DNS-Servers wird nachfolgendes Paket benötigt:

  • unbound - ist im community-Repository von ArchLinux enthalten

installiert werden.

Um DNS-Abfragen optimiert gegen den DNS-Server durchführen zu können, kann das Paket

  • bind - ist im extra-Repository von ArchLinux enthalten

installiert werden.

Mit nachfolgendem Befehl, wird das Pakete unbound installiert:

# pacman --noconfirm -S unbound

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket unbound installiert wurden:

# pacman -Qil unbound

Installierte Dateien

Dienst/Deamon-Start einrichten

Um einen DNS-Resolver, welcher als Dienst/Deamon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Daemon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl realisiert werden kann:

# systemctl enable unbound.service
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /usr/lib/systemd/system/unbound.service.

Eine Überprüfung, ob beim Neustart des Server der unbound-Dienst/Deamon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep -e ^unbound.service
unbound.service                            enabled         disabled

bzw.

# systemctl is-enabled unbound.service
enabled

iptables/ip6tables Regeln

Damit der DNS-Server auch erreichbar ist und nicht die Weitergabe der DNS Informationen vom Paketfilter iptables und ip6tables blockiert wird, muss nachfolgende Regel zum iptables bzw. ip6tables-Regelwerk hinzugefügt werden.

Um die aktuellen iptables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# iptables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        6   398 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
5        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-INP Defend "
6        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
7        0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
8        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-FWD Defend "
2        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
3        0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
4        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain OUTPUT (policy ACCEPT 8 packets, 478 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Nachfolgende Befehle, fügen folgende iptables-Regeln dem iptables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

  • -A INPUT -p tcp --dport 53 -j ACCEPT
  • -A INPUT -p udp --dport 53 -j ACCEPT

und hier die Befehle:

# iptables -I INPUT 5 -p tcp --dport 53 -j ACCEPT
# iptables -I INPUT 6 -p udp --dport 53 -j ACCEPT

Ein erneute Abfrage des iptables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# iptables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       29 15634 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
6        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
7        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-INP Defend "
8        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
9        0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
10       0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-FWD Defend "
2        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
3        0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
4        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain OUTPUT (policy ACCEPT 38 packets, 4765 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Die neuen Zeilen sind an **Position 5 (INPUT)** und **Postition 6 (INPUT)** zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (**nur relevanter Ausschnitt**):
<code>
...
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
...
1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
...

Um diese iptables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im iptables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/iptables-save > /etc/iptables/iptables.rules

Nachfolgender Befehl kann dazu verwendet werden, um zu überprüfen, ob das iptables-Regelwerk auch korrekt gespeichert wurde:

# cat /etc/iptables/iptables.rules
# Generated by iptables-save v1.8.7 on Mon Jul 12 16:38:03 2021
*mangle
:PREROUTING ACCEPT [179:83438]
:INPUT ACCEPT [179:83438]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [221:105831]
:POSTROUTING ACCEPT [222:105904]
COMMIT
# Completed on Mon Jul 12 16:38:03 2021
# Generated by iptables-save v1.8.7 on Mon Jul 12 16:38:03 2021
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [221:105831]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -j LOG --log-prefix "REC-INP Defend " --log-level 5
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A FORWARD -j LOG --log-prefix "REC-FWD Defend " --log-level 5
-A FORWARD -p tcp -j REJECT --reject-with tcp-reset
-A FORWARD -p udp -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Mon Jul 12 16:38:03 2021
# Generated by iptables-save v1.8.7 on Mon Jul 12 16:38:03 2021
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [33:2171]
:POSTROUTING ACCEPT [33:2171]
COMMIT
# Completed on Mon Jul 12 16:38:03 2021

Um die aktuellen ip6tables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# ip6tables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp     *      *       ::/0                 ::/0                
3        0     0 ACCEPT     all      lo     *       ::/0                 ::/0                
4        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
5        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-INP Defend "
6        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
7        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
8        0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-FWD Defend "
2        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
3        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
4        0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Nachfolgende Befehle, fügen folgende ip6tables-Regeln dem ip6tables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

  • -A INPUT -p tcp --dport 53 -j ACCEPT
  • -A INPUT -p udp --dport 53 -j ACCEPT

und hier die Befehle:

# ip6tables -I INPUT 5 -p tcp --dport 53 -j ACCEPT
# ip6tables -I INPUT 6 -p udp --dport 53 -j ACCEPT

Ein erneute Abfrage des ip6tables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# ip6tables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp     *      *       ::/0                 ::/0                
3        0     0 ACCEPT     all      lo     *       ::/0                 ::/0                
4        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
5        0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 tcp dpt:53
6        0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:53
7        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-INP Defend "
8        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
9        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
10       0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-FWD Defend "
2        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
3        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
4        0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Die neuen Zeilen sind an Position 5 (INPUT) und Postition 6 (INTPUT) zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:53 
...
1        0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:53
...

Um diese ip6tables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im ip6tables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/ip6tables-save > /etc/iptables/ip6tables.rules 

Nachfolgender Befehl kann dazu verwendet werden, um zu überprüfen, ob das ip6tables-Regelwerk auch korrekt gespeichert wurde:

# cat /etc/iptables/ip6tables.rules
# Generated by ip6tables-save v1.8.7 on Mon Jul 12 16:48:38 2021
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Mon Jul 12 16:48:38 2021
# Generated by ip6tables-save v1.8.7 on Mon Jul 12 16:48:38 2021
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -j LOG --log-prefix "REC-INP Defend " --log-level 5
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -j REJECT --reject-with icmp6-addr-unreachable
-A FORWARD -j LOG --log-prefix "REC-FWD Defend " --log-level 5
-A FORWARD -p tcp -j REJECT --reject-with tcp-reset
-A FORWARD -p udp -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-addr-unreachable
COMMIT
# Completed on Mon Jul 12 16:48:38 2021
# Generated by ip6tables-save v1.8.7 on Mon Jul 12 16:48:38 2021
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Mon Jul 12 16:48:38 2021

Basis-Konfiguration

Bevor mit der eigentliches Basis-Konfiguration begonnen werden kann sind noch nachfolgende Vorarbeiten durchzuführen.

/etc/unbound/keys

In nachfolgendem Verzeichnis

  • /etc/unbound/keys

welches mit nachfolgendem Befehl erstellt werden kann

# mkdir /etc/unbound/keys

benötigt der Benutzer unter dem der unbound läuft, die entsprechenden Besitzrechte und Dateirechte, was mit nachfolgenden Befehl durchgeführt werden kann:

Besitzrechte:

# chown unbound:unbound /etc/unbound/keys

Dateirechte:

# chmod 764 /etc/unbound/keys

:!: HINWEIS - Dies ist erforderlich, damit der unbound evtl. zusätzliche KSK (Key signing Keys), welche sich ggf. in diesem Verzeichnis befinden, entsprechend der Verwendung von unbound um konvertieren kann!

Anschliessend sollen nun weitere KSK's (Key Signing Keys) z.B. aus nachfolgender ISC (Internet System Consortium) BIND Installation mit nachfolgendem Befehl in dieses Verzeichnis kopiert werden:

# cp -a /var/named/keys/*.key /etc/unbound/keys

Abschliessend sind hier noch die Besitzrechte und die Dateirechte, wie folgt anzupassen:

Besitzrechte:

# chown unbound:unbound /etc/unbound/keys/*.key

Dateirechte:

# chmod 664 /etc/unbound/keys/*.key

Mit nachfolgendem Befehl kann nun überprüft werden, ob das entsprechende Verzeichnis erstellt wurde und ie richtigen Besitzrechte und Dateirechte erhalten hat:

# ls -l /etc/unbound
total 52
drwxrw-r-- 1 unbound unbound   824 Nov 28 10:25 keys
-rw-r--r-- 1 root    root      738 Oct 13  2020 trusted-key.key
-rw-r--r-- 1 root    root    46251 Aug 14 13:15 unbound.conf

Anschließend kann noch mit nachfolgendem Befehl überprüft werden, ob die entsprechenden keys aus der einer entsprechenden Konfiguration des DNS ISC bind Archlinux - DNSSec richtig kopiert wurden:

# ls -l 
# ls -l /var/named/keys
total 64
-rw-rw-r-- 1 unbound unbound 318 Nov  6 08:26 K0.168.192.in-addr.arpa.+015+64298.key
-rw-rw-r-- 1 unbound unbound 319 Nov  6 08:28 K0.168.192.in-addr.arpa.+015+65325.key
-rw-rw-r-- 1 unbound unbound 320 Nov  6 08:28 K171.217.88.in-addr.arpa.+015+05640.key
-rw-rw-r-- 1 unbound unbound 320 Nov  6 08:27 K171.217.88.in-addr.arpa.+015+59631.key
-rw-rw-r-- 1 unbound unbound 309 Nov  6 08:25 Kintra.tachtler.net.+015+02340.key
-rw-rw-r-- 1 unbound unbound 311 Nov  6 08:27 Kintra.tachtler.net.+015+17796.key
-rw-rw-r-- 1 unbound unbound 298 Nov  6 08:26 Ktachtler.net.+015+20289.key
-rw-rw-r-- 1 unbound unbound 299 Nov  6 08:28 Ktachtler.net.+015+37463.key

/etc/unbound/root.hints

Anstatt Anfragen an einen öffentlichen DNS-Server (wie z.B. Google 8.8.8.8), oder einen DNS-Server des ISP (Internet Service Providers wie z.B. die Telekom) weiterzuleiten, kann es vorgezogen werden, die Root-DNS-Server abzufragen. Nachfolgender Befehl holt die neueste Root-Server-Liste als Datei ab.

:!: HINWEIS - Dies wird später eingebunden, indem die Weiterleitungseinträge („Forwardzone“-Abschnitte) in der Konfiguration ausgewählt werden.

# dig +bufsize=1200 +norec NS . @a.root-servers.net > /etc/unbound/root.hints

Auch hier kann mit nachfolgendem Befehl überprüft werden, ob der Inhalt der Konfigurationsdatei korrekt erstellt worden ist und sollte eine Ausgabe wie nachfolgende in etwa zurückgeben:

# cat root.hints 

; <<>> DiG 9.16.23 <<>> +bufsize +norec NS . @a.root-servers.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31895
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.				IN	NS

;; ANSWER SECTION:
.			518400	IN	NS	e.root-servers.net.
.			518400	IN	NS	h.root-servers.net.
.			518400	IN	NS	l.root-servers.net.
.			518400	IN	NS	i.root-servers.net.
.			518400	IN	NS	a.root-servers.net.
.			518400	IN	NS	d.root-servers.net.
.			518400	IN	NS	c.root-servers.net.
.			518400	IN	NS	b.root-servers.net.
.			518400	IN	NS	j.root-servers.net.
.			518400	IN	NS	k.root-servers.net.
.			518400	IN	NS	g.root-servers.net.
.			518400	IN	NS	m.root-servers.net.
.			518400	IN	NS	f.root-servers.net.

;; ADDITIONAL SECTION:
e.root-servers.net.	518400	IN	A	192.203.230.10
e.root-servers.net.	518400	IN	AAAA	2001:500:a8::e
h.root-servers.net.	518400	IN	A	198.97.190.53
h.root-servers.net.	518400	IN	AAAA	2001:500:1::53
l.root-servers.net.	518400	IN	A	199.7.83.42
l.root-servers.net.	518400	IN	AAAA	2001:500:9f::42
i.root-servers.net.	518400	IN	A	192.36.148.17
i.root-servers.net.	518400	IN	AAAA	2001:7fe::53
a.root-servers.net.	518400	IN	A	198.41.0.4
a.root-servers.net.	518400	IN	AAAA	2001:503:ba3e::2:30
d.root-servers.net.	518400	IN	A	199.7.91.13
d.root-servers.net.	518400	IN	AAAA	2001:500:2d::d
c.root-servers.net.	518400	IN	A	192.33.4.12
c.root-servers.net.	518400	IN	AAAA	2001:500:2::c
b.root-servers.net.	518400	IN	A	199.9.14.201
b.root-servers.net.	518400	IN	AAAA	2001:500:200::b
j.root-servers.net.	518400	IN	A	192.58.128.30
j.root-servers.net.	518400	IN	AAAA	2001:503:c27::2:30
k.root-servers.net.	518400	IN	A	193.0.14.129
k.root-servers.net.	518400	IN	AAAA	2001:7fd::1
g.root-servers.net.	518400	IN	A	192.112.36.4
g.root-servers.net.	518400	IN	AAAA	2001:500:12::d0d
m.root-servers.net.	518400	IN	A	202.12.27.33
m.root-servers.net.	518400	IN	AAAA	2001:dc3::35
f.root-servers.net.	518400	IN	A	192.5.5.241
f.root-servers.net.	518400	IN	AAAA	2001:500:2f::f

;; Query time: 40 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Sun Nov 28 12:08:03 CET 2021
;; MSG SIZE  rcvd: 811

remote-control

Es kann eine Kontrolle über den unbound DNS-Resolver mittels dem Befehl unbound-control eingerichtet werden. Dazu ist es zunächst erforderlich, mit nachfolgendem Befehl

  • unbound-control-setup

die erforderlichen TLS-Schlüsseldateien automatisch im Standardinstallationsverzeichnis

  • /etc/unbound

zu erzeugen, wie nachfolgend dargestellt:

# unbound-control-setup 
setup in directory /etc/unbound
Generating RSA private key, 3072 bit long modulus (2 primes)
..........................++++
........++++
e is 65537 (0x010001)
Generating RSA private key, 3072 bit long modulus (2 primes)
.....................................................................................................++++
....................++++
e is 65537 (0x010001)
Signature ok
subject=CN = unbound-control
Getting CA Private Key
removing artifacts
Setup success. Certificates created. Enable in unbound.conf file to use

Eine Überprüfung, ob das ordnungsgemäss durchgeführt wurden, kann mit nachfolgendem Befehl durchgeführt werden:

# ls -l /etc/unbound/unbound_*
-rw------- 1 root root 2455 Dec 11 08:33 /etc/unbound/unbound_control.key
-rw-r----- 1 root root 1411 Dec 11 08:33 /etc/unbound/unbound_control.pem
-rw------- 1 root root 2459 Dec 11 08:33 /etc/unbound/unbound_server.key
-rw-r----- 1 root root 1549 Dec 11 08:33 /etc/unbound/unbound_server.pem

Eine Beschreibung der möglichen Aktionen, welche mittels dem Befehl unbound-control durchgeführt werden können, gibt die man-Page zum Befehl aus.

Nachfolgend eine Beispiel, wenn die Konfiguration in /etc/unbound/unbound.conf durchgeführt wurde und der unbound DNS-Resolver gestartet wurde:

# unbound-control status
version: 1.13.2
verbosity: 1
threads: 1
modules: 3 [ subnetcache validator iterator ]
uptime: 6 seconds
options: reuseport control(ssl)
unbound (pid 36998) is running...

:!: HINWEIS - Standardmäßig ist der unbound-control Service unter localhost Port 8953 zu erreichen!

/etc/unbound/unbound.conf

Da die Konfigurationsdatei /etc/unbound/unbound.conf aufgrund von Kommentar- und Leerzeichen sehr schnell unübersichtlich ist, kann mit nachfolgendem Befehl, eine Ausgabe ohne Kommentar- und Leerzeilen erzeugt werden, welche dann nach der Grundinstallation von unbound wie folgt aussehen sollte:

# egrep -v '(^#|^.*#|^$)' /etc/unbound/unbound.conf

Die Konfigurationsdatei /etc/unbound/unbound.conf ohne Kommentar- und Leerzeichen:

# egrep -v '(^#|^.*#|^$)' /etc/unbound/unbound.conf
server:
	verbosity: 1
	trust-anchor-file: /etc/unbound/trusted-key.key
python:
dynlib:
remote-control:

Nachfolgende Änderungen wurden beispielhaft vorgenommen:

  •     interface: 192.168.0.20

Interface, auf denen der unbound Anfragen entgegen nimmt.

  •     outgoing-interface: 192.168.0.20

Interface, auf denen der unbound Anfragen weiterleitet/bzw. stellt.

:!: HINWEIS - Es kann auch ein Interface sein, auf dem der unbound gar nicht lauscht!

  •     access-control: 127.0.0.0/8 allow_snoop
        access-control: 192.168.0.0/24 allow
        access-control: 88.217.171.167/32 allow

Von welchen Netzwerken bzw. IP-Adressen Anfragen entgegengenommen werden.

Wenn unbound, die +trace-Funktion von dig ebenfalls ausführen soll, kann unbound so konfiguriert werden, dass dieser iterative (nicht rekursive) Abfragen ermöglicht. Dies geschieht durch die Verwendung der Option allow_snoop, anstelle von allow in der access-control: Konfiguration.

:!: HINWEIS - Aus Sicherheitsgründen wird empfohlen, allow_snoop nur für administrative Netzwerke zu aktivieren, nicht für die allgemeinen Client-Netzwerke, die den unbound DNS-Server verwenden!

  •     root-hints: "/etc/unbound/root.hints"

Einbinden der der ROOT-Server-Liste, da anstatt Anfragen an einen öffentlichen DNS-Server (wie z.B. Google 8.8.8.8), oder einen DNS-Server des ISP (Internet Service Providers wie z.B. die Telekom) weiterzuleiten, sollen die Root-DNS-Server verwendet werden.

  •     hide-identity: yes

Anfragen von id.server und hostname.bind sollen nicht beantwortet werden.

  •     hide-version: yes

Anfragen von version.server und version.bind sollen nicht beantwortet werden.

  •     do-not-query-localhost: no

Erlaube Verbindungen auch zu localhost.

:!: HINWEIS - Diese Einstellung ist entscheiden, wenn der dahinter liegende DNS-Server z.B. nur auf 127.0.0.1 lauscht !!!

  •     auto-trust-anchor-file: "/etc/unbound/keys/K0.168.192.in-addr.arpa.+015+64298.key"
        auto-trust-anchor-file: "/etc/unbound/keys/K0.168.192.in-addr.arpa.+015+65325.key"
        auto-trust-anchor-file: "/etc/unbound/keys/K167.171.217.88.in-addr.arpa.+015+05640.key"
        auto-trust-anchor-file: "/etc/unbound/keys/K167.171.217.88.in-addr.arpa.+015+59631.key"
        auto-trust-anchor-file: "/etc/unbound/keys/Kintra.tachtler.net.+015+02340.key"
        auto-trust-anchor-file: "/etc/unbound/keys/Kintra.tachtler.net.+015+17796.key"
        auto-trust-anchor-file: "/etc/unbound/keys/Ktachtler.net.+015+20289.key"
        auto-trust-anchor-file: "/etc/unbound/keys/Ktachtler.net.+015+37463.key"

Erweitern der auto-trust-anchor-file Angaben um weitere KSK (Key Signing Keys), damit die Chain-of-Trust / Vertrauenskette auch für lokale Zonen abgefragt werden kann und eingehalten wird!

  •     trusted-keys-file: "/etc/unbound/keys/*.key"

Erweitern der trusted-keys-file Angabe um weitere KSK (Key Signing Keys), damit die Chain-of-Trust / Vertrauenskette auch für lokale Zonen abgefragt werden kann und eingehalten wird!

  •     domain-insecure: "localhost."
        domain-insecure: "1.0.0.127.in-addr.arpa."
        domain-insecure: "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa."

Damit auch eine forward Anfrage nach localhost und eine reverse Anfrage nach 127.0.0.1 erfolgreich beantwortet werden können, ist es erforderlich diese von den DNSSec gesicherten Zonen auszunehmen.

  •     # Tachtler
        local-zone: "localhost." nodefault
        local-zone: "127.in-addr.arpa." nodefault
        local-zone: "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa." nodefault
        # local-zone: "onion." nodefault
        # local-zone: "test." nodefault
        # local-zone: "invalid." nodefault
        # local-zone: "10.in-addr.arpa." nodefault
        # local-zone: "16.172.in-addr.arpa." nodefault
        # local-zone: "17.172.in-addr.arpa." nodefault
        # local-zone: "18.172.in-addr.arpa." nodefault
        # local-zone: "19.172.in-addr.arpa." nodefault
        # local-zone: "20.172.in-addr.arpa." nodefault
        # local-zone: "21.172.in-addr.arpa." nodefault
        # local-zone: "22.172.in-addr.arpa." nodefault
        # local-zone: "23.172.in-addr.arpa." nodefault
        # local-zone: "24.172.in-addr.arpa." nodefault
        # local-zone: "25.172.in-addr.arpa." nodefault
        # local-zone: "26.172.in-addr.arpa." nodefault
        # local-zone: "27.172.in-addr.arpa." nodefault
        # local-zone: "28.172.in-addr.arpa." nodefault
        # local-zone: "29.172.in-addr.arpa." nodefault
        # local-zone: "30.172.in-addr.arpa." nodefault
        # local-zone: "31.172.in-addr.arpa." nodefault
        local-zone: "168.192.in-addr.arpa." nodefault
        local-zone: "0.in-addr.arpa." nodefault
        # local-zone: "254.169.in-addr.arpa." nodefault
        # local-zone: "2.0.192.in-addr.arpa." nodefault
        # local-zone: "100.51.198.in-addr.arpa." nodefault
        # local-zone: "113.0.203.in-addr.arpa." nodefault
        # local-zone: "255.255.255.255.in-addr.arpa." nodefault
        # local-zone: "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa." nodefault
        # local-zone: "d.f.ip6.arpa." nodefault
        # local-zone: "8.e.f.ip6.arpa." nodefault
        # local-zone: "9.e.f.ip6.arpa." nodefault
        # local-zone: "a.e.f.ip6.arpa." nodefault
        # local-zone: "b.e.f.ip6.arpa." nodefault
        # local-zone: "8.b.d.0.1.0.0.2.ip6.arpa." nodefault
        # And for 64.100.in-addr.arpa. to 127.100.in-addr.arpa.

Damit auch eine reverse Anfrage zum erfolgt führt, ist die Definition der local-zome wichtig. Dies muss für alle Zonen durchgeführt werden für die eine reverse Auflösung zu einem Ergebnis führen soll.

:!: HINWEIS - Wenn keine local-zone Definitionen durchgeführt werden, werden für diese KEINE reverse Anfragen beantwortet !!!

Beispiel bei NICHT-Definition

# dig @192.168.0.20 -x 192.168.0.10

; <<>> DiG 9.16.23 <<>> @192.168.0.20 -x 192.168.0.10
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 20189
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;10.0.168.192.in-addr.arpa.	IN	PTR

;; AUTHORITY SECTION:
168.192.in-addr.arpa.	10800	IN	SOA	localhost. nobody.invalid. 1 3600 1200 604800 10800

;; Query time: 0 msec
;; SERVER: 192.168.0.20#53(192.168.0.20)
;; WHEN: Sun Nov 28 17:39:46 CET 2021
;; MSG SIZE  rcvd: 113
  • remote-control:
    	control-enable: yes
    	server-key-file: "/etc/unbound/unbound_server.key"
    	server-cert-file: "/etc/unbound/unbound_server.pem"
    	control-key-file: "/etc/unbound/unbound_control.key"
    	control-cert-file: "/etc/unbound/unbound_control.pem"

Eine Kontrolle über den Befehl unbound-control soll ermöglicht werden.

  • forward-zone:
            name: "localhost"
            forward-addr: 127.0.0.1
    forward-zone:
            name: "1.0.0.127.in-addr.arpa"
            forward-addr: 127.0.0.1
    forward-zone:
            name: "tachtler.net"
            forward-addr: 127.0.0.1
    forward-zone:
            name: "0.168.192.in-addr.arpa"
            forward-addr: 127.0.0.1
    forward-zone:
            name: "167.171.217.88.in-addr.arpa"
            forward-addr: 127.0.0.1

Interne Anfragen sollen an den DNS-Server, welcher auf der IP-Adresse 127.0.0.1 lauscht weitergeleitet werden. Alle anderen Anfragen, sollen an die ROOT-Server-(Liste) gesendet werden.

:!: HINWEIS - Dies könnte hier z.B. ein Authorativer DNS-Server sein, siehe auch den internen Link:

Die Konfigurationsdatei /etc/unbound/unbound.conf ohne Kommentar- und Leerzeichen inklusive der Änderungen:

# egrep -v '(^#|^.*#|^$)' /etc/unbound/unbound.conf
server:
	verbosity: 1
	interface: 192.168.0.20
	outgoing-interface: 192.168.0.20
	access-control: 127.0.0.0/8 allow_snoop
	access-control: 192.168.0.0/24 allow
	access-control: 88.217.171.167/32 allow
	root-hints: "/etc/unbound/root.hints"
	hide-identity: yes
	hide-version: yes
	do-not-query-localhost: no
	auto-trust-anchor-file: "/etc/unbound/keys/K0.168.192.in-addr.arpa.+015+64298.key"
	auto-trust-anchor-file: "/etc/unbound/keys/K0.168.192.in-addr.arpa.+015+65325.key"
	auto-trust-anchor-file: "/etc/unbound/keys/K167.171.217.88.in-addr.arpa.+015+05640.key"
	auto-trust-anchor-file: "/etc/unbound/keys/K167.171.217.88.in-addr.arpa.+015+59631.key"
	auto-trust-anchor-file: "/etc/unbound/keys/Kintra.tachtler.net.+015+02340.key"
	auto-trust-anchor-file: "/etc/unbound/keys/Kintra.tachtler.net.+015+17796.key"
	auto-trust-anchor-file: "/etc/unbound/keys/Ktachtler.net.+015+20289.key"
	auto-trust-anchor-file: "/etc/unbound/keys/Ktachtler.net.+015+37463.key"
	trust-anchor-file: /etc/unbound/trusted-key.key
	trusted-keys-file: "/etc/unbound/keys/*.key"
	domain-insecure: "localhost."
	domain-insecure: "1.0.0.127.in-addr.arpa."
	domain-insecure: "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa."
	local-zone: "localhost." nodefault
	local-zone: "127.in-addr.arpa." nodefault
	local-zone: "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa." nodefault
	local-zone: "168.192.in-addr.arpa." nodefault
	local-zone: "0.in-addr.arpa." nodefault
python:
dynlib:
remote-control:
	control-enable: yes
	server-key-file: "/etc/unbound/unbound_server.key"
	server-cert-file: "/etc/unbound/unbound_server.pem"
	control-key-file: "/etc/unbound/unbound_control.key"
	control-cert-file: "/etc/unbound/unbound_control.pem"
forward-zone:
        name: "localhost"
        forward-addr: 127.0.0.1
forward-zone:
        name: "1.0.0.127.in-addr.arpa"
        forward-addr: 127.0.0.1
forward-zone:
        name: "tachtler.net"
        forward-addr: 127.0.0.1
forward-zone:
        name: "0.168.192.in-addr.arpa"
        forward-addr: 127.0.0.1
forward-zone:
        name: "167.171.217.88.in-addr.arpa"
        forward-addr: 127.0.0.1

Konfigurationsdatei Überprüfung

Mit nachfolgendem Befehl kann die syntaktische Richtigkeit der Konfigurationsdatei:

  • /etc/unbound/unbound.conf

durchgeführt werden und sollte keine Meldungen ausgeben, wenn die Konfigurationsdatei syntaktische richtig ist:

# /usr/sbin/unbound-checkconf /etc/unbound/unbound.conf
unbound-checkconf: no errors in /etc/unbound/unbound.conf

Erster Start

Falls alle voranstehenden Schritte wie beschrieben durchgeführt wurden, Installation, Basis-Konfiguration, sollte dem ersten Start nichts im Wege stehen und dies mit nachfolgendem Befehl durchgeführt werden:

# systemctl start unbound.service

Mit nachfolgendem Befehl kann überprüft werden, ob der erste Start erfolgreich durchgeführt wurde:

# systemctl status unbound.service
● unbound.service - Validating, recursive, and caching DNS resolver
     Loaded: loaded (/etc/systemd/system/unbound.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2021-11-30 16:08:17 CET; 44s ago
       Docs: man:unbound(8)
   Main PID: 44109 (unbound)
      Tasks: 1 (limit: 2346)
     Memory: 6.7M
        CPU: 96ms
     CGroup: /system.slice/unbound.service
             └─44109 /usr/bin/unbound -d -p

Nov 30 16:08:17 vml020 systemd[1]: Starting Validating, recursive, and caching DNS resolver...
Nov 30 16:08:17 vml020 unbound[44109]: [1638284897] unbound[44109:0] warning: IPv6 protocol not available
Nov 30 16:08:17 vml020 unbound[44109]: [44109:0] notice: init module 0: subnetcache
Nov 30 16:08:17 vml020 unbound[44109]: [44109:0] notice: init module 1: validator
Nov 30 16:08:17 vml020 unbound[44109]: [44109:0] notice: init module 2: iterator
Nov 30 16:08:17 vml020 unbound[44109]: [44109:0] info: start of service (unbound 1.13.2).
Nov 30 16:08:17 vml020 systemd[1]: Started Validating, recursive, and caching DNS resolver.

Überprüfung

Ziel ist es eine lokale Antwort –>

  • rechner10.intra.tachtler.net IN A 192.168.0.10

zu erhalten, welche via

  1. DNSSec abgesichert ist und
  2. bei der die (DNS) Chain-of-Trust (Vertrauenskette)

im lokalen Netzwerk überprüfbar ist, was durch

  • das ad-Flag

in der Antwort bestätigt wird.

(Siehe nachfolgendes Beispiel)

# dig @192.168.0.20 rechner10.intra.tachtler.net +dnssec +multi

; <<>> DiG 9.16.23 <<>> @192.168.0.20 rechner10.intra.tachtler.net +dnssec +multi
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36662
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;rechner10.intra.tachtler.net. IN A

;; ANSWER SECTION:
rechner10.intra.tachtler.net. 10800 IN A 192.168.0.10
rechner10.intra.tachtler.net. 10800 IN RRSIG A 15 4 10800 (
				20211217203021 20211130133211 10887 intra.tachtler.net.
				Ds49XZOZ1p87ygjVtBYPk5qZED3MmbVybLoKIc8o4KPW
				P4xhS3R1Z9rAWBjHMi2XGxqIn7BB403SUh1quM03CA== )

;; Query time: 20 msec
;; SERVER: 192.168.0.20#53(192.168.0.20)
;; WHEN: Tue Nov 30 16:11:49 CET 2021
;; MSG SIZE  rcvd: 187

:!: HINWEIS - Nachfolgend muss das ad-Flag in der Antwort enthalten sein, siehe nachfolgende Zeile:

  • ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/dns_unbound_archlinux.txt · Zuletzt geändert: 2022/03/31 05:32 von klaus