Inhaltsverzeichnis
WireGuard mit Raspberry Pi OS Lite
Hinweis Die hier verwendeten privaten und öffentlichen Schlüssel mit den selbst erzeugten Schlüsseln ersetzen. Die Schlüssel in diesen Beispielen sind alle nicht gültig.
Da mein Internetanschluss kein IPv6 unterstützt, kann ich nicht näher darauf eingehen.
Setzt euch vor der Installation mit WireGuard auseinander. Diese Anleitung ist nur ein - es läuft - und keinesfalls für Sensible Umgebungen und Einrichtungen geeignet. Insbesondere die nftables Einstellungen.
Aktuell setze ich kein WireGuard ein und werde hier nichts mehr aktualisieren oder korrigieren.
Linux aktualisieren
System aktualisieren.
Achtung Die Anleitung war ursprünglich mit Raspberry Pi OS mit Debian 10 Buster. Mit Raspberry Pi OS auf Debain 11 Bullseye basierend kann sie nicht eins zu eins angewendet werden. Diese Konfiguration verwendet iptables. Ganz am Ende ist etwas zu nftables zu finden.
Das forwarding wird neu über nftables eingerichtet. Auf dieser Webseite unter *Configure forwarding* https://popovy.ch/blog/wireguard-vpn-server-with-ipv6-support-secure-dns-and-nftables könnte es spannend werden
Raspberry Pi OS mit älterem Kernel < 5.6 benötigen eine Kernelheader Installation und eine zusätzliche Paketquelle. Ab Kernel 5.6 ist die direkte Unterstützung für WireGuard mit dabei.
Kernel Version anzeigen
ALT
uname -a Linux raspberrypi 5.4.79-v7l+ #1373 SMP Mon Nov 23 13:27:40 GMT 2020 armv7l GNU/Linux
NEUER
uname -a Linux pi3 5.15.84-v7+ #1613 SMP Thu Jan 5 11:59:48 GMT 2023 armv7l GNU/Linux
Ist der Kernel alt, installiert man am einfachsten ein neues Raspberry Pi OS.
WireGuard installieren bei Kerneln >= 5.6
sudo apt install wireguard
WireGuard konfigurieren
IPv4 Weiterleitung aktivieren. In der Datei /etc/sysctl.conf die Zeile net.ipv4.ip_forward = 1 aktivieren. Bei IPv6 (verwende ich persönlich nicht) die Zeile net.ipv6.conf.all.forwarding = 1 aktivieren.
Im nano Editor mit den Pfeiltasten zur gewünschten Stelle navigieren. Raute(n) löschen. mit Ctrl+o, Enter speichern, mit Ctrl+x schliessen.
sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host #net.ipv6.conf.all.forwarding=1
Schlüssel erstellen
sudo su cd /etc/wireguard wg genkey | tee private | wg pubkey > public cat private cat public exit
In einigen Anleitungen wird ein PresharedKey verwendet - wer das will, darf das gerne nutzen. Ich gehe hier nicht darauf ein.
Netzwerkadapter Namen herausfinden
Adapter auflisten
ip address
Sucht die IP-Adresse der Netzwerkkarte und notiert euch den Namen des Adapters z.B. eth0, enp2s0, wlp3s0 oder wlan0.
Server Konfiguration erstellen
Das Verzeichnis existiert bereits, enthält aber nach einer frischen Installation noch keine Konfiguration. Datei anlegen.
sudo nano /etc/wireguard/wg0.conf
Vorlage. PrivateKey unter Interface mit dem eigenen Schlüssel ersetzen.
Die Geräte Schlüssel unter [Peer] werden in der Regel auf dem Endgerät erstellt und danach hier in die Konfiguration mit eingetragen.
[Interface] Address = 100.64.0.1/24 ListenPort = 51820 PrivateKey = IGUHkAznF9f9AwiS061iMWoQZ38qos5PqT8bdwRO5lB= #replace eth0 with the interface open to the internet (ip address) #PostUp = iptables -A FORWARD -i %i -j ACCEPT #PostUp = iptables -A FORWARD -o %i -j ACCEPT #PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE #PostUp = ip6tables -A FORWARD -i %i -j ACCEPT #PostUp = ip6tables -A FORWARD -o %i -j ACCEPT #PostUp = ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE #PostDown = iptables -D FORWARD -i %i -j ACCEPT #PostDown = iptables -D FORWARD -o %i -j ACCEPT #PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE #PostDown = ip6tables -D FORWARD -i %i -j ACCEPT #PostDown = ip6tables -D FORWARD -o %i -j ACCEPT #PostDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE #Client1 Smartphone [Peer] PublicKey = 7Gh1KWhSmvGLjqpuPwfooxc89x5Yt5iF1kzMvOx/TXd= AllowedIPs = 100.64.0.2/32, ::/0 #Client2 Laptop [Peer] PublicKey = 0VcQ/4xwfKiRaUvNiBE1Xcv0l9wyJe77JxHYCfrwQFN= AllowedIPs = 100.64.0.3/32, ::/0
Datei speichern (Ctrl+o, enter, Ctrl+x)
sudo wg-quick up wg0 Aktivieren sudo wg Status anzeigen sudo wg-quick down wg0 Ausschalten sudo systemctl enable wg-quick@wg0 Als Dienst einrichten sudo systemctl start wg-quick@wg0 Dienst starten sudo systemctl stop wg-quick@wg0 Dienst stoppen, brauchen wir jetzt nicht :-) systemctl status wg-quick@wg0 Dienst status anzeigen
Verzeichnis schützen
sudo chown -R root:root /etc/wireguard/
Dateien schützen
sudo su chmod -R og-rwx /etc/wireguard/* exit
Die Port Weiterleitung auf dem Router UDP 51820 an den Server nicht vergessen
Client Konfiguration
Android WireGuard
Bei mir gibt es zwei fast identische WireGuard Konfigurationen.
Die erste Konfiguration vonextern mit DNS 208.67.222.222.
Die zweite Konfiguration vonexternpi mit DNS 192.168.172.7.
Der Grund ist einfach. Ich besitze keine fixe IP Adresse und muss über den OpenDNS zuerst den DynDNS Eintrag mEINhostname.spdns.de auflösen können. Sobald der gefunden wurde, kann auf den internen Pi-hole umgeschaltet werden. Gibt es dazu eine Bessere Möglichkeit?
[Interface]
- Name vonextern bzw. vonexternpi
- Privater Schlüssel = (Generierter Schlüssel, geheim!)
- Öffentlicher Schlüssel = Generierter Schlüssel (7Gh1KWhSmvGLjqpuPwfooxc89x5Yt5iF1kzMvOx/TXd=) In Server Konfiguration einfügen.
- Adressen = 100.64.0.2/32
- DNS-Server = 208.67.222.222 bzw. 192.168.172.7 beachte Abschnitt Konfiguration Pi-hole
[Teilnehmer]
- Öffentlicher Schlüssel = Public von Server
- Endpunkt = DynDNS Eintrag oder fixe IP des Servers:PORT
- Erlaubte IPs = 0.0.0.0/0, ::/0
- vonextern.conf
[Interface] Address = 100.64.0.2/32 DNS = 208.67.222.222 PrivateKey = WCUVG0V/tQV/lazrr0IFRsfTtmS2IrHt9O4Q/1tbRU9= [Peer] AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = mEINhostname.spdns.de:51820 PublicKey = cd7icOBRS3d0rDIPJHD4Q5VGm2DeolfWRGKUgV8XRE1=
Konfiguration Pi-hole
Falls WireGuard zusammen mit Pi-hole auf demselben Raspberry Pi betrieben wird und Pi-hole dabei die Namensauflösung vornehmen soll, dann muss in der Pi-hole in den Einstellungen das Horchverhalten auf die Netzwerkschnittstellen angepasst werden.
Settings, DNS, bei Interface listening behavior den Listen on all interfaces aktivieren. Allows only queries from devices that are at most one hop away (local devices)
Anpassungen für nftables
Hinweis: Das hier ist von diversen Stellen aus dem Internet zusammengewurstelt.
In der WireGuard Konfiguration alle PostUp und PostDown mit einem # Auskommentieren, so dass die nicht angewendet werden.
nftables.conf ergänzen
sudo nano /etc/nftables.conf
- vorher
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; } chain forward { type filter hook forward priority 0; } chain output { type filter hook output priority 0; } }
- nachher
#!/usr/sbin/nft -f # Define some variables for easy reference define wan = eth0 define vpn = wg0 define vpn_net = 100.64.0.1/24 flush ruleset table inet filter { chain input { type filter hook input priority 0; } chain forward { type filter hook forward priority 0; # New: Forward all established and related traffic. Drop invalid traffic ct state established,related accept ct state invalid drop # New: Allow WireGuard traffic to access the internet via wan iifname $vpn oifname $wan ct state new accept } chain output { type filter hook output priority 0; } } # New: add a router section for point 3. table ip router { # Both need to be set even when one is empty. chain prerouting { type nat hook prerouting priority 0; } chain postrouting { type nat hook postrouting priority 100; # Masquerade WireGuard traffic. # All WireGuard traffic will look like it comes from the servers IP address. oifname $wan ip saddr $vpn_net masquerade } }
Nftables Dienst aktivieren und starten.
systemctl enable nftables.service systemctl start nftables.service
Und zu guter Letzt.
sudo reboot