Eine Kernfunktion deines Netzwerks ist das DNS, das Domain Name System. Es übersetzt Domainnamen wie „smarthome.edv-hacker.de“ oder „nutzundsinnlos.de“ in IP-Adressen. Es lassen sich also Server ansprechen, indem man einen leichter zu merkenden Namen, statt der IP verwendet, die eigentlich angesprochen werden muss.
Dafür gibt es DNS-Server, die die Namen kennen oder zumindest Teile davon.
Eigenen DNS-Server für lokale Namen verwenden
Dein Router und dein Raspberry Pi haben beide Möglichkeiten, um die Geräte innerhalb deines Netzwerkes selbst zu identifizieren. Anfragen außerhalb deines Netzes leiten sie an einen oder mehrere externe DNS-Server weiter.
Die Fritz!box tut dies ab Werk. Willst oder musst du statt dessen dein Raspberry Pi verwenden, bietet sich „dnsmasq“ an. dnsmasq stellt auch gleich einen DHCP-Server zur Verfügung, genau wie die Fritz!box.
DNS over TLS
Jetzt ist es allerdings so, das DNS-Anfragen an externe Server unverschlüsselt gesendet werden. Auch wenn du verschlüsselte Webseiten über HTTPS aufrufst, kann ein Dritter (z.B. dein Internet-Provider) zumindest mitlesen, welche Domains du ansurfst.
Ab Werk ist das bei Routern meistens der DNS des Internetanbieters. Der kann damit dann Zensuren durchsetzen oder den Verkehr speichern.
DNS over TLS verschlüsselt deine Anfrage an einen passenden Server Ende-zu-Ende.
In deiner Fritz!box kannst du eine Liste von passenden Servern hinterlegen und normales DNS, sowie den Provider-DNS abschalten (Internet -> Zugangsdaten -> DNS-Server). Privacy-Handbuch.de diskutiert verschiedene Server und stellt ihre Adresse für dich bereit.
Im Raspberry Pi werden folgende Pakete benötigt:
sudo apt -yf install dnsutils dnsmasq stubby
In der /etc/dnsmasq.conf trägst du deine gewünschten Konfigurationen ein. Folgende Zeilen können dir als Inspiration dienen:
# DNS
#Adding a custom domain
local=/yourDomainName/
domain=yourDomainName
# Never forward plain names (without a dot or domain part)
#domain-needed
# Never forward addresses in the non-routed address spaces
bogus-priv
# dont read resolv.conf use the defined servers instead
no-resolv
server=127.0.0.1#5453
# DHCP
#Adding a custom domain
expand-hosts
# Set the DHCP server to authoritative mode.
dhcp-authoritative
#Options
#https://blog.abysm.org/2020/06/human-readable-dhcp-options-for-dnsmasq/
dhcp-range=192.168.22.128,192.168.178.254,24h
dhcp-option=option:router,192.168.178.1 #gateway
dhcp-option=option:ntp-server,192.168.178.3 #NTP
dhcp-option=option:domain-name,yourDomainName
dhcp-option=option:domain-search,yourDomainName
dhcp-option=option:dns-server,192.168.178.3,192.168.178.1 #Alt DNS-Servers
#Static IPs
dhcp-host=XX:XX:XX:XX:XX:XX,gateway,192.168.22.1,infinite #Fritzbox
Nach der erfolgreichen Konfiguration von Dnsmasq fehlt noch Stubby. Stubby stellt den DNS-over-TLS-Server bereit. EIn reduziertes Beispiel könnte so aussehen. Allerdings bringt die Werkskonfiguration von stubby bereits noch weitere und umfassende Beispiele mit sich.
########################## BASIC & PRIVACY SETTINGS ############################
# Specifies whether to run as a recursive or stub resolver
# For stubby this MUST be set to GETDNS_RESOLUTION_STUB
resolution_type: GETDNS_RESOLUTION_STUB
# Ordered list composed of one or more transport protocols:
dns_transport_list:
- GETDNS_TRANSPORT_TLS
# Selects Strict or Opportunistic Usage profile
# For Strict use GETDNS_AUTHENTICATION_REQUIRED
# For Opportunistic use GETDNS_AUTHENTICATION_NONE
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
# EDNS0 option to pad the size of the DNS query to the given blocksize
tls_query_padding_blocksize: 128
# EDNS0 option for ECS client privacy as described in Section 7.1.2 of
# https://tools.ietf.org/html/rfc7871
edns_client_subnet_private : 1
############################# CONNECTION SETTINGS ##############################
# Set to 1 to instruct stubby to distribute queries across all available name
# servers
round_robin_upstreams: 1
# EDNS0 option for keepalive idle timeout in ms as specified in
# https://tools.ietf.org/html/rfc7828
# This keeps idle TLS connections open to avoid the overhead of opening a new
# connection for every query.
idle_timeout: 10000
# Specify where the location for CA certificates for verification purposes are
# located.
tls_ca_path: "/etc/ssl/certs/"
################################ LISTEN ADDRESS ################################
# Set the listen addresses for the stubby DAEMON. This specifies localhost IPv4
# and IPv6. It will listen on port 53 by default. Use <IP_address>@<port> to
# specify a different port
listen_addresses:
- 127.0.0.1@5453
- 0::1@5453
############################### DNSSEC SETTINGS ################################
appdata_dir: "/var/cache/stubby"
################################## UPSTREAMS ################################
upstream_recursive_servers:
############################ DEFAULT UPSTREAMS ################################
####### IPv4 addresses ######
### Test servers ###
# The Surfnet/Sinodun servers
- address_data: 145.100.185.15
tls_auth_name: "dnsovertls.sinodun.com"
tls_pubkey_pinset:
- digest: "sha256"
value: 62lKu9HsDVbyiPenApnc4sfmSYTHOVfFgL3pyB+cBL4=
- address_data: 145.100.185.16
tls_auth_name: "dnsovertls1.sinodun.com"
tls_pubkey_pinset:
- digest: "sha256"
value: cE2ecALeE5B+urJhDrJlVFmf38cJLAvqekONvjvpqUA=
# The getdnsapi.net server
- address_data: 185.49.141.37
tls_auth_name: "getdnsapi.net"
tls_pubkey_pinset:
- digest: "sha256"
value: foxZRnIh9gZpWnl+zEiKa0EJ2rdCGroMWm02gaxSc9Q=
####### IPv6 addresses ######
### Test servers ###
# The Surfnet/Sinodun servers
- address_data: 2001:610:1:40ba:145:100:185:15
tls_auth_name: "dnsovertls.sinodun.com"
tls_pubkey_pinset:
- digest: "sha256"
value: 62lKu9HsDVbyiPenApnc4sfmSYTHOVfFgL3pyB+cBL4=
- address_data: 2001:610:1:40ba:145:100:185:16
tls_auth_name: "dnsovertls1.sinodun.com"
tls_pubkey_pinset:
- digest: "sha256"
value: cE2ecALeE5B+urJhDrJlVFmf38cJLAvqekONvjvpqUA=
# The getdnsapi.net server
- address_data: 2a04:b900:0:100::38
tls_auth_name: "getdnsapi.net"
tls_pubkey_pinset:
- digest: "sha256"
value: foxZRnIh9gZpWnl+zEiKa0EJ2rdCGroMWm02gaxSc9Q=
############################ OPTIONAL UPSTREAMS ###############################
####### IPv4 addresses ######
### Anycast services ###
## The Uncensored DNS servers
- address_data: 89.233.43.71
tls_auth_name: "unicast.censurfridns.dk"
tls_pubkey_pinset:
- digest: "sha256"
value: wikE3jYAA6jQmXYTr/rbHeEPmC78dQwZbQp6WdrseEs=
## Google
- address_data: 8.8.8.8
tls_auth_name: "dns.google"
- address_data: 8.8.4.4
tls_auth_name: "dns.google"
####### IPv6 addresses #######
### Anycast services ###
## Google
- address_data: 2001:4860:4860::8888
tls_auth_name: "dns.google"
- address_data: 2001:4860:4860::8844
tls_auth_name: "dns.google"
### Test servers ###
## The Uncensored DNS server
- address_data: 2a01:3a0:53:53::0
tls_auth_name: "unicast.censurfridns.dk"
tls_pubkey_pinset:
- digest: "sha256"
value: wikE3jYAA6jQmXYTr/rbHeEPmC78dQwZbQp6WdrseEs=
Stubby und Dnsmasq müssen nur noch aktiviert und neu gestartet werden.
sudo service dnsmasq restart
sudo systemctl enable stubby
sudo systemctl restart stubby
Dnsmasq sollte nun mittels Rückgriff auf Stubby alle Adressen mittels DNS-over-TLS verschlüsselt auflösen.