Abgesichert und werbefrei – das geht auch unterwegs vom Handy oder Rechner. Insbesondere, wenn man sich in öffentlichen WLANs schützen möchte, kann man dies mit einem eigenen VPN realisieren. Damit dies auch noch mit einem Werbeblocker kombiniert wird, kann man sich auch vor Werbung, Tracking und Daten-Sammelwut von Providern schützen. Und das geht schneller und günstiger als man denkt.

In diesem Beispiel setzen wir einen Cloud-Server bei Hetzner auf. Mit meinem Gutschein-Code erhältst Du bei Registrierung ein Guthaben von 20 EUR. Da der Server, den wir dafür benötigen, nur € 2,96 im Monat kostet, bleibt genug Zeit, dies kostenlos auszuprobieren. Nutze diesen Gutschein-Code

Erstelle, wie im Video beschrieben, einen Server mit Ubuntu 20.04 & melde dich per SSH und root an. Zunächst aktualisiere den Server mit folgendem Befehl:

apt update && apt upgrade -y

Als erstes Paket installiere Unbound. Für die Installation gib folgenden Befehl ein:

apt install unbound

Danach lade die aktuellen root Hints (die Liste der offiziellen Root-DNS Server) herunter. Gib dazu folgendes ein:

curl -# https://www.internic.net/domain/named.root > /var/lib/unbound/root.hints

Jetzt muss eine Konfiguration für Unbound erstellt werden. Wechsele in das config Verzeichnis mit folgendem Kommando:

cd /etc/unbound/unbound.conf.d

Jetzt erstelle eine Konfigurations-Datei mit dem Namen 01-pihole.conf und öffne die in dem Nano Editor:

nano 01-pihole.conf

Diese Konfiguration wird dann beim Start von Unbound geladen. Da bei Pi-hole unter anderem der Port 53 schon in Gebrauch ist, muss die Basis-Konfiguration angepasst werden. Ich stelle Dir hierfür eine Konfiguration zur Verfügung. Kopiere den Inhalt und füge ihn in die 01-pihole.conf per copy & paste ein:

# https://nlnetlabs.nl/documentation/unbound/unbound.conf/
server:
	# Do not daemonize, to allow proper systemd service control and status estimation.
	do-daemonize: no

	# A single thread is pretty sufficient for home or small office instances.
	num-threads: 1

	# Logging: For the sake of privacy and performance, keep logging at a minimum!
	# - Verbosity 2 and up practically contains query and reply logs.
	verbosity: 0
	log-queries: no
	log-replies: no
	# - If required, uncomment to log to a file, else logs are available via "journalctl -u unbound".
	#logfile: "/var/log/unbound.log"

	# Set interface to "0.0.0.0" to make Unbound listen on all network interfaces.
	# Set it to "127.0.0.1" to listen on requests from the same machine only, useful in combination with Pi-hole.
	interface: 127.0.0.1
	# Default DNS port is "53". When used with Pi-hole, set this to e.g. "5335", since "5353" is used by mDNS already.
	port: 5335

	# Control IP ranges which should be able to use this Unbound instance.
	# The Server defaults permit access from official local network IP ranges only, hence requests from www are denied.
	access-control: 0.0.0.0/0 refuse
	access-control: 10.0.0.0/8 allow
	access-control: 127.0.0.1/8 allow
	access-control: 172.16.0.0/12 allow
	access-control: 192.168.0.0/16 allow
	access-control: ::/0 refuse
	access-control: ::1/128 allow
	access-control: fd00::/8 allow
	access-control: fe80::/10 allow

	# Private IP ranges, which shall never be returned or forwarded as public DNS response.
	# NB: 127.0.0.1/8 is sometimes used by adblock lists, hence DietPi by default allows those as response.
	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

	# Define protocols for connections to and from Unbound.
	# NB: Disabling IPv6 does not disable IPv6 IP resolving, which depends on the clients request.
	do-udp: yes
	do-tcp: yes
	do-ip4: yes
	do-ip6: yes
	prefer-ip6: no

	# DNS root server information file. Update regularly via: "curl -# https://www.internic.net/domain/named.root > /var/lib/unbound/root.hints"
	root-hints: "/var/lib/unbound/root.hints"

	# Maximum number of queries per second
	ratelimit: 1000

	# Defend against and print warning when reaching unwanted reply limit.
	unwanted-reply-threshold: 10000

	# Set EDNS reassembly buffer size to match new upstream default, as of DNS Flag Day 2020 recommendation.
	edns-buffer-size: 1232

	# Increase incoming and outgoing query buffer size to cover traffic peaks.
	so-rcvbuf: 4m
	so-sndbuf: 4m

	# Hardening
	harden-glue: yes
	harden-dnssec-stripped: yes
	harden-algo-downgrade: yes
	harden-large-queries: yes
	harden-short-bufsize: yes

	# Privacy
	use-caps-for-id: yes # Spoof protection by randomising capitalisation
	rrset-roundrobin: yes
	qname-minimisation: yes
	minimal-responses: yes
	hide-identity: yes
	identity: "Server" # Purposefully a dummy identity name
	hide-version: yes

	# Caching
	cache-min-ttl: 300
	cache-max-ttl: 86400
	serve-expired: yes
	neg-cache-size: 4M
	prefetch: yes
	prefetch-key: yes
	msg-cache-size: 50m
	rrset-cache-size: 100m

Die Datei anschliessend mit CTRL-X-Y abspeichern. Dach den Unbound-Dienst neu starten:

service unbound restart

Jetzt installieren wir Pi-hole. Folge den Anweisungen und bestätige alles mit OK (Enter):

curl -sSL https://install.pi-hole.net | bash

Nach der erfolgreichen Installation ändere das Passwort für das Pi-hole Webinterface:

pihole -a -p

Jetzt passen wir die DNS-Einstellungen von Pi-hole an. Im Standard benutzt ja Pi-hole einen Upstream DNS Server (z.B. Google DNS, Cloudflare etc.). Wir möchten aber Unbound als DNS Server benutzen. Melde Dich dazu am Pi-hole Webinterface an, gehe zu Settings / DNS und trage als Custom DNS Upstream Server 127.0.0.1#5335 ein. Wähle auf der linken Seite alle Server ab und setze den Haken bei Listen on all Interfaces, permit all origins. Danach drücke unten auf Save:

Jetzt installieren wir PiVPN. Die Installation erfolgt über einen einzigen Befehl:

curl -L https://install.pivpn.io | bash

Während der Installation wirst Du nach einem “non root” User gefragt. Im Standard ist noch keiner installiert. In dem Verzeichnis dieses Users werden dann die VPN-Konfigurationen der VPN-Benutzer angelegt. In diesem Beispiel habe ich den User vpn genannt und ein Passwort vergeben.

Als VPN-Service wähle Wireguard aus und benutze den Standard-Port 51820. Die Frage, ob du Pi-hole im VPN nutzen möchtest, beantworte mit YES. Alles weitere mit Enter bestätigen und den Server nach Installation neu starten.

Nach dem Neustart können jetzt VPN-Benutzer angelegt werden. Dies geht mittels:

pivpn -a

Nach Eingabe des Namens wird der VPN Benutzer angelegt. Die Konfigurations-Datei liegt dann im Verzeichnis /home/vpn/configs

Möchte man die Config auf ein Handy einrichten, kann man sich bequem einen QR Code anzeigen lassen und diesen in der Wireguard APP einscannen. Mit folgendem Kommando kann man sich den QR-Code anzeigen lassen:

pivpn -qr

Wenn man die Konfigurations-Dateien auf einen Rechner übertragen möchte, nutzt man einfach ein SFTP Tool und verbindet sich auf seinen Server.

Da nun unser Pi-hole als öffentlicher DNS-Resovler im Internet verfügbar ist, findet dies unser Provider (hier Hetzner) mit Sicherheit nicht gut. Offene DNS-Resolver können potentiell für DNS Amplification Attacks missbraucht werden. Da wir bei unserem Cloud Server eine Firewall aktivieren können, haben wir somit die Möglichkeit, den Port 53 für den öffentlichen Zugriff zu sperren. Aktiviere die Firewall wie im Video beschrieben und erlaube Port 51820 UDP für die VPN Verbindung. Bitte auf keinen Fall Port 22 (SSH) entfernen, da Du sonst per SSH nicht mehr auf Deinen Server kommst. Wenn Du Deinen Pi-hole auch ohne VPN-Verbindung administrieren willst, öffne zusätzlich noch Port 80 TCP. Achte aber dann auf ein starkes Passwort!

Viel Spass beim Nachbauen.