Benutzer-Werkzeuge

Webseiten-Werkzeuge


technik:raspberry:wireguard

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
technik/raspberry/wireguard.txt · Zuletzt geändert: 2023/03/15 20:11 von ghostwriter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki