Raspberry Pi – Installation und Betrieb von WireGuard

WireGuard Logo

Obwohl die Bekanntheit von WireGuard in den letzten Monaten stark zugenommen hat, ist das VPN-Protokoll bzw, die VPN-Software immer noch verhältnismäßig unbekannt. Ich nutze WireGuard seit einigen Monaten und möchte es nicht mehr missen. Vor allem der schnelle Verbindungsaufbau, das exzellente Roaming-Verhalten und die gute Performance haben mich überzeugt.

Was sich genau hinter WireGuard verbirgt und wie die Software arbeitet, habe ich bereits in meinem Artikel “​WireGuard – neues VPN-Protokoll mit großer Zukunft” beschrieben. Jetzt folgt sozusagen der zweite Teil, in dem ich detailliert auf die Einrichtung unter Raspbian Buster und Android eingehe.

WireGuard Installation

Update 13.05.2021: Artikel auf das aktuellste Raspberry Pi OS angepasst. Dieser nutzt den Linux-Kernel 5.10, in welchem das WireGuard Modul enthalten ist.
Die Installationsanleitung funktioniert nicht bei folgenden Raspberry Pi Modellen: 1, 2 (Ausnahme v1.2), Zero & Zero W. Bei diesen Modellen fehlen benötigte CPU-Features und WireGuard muss dort von Hand compiliert werden. Wie das geht habe ich relativ am Ende meines Artikels aufgezeigt. Davon abgesehen macht die Nutzung auf diesen Modellen aber nur eingeschränkt Spaß.

Zunächst bringen wir die Paketquellen und alle Pakete auf den aktuellen Stand.

sudo apt update
sudo apt upgrade

Nachdem dies erledigt ist, widmen wir uns der Installation von WireGuard.

sudo apt install wireguard

Die Installation an sich ist damit erledigt. Allerdings fehlt ab Raspberry Pi OS Bullseye iptables, d.h. dieses müssen wir auch noch installieren:

sudo apt install iptables

Jetzt können wir mit der Konfiguration fortfahren.

Generierung der benötigten Schlüsselpaare

Zum Start benötigen wir jeweils einen privaten und öffentlichen Schlüssel für den Client und den Server.

Die Erstellung der Keys wird im Verzeichnis “/etc/wireguard” durchgeführt. Damit alle Dateien bei der Erstellung direkt restriktive Berechtigungen haben, muss die umask auf 077 gesetzt werden.

sudo su
cd /etc/wireguard
umask 077
wg genkey | tee peer1_private.key | wg pubkey > peer1_public.key
wg genkey | tee server_private.key | wg pubkey > server_public.key

Mittels “ls” prüfen wir, ob alle vier Dateien erstellt wurden:

ls
peer1_private.key  peer1_public.key  server_private.key  server_public.key

Zum Schluss können die Keys mittels “cat” ausgegeben werden, da wir diese später sowieso benötigen.

exit
sudo cat /etc/wireguard/peer1_private.key
sudo cat /etc/wireguard/peer1_public.key
sudo cat /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_public.key

WireGuard Server Konfiguration erstellen

Im ersten Schritt aktivieren wir das IPv4 Forwarding in der Datei “/etc/sysctl.conf”. Dies kann entweder mit Entfernen der Auskommentierung der Zeile “net.ipv4.ip_forward = 1” oder alternativ mit diesem Befehl erfolgen:

sudo perl -pi -e 's/#{1,}?net.ipv4.ip_forward ?= ?(0|1)/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf

Wer IPv6 nutzt, muss stattdessen entsprechend die Auskommentierung der Zeile “net.ipv6.conf.all.forwarding=1” aufheben.

Anschließend muss der Raspberry Pi neugestartet werden.

sudo reboot

Wir überprüfen den Status mit folgendem Befehl:

sysctl net.ipv4.ip_forward

Wenn das IPv4 Forwarding aktiv ist muss als Ergebnis “net.ipv4.ip_forward = 1” zurückgegeben werden.

Jetzt erstellen wir die WireGuard-Konfiguration “/etc/wireguard/wg0.conf”. Welchen Editor ihr bevorzugt, bleibt natürlich euch überlassen.

sudo vim /etc/wireguard/wg0.conf

Folgendes Template könnt ihr als Ausgangsbasis nutzen.

[Interface]
Address = 100.64.0.1/24
ListenPort = 51820
PrivateKey = <insert server_private.key>

#replace eth0 with the interface open to the internet (e.g might be wlan0)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

#Client1 Smartphone
[Peer]
PublicKey = <insert peer1_public.key>
AllowedIPs = 100.64.0.2/32

Neben den IP-Adressen müsst ihr den privaten Schlüssel vom Server und den öffentlichen Schlüssel vom Client ergänzen. Außerdem müsst ihr bei den iptables-Regeln evtl. die Netzwerkschnittstelle anpassen. Optional könnt ihr zudem einen anderen Port definieren. Wenn alles erledigt ist, solltest ihr die Datei unbedingt speichern.

Die für den Tunnel verwendeten IP-Adressen, dürfen sich mit den lokal verwendeten, privaten IPv4-Blöcken (RFC 1918) nicht überschneiden. Beim Einsatz einer FRITZ!Box als Router wird lokal standardmäßig 192.168.178.0/24 verwendet, d.h. alle anderen Adressbereiche können ohne Probleme genutzt werden.

Eine elegante Alternative ist die Verwendung von IP-Adressen (100.64.0.0/10), die für Carrier-Grade-NAT (RFC 6598) reserviert sind. Damit ist sichergestellt, dass die Tunnel-IPs nie mit den privaten Adressbereichen kollidieren können.

WireGuard Client Konfiguration erstellen

Am besten erstellt ihr für jeden Client eine eigene Konfiguration.

sudo vim /etc/wireguard/peer1.conf

Folgendes Template könnt ihr als Ausgangsbasis nutzen.

[Interface]
Address = 100.64.0.2/32
DNS = 192.168.178.1
PrivateKey = <insert peer1_private.key>

#Server
[Peer]
PublicKey = <insert server_public.key>
Endpoint = t6bibneqwcjxplum.myfritz.net:51820
AllowedIPs = 0.0.0.0/0, ::/0
#PersistentkeepAlive = 25

Hier müsst ihr unter “[Interface]” die IP-Adresse des Clients anpassen und den gewünschten DNS-Server eintragen. In meinem Beispiel verwende ich die private IP der FRITZ!Box. Wer daheim Pi-Hole im Einsatz hat, kann hier die Pi-Hole Adresse eintragen und kommt somit auch von unterwegs in den Genuss der Werbefreiheit.

Außerdem müsst ihr noch den privaten Schlüssel des Clients ergänzen.

Unter “[Peer]” tragt ihr zunächst den öffentlichen Schlüssel des Servers ein.

Anschließend folgt die Internetadresse, unter welcher der WireGuard-Server erreichbar ist. Üblicherweise gibt es hier zwei Dinge zu beachten. Bei eurem Internetanschluss daheim, bekommt ihr mit großer Wahrscheinlichkeit eine dynamische IP-Adresse vom Provider zugewiesen. Der WireGuard-Client müsste die wechselnden IP-Adressen stets kennen, um sich zu verbinden. Als Hilfe kommt hier ein dynamischer DNS-Anbieter ins Spiel, der einen festen Domainnamen bereitstellt und dahinter automatisch die jweils aktuelle IP-Adresse zuweist. Bei Verwendung einer FRITZ!Box könnt ihr beispielsweise den Dienst “MyFRITZ!” nutzen. Eine andere Alternative wäre FreeDNS. Der zweite Punkt ergibt sich, wenn der Raspberry Pi in eurem Heimnetzwerk steht. In diesem Fall müsst ihr an eurem Router ein Port-Forwarding einrichten (UDP 51820), sodass der WireGuard-Traffic des Clients auf den Server weitergeleitet wird.

Unter “AllowedIPs” wird definiert, welche IP-Ranges über das WireGuard-VPN geroutet werden. Mit “0.0.0.0/0, ::/0” wird der komplette IPv4- und IPv6-Traffic geroutet (full tunnel). Mit 192.168.178.0/24 könnt ihr z.B. nur euer Heimnetzwerk routen (split tunnel).

“PersistentKeepalive” ist standardmäßig deaktiviert. Zunächst ein paar Hintergrundinfos um einzuordnen, ob ihr dieses Feature benötigt oder nicht. Normalerweise ist WireGuard nicht sehr gesprächig und sendet nur Daten, wenn etwas zu übertragen ist. Ansonsten verhält sich WireGuard ruhig. Wenn sich der Server hinter einem NAT oder einer Firewall befindet und der Client für eine bestimmte Zeit keine Daten zum Server sendet, entfernt der NAT-Router bzw. die Firewall den Host-Status aus der Verbindungstabelle. Falls jetzt der Server ein Paket zum Client sendet, kommt dieses nicht an, da der NAT-Router bzw. die Firewall nicht weiß, was mit dem Paket zu tun ist. Mit der Option “PersistentKeepalive” sendet der Client alle x Sekunden ein leeres Paket, um die Verbindung aufrechtzuhalten. Ein Wert von 25 Sekunden hat sich in der Praxis bewährt und funktioniert mit einem Großteil von Firewalls und NAT-Routern.

Kurz zusammengefasst benötigt ihr dieses Feature also nur, wenn ihr vom Server euren Client erreichen möchtet, obwohl dieser seit längerer Zeit keine Pakete gesendet hat. Die meisten Benutzer werden dieses Feature nicht benötigen. Falls doch, einfach die Auskommentierung der Zeile rückgängig machen.

WireGuard Server starten

Nun können wir WireGuard auf dem Server starten. Anstatt alle einzelnen Schritte manuell mit dem “wg”-Tool durchzuführen, bedienen wir uns beim Tool “wg-quick”.

sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 100.64.0.1/24 dev wg0
[#] ip link set mtu 1432 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Die MTU von 1432 bezieht sich auf PPPoE mit IPv4. Bei IPv6 müsst ihr die MTU auf 1412 setzen. Wenn ihr Kabelinternet habt, dann sind Werte von 1440 bei IPv4 und 1420 bei IPv6 richtig.

Danach prüfen wir den Status der wg0-Schnittstelle.

sudo wg
interface: wg0
  public key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxljP1wpITnI=
  private key: (hidden)
  listening port: 51820

peer: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxtJd9/esWN4=
  allowed ips: 100.64.0.2/32

Der Server läuft und ist für die Verbindung des Clients bereit.

WireGuard beenden funktioniert mit diesem Befehl:

sudo wg-quick down wg0

Wenn WireGuard beim Systemstart automatisch geladen werden soll, kann dies mit folgendem Befehl realisiert werden:

sudo systemctl enable wg-quick@wg0
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.

Der Daemon kann folgendermaßen gesteuert werden. Dabei müsst ihr allerdings darauf achten, dass ihr WireGuard zuerst beendet, sofern ihr es manuell gestartet habt.

sudo systemctl start wg-quick@wg0
sudo systemctl stop wg-quick@wg0
systemctl status wg-quick@wg0

Zum Schluss werden die Berechtigungen von “/etc/wireguard/” und allen Dateien noch einmal korrigiert. Damit wird sichergestellt, dass nur root die entsprechenden Berechtigungen besitzt.

sudo chown -R root:root /etc/wireguard/
sudo chmod -R og-rwx /etc/wireguard/*

WireGuard Client unter Android einrichten

Die Einstellungen in der Android-App können manuell, mittels einer Datei oder mit einem QR-Code erfolgen. Die letzte Variante ist dabei am bequemsten. Hierfür muss auf dem Server der QR-Code erstellt werden.

sudo apt install qrencode

Nach dem Installieren von “qrencode” kann der QR-Code von der Client-Konfiguration erstellt werden:

sudo cat /etc/wireguard/peer1.conf | qrencode -t ansiutf8

Auf dem Android-Gerät muss zunächst die WireGuard App via Google Play installiert werden. Daraufhin kann der erstellte QR-Code mit der App gescannt werden, um die Konfiguration zu importieren. Nachdem ein Name vergeben wurde, kann die Verbindung aktiviert werden.

Mit einem Klick auf den gerade erstellten Tunnel werden einige Infos angezeigt, unter anderem auch eine Trafficstatistik.

Auf dem Server kann ebenfalls der Status ausgegeben werden. Dort werden unter anderem alle verbundenen Clients angezeigt:

sudo wg
interface: wg0
  public key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxljP1wpITnI=
  private key: (hidden)
  listening port: 51820

peer: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxtJd9/esWN4=
  endpoint: 11.12.13.14:53019
  allowed ips: 100.64.0.2/32
  latest handshake: 56 seconds ago
  transfer: 927.04 KiB received, 64.85 MiB sent

Der Client kann nun auch via Ping erreicht werden:

ping 100.64.0.2
PING 100.64.0.2 (100.64.0.2) 56(84) bytes of data.
64 bytes from 100.64.0.2: icmp_seq=1 ttl=64 time=95.9 ms
64 bytes from 100.64.0.2: icmp_seq=2 ttl=64 time=112.4 ms
64 bytes from 100.64.0.2: icmp_seq=3 ttl=64 time=71.7 ms

Noch zwei kleine Tipps für die Android-App. Ich importieren die Konfig vom Server immer zweimal. Einmal als “full tunnel” mit “0.0.0.0/0, ::/0” und einmal als “split tunnel”, lediglich mit dem Heimnetzwerk eingetragen, z.B. 192.168.178.0/24. So habt ihr volle Kontrolle und könnt je nach Situation den richtigen Tunnel nutzen.

Beim Bearbeiten eines Tunnels (Tunnel Infos anzeigen und dann rechts oben auf das Stift-Icon) könnt ihr außerdem festlegen, welche Apps keinen Traffic über den Tunnel schicken dürfen.

Troubleshooting

WireGuard ist ein Kernel-Modul, das via DKMS automatisch installiert wird, sobald das System einen neuen Kernel benutzt. In seltenen Fällen kann es jedoch passieren, dass WireGuard nicht automatisch eingebunden wird und mit dem neuen Kernel nicht mehr funktioniert.

In diesem Fall sollte zunächst geprüft werden, ob das WireGuard Modul geladen wurde:

lsmod | grep wireguard

Falls nicht kann es hilfreich sein, das Kernel-Modul neu zu konfigurieren:

sudo dpkg-reconfigure wireguard-dkms
sudo modprobe wireguard

Wenn dies keine Abhilfe schafft, könnt ihr noch folgendes ausprobieren:

sudo apt remove wireguard
sudo apt install bc libncurses5-dev
sudo apt install wireguard

Sollte dies auch keine Besserung bringen, könnt ihr alternativ das WireGuard Kernel Module und das wg Tool selber kompilieren. Davor muss aber sichergestellt sein, dass alle installierten WireGuard-Pakete deinstalliert sind!

sudo apt remove wireguard
# Toolchain installieren
sudo apt install libmnl-dev raspberrypi-kernel-headers build-essential git pkg-config
#Code laden
git clone https://git.zx2c4.com/wireguard-linux-compat
git clone https://git.zx2c4.com/wireguard-tools
# Kernel Module und das wg Tool kompilieren und installieren
make -C wireguard-linux-compat/src -j$(nproc)
sudo make -C wireguard-linux-compat/src install
make -C wireguard-tools/src -j$(nproc)
sudo make -C wireguard-tools/src install
# Neustarten und fertig
sudo reboot

Die aktuell installierte Version könnt ihr am besten via “dmesg” herausfinden:

dmesg | grep wireguard
[  466.479104] wireguard: WireGuard 1.0.0 loaded. See www.wireguard.com for information.
[  466.479115] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.

Quellen

  • https://www.wireguard.com/install/
  • https://github.com/adrianmihalko/raspberrypiwireguard
  • https://www.reddit.com/r/pihole/comments/bnihyz/guide_how_to_install_wireguard_on_a_raspberry_pi/
  • https://emanuelduss.ch/2018/09/wireguard-vpn-road-warrior-setup/
  • https://www.bachmann-lan.de/raspberry-pi-mit-wireguard-als-vpn-server-mit-wireguard/

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

46 Antworten

  1. Jörg sagt:

    Hallo Tobias,
    nach deiner Anleitung habe ich WireGuard Server auf einen Raspberry Pi 2 (etwas overclockt) installiert und eingerichtet. Ich baue auschließlich einen einzigen Tunnel von einem GL-AR750S-Ext Mini Router mit integrierten WireGuard Client auf. Das klappt soweit sehr gut. Ein mobiles WLAN mit VPN im Hosentaschenformat.

    Der Tunnel baut sich automatisch bei einer Internetverbindung des Mini Routers auf. So sind alle Clients aus dem WLAN über den Tunnel in das LAN des Raspberry Pis verbunden. Im LAN befindet sich außerdem mein NAS.

    Deine Beschreibung ist sehr verständlich und vollständig, auch für Linux Noobs wie mich. Danke dafür!

    Leider funktioniert die Namesauflösung über den Tunnel nicht. Ich kann also aus dem WLAN des Minirouters nur über IP Adressen auf das NAS im LAN zugreifen.

    Wie könnte man das lösen?
    Ist es möglich den DNS Suffix aus dem LAN in die WireGuard Client config einzubinden?

    Eine weniger schöne Methode wäre das NAS in die hosts Datei einzutragen, was aber auch nur bei Windows anwendbar wäre.

    VG
    Jörg

    • Tobi sagt:

      Hallo Jörg,
      ich denke das Problem liegt am Mini-Router bzw. am eingebauten WireGuard-Client. Kannst du hier explizit einen DNS-Server setzen? Die Geräte die du dann via WLAN mit dem Mini-Router verbindest, nutzen natürlich diesen als DNS-Resolver.
      Du kannst ja testweise dein Smartphone direkt mit dem WireGuard-Server verbinden und schauen, ob die interne Namensauflösung dann funktioniert.
      Viele Grüße Tobias

    • Stefan sagt:

      Hallo Jörg,
      ich versuche schon “ewig”, meinen GL-300-ARM Router von unterwegs über den eingebauten Wireguard-Client mit meinem Raspi-WG-Server zu Hause zu verbinden…
      Obwohl die Weboberfläche vom Router “Success” meldet, läuft der Tunnel nicht…
      Könntest Du mal Deinen Einträge aus dem GL-AR750S posten (natürlich zensiert…)
      Danke!
      Stefan

  2. Claus sagt:

    Hallo Tobi,
    danke für die super Anleitung! Damit habe ich es problemlos geschafft, Wireguard auf meinem Pi 4 einzurichten. Das ganze dann noch auf dem Android Handy mit Tasker gesteuert und mein Handy verbindet sich jedesmal automatisch mit meinem Raspi zu Hause sobald ich das heimische Wlan verlasse.
    Wenn man übrigens Pihole auf demselben Raspi benutzt wie Wireguard, dann muss man in den Pihole Settings noch darauf achten, im DNS Reiter “Listen on all interfaces” zu aktivieren, sonst funktioniert die DNS Auflösung mit Pihole nicht.
    Ich hatte es anfangs auf “Listen only on interface eth0” stehen und da kann er natürlich lange suchen…

    Viele Grüße
    Claus

  3. Thomas sagt:

    Hallo Tobi,
    ich habe einen Wireguard Server auf einer FritzBox installiert. Allerdings sollte mein Problem bei deiner Installation auch auftreten.
    Sobald ich mich mit meinem VPN Client in einem WLAN befinde, das den gleichen IP-Bereich wie mein Zuhause LAN verwendet (z.B. 192.168.178.0/24) klappt zwar die Verbindung, aber nach kurzer Zeit `hängt’ sich die Verbindung auf. Gehe ich z.B. nur über ein Mobil-Verbindung, klappt alles. Ist dir das auch schon einmal aufgefallen?
    Viele Grüße
    Thomas

    • Tobi sagt:

      Ja das Problem kommt daher, dass auf beiden Seiten dasselbe Netz verwendet wird. Daher würde ich bei Inbetriebnahme einer FRITZ!Box immer zuerst das lokale Netz von 192.168.178.0/24 auf etwas anderes ändern.

  4. Thomas sagt:

    Mit deiner Anleitung habe ich eben mal schnell auch auf einem Raspi Wireguard installieren können. Leider habe ich hier das gleiche Verhalten.
    Mit IPSec VPN auf einer FritzBox klappt es ohne Probleme. Keine Ahnung, wo das Problem liegt.
    Vielleicht liegt es doch an der FritzBox, in der ich als Gast eingeloggt bin.

    Gruss Thomas

  5. Thomas sagt:

    Hallo Tobi,
    die Netze sind doch verschieden.
    Hier 192.168.178.0/24
    Zu Hause: 192.168.0.0/24
    Gestern hab ich mich auch über ein anderes WLAN eingewählt und auch das gleiche Verhalten gehabt. Ich vermute nun fast, dass es an meiner Fritzbox zu Hause liegt.
    Ich habe es auch mit 2 verschiedenen Peers versucht, beide das gleiche.
    D.h. Es kommt eine Verbindung zustande, ich kann mich z.B. auch per SSH auf meine Server zu Hause verbinden, kann ein paar Kommandos absetzen und dann bleibt die Verbindung stehen. Die Dauer ist unwichtig, scheinbar nur die Menge an Daten. Ich muss mal in meiner FritzBox suchen, ob ich da irgendeine Einstellung dazu habe.
    Gruss Thomas

  6. Martin sagt:

    Gibt es schon eine Möglichkeit mit der Android App WLANs auszuschließen?

    Sprich: “Wann man in WLAN xy ist, dann kein VPN an machen.”

  7. Holger PRang sagt:

    Hallo Tobias,

    großes Kompliment – die erste Anleitung, bei der es für mich auf Anhieb funktionierte!
    Habe zahlreiche Vorschläge ausprobiert, bisher scheiterten alle irgendwo an “Unverträglichkeiten” im Zusammenspiel der Pakete mit dem OS.

    Viele Grüße
    Holger

  8. Andreas sagt:

    Danke erstmal für die super Anleitung

    Ist es eigentlich möglich vom Handy auf den PI mit ipv6 zu verbinden und dann über Wireguard auf ein ipv4 Gerät im Netzwerk zuzugreifen?

    (für die DS lite geplagten unter uns)

  9. Martin sagt:

    Hallo Tobi,
    vielen Dank für die tolle Anleitung. Ich habe mein Smartphone auf Anhieb als Client einrichten können. Der Zugriff auf den Server klappt aus dem W-Lan und mobil.
    Ich habe noch nicht genau verstanden, wie ich Konfig-Dateien für weitere Geräte erstelle. Kannst Du mir hierzu nochmal genauer sagen, wie das geht?

    Vielen Dank!
    Martin

    • Tobi sagt:

      Das ist eigentlich ganz simpel. Zuerst musst du ein neues Schlüsselpaar für den zweiten Client erstellen.

      Dann in der Server-Config folgendes einfügen:
      #Client2
      [Peer]
      PublicKey =
      AllowedIPs = 100.64.0.3/32

      Die Client-Config kannst du dann kopieren und lediglich die IP und den neuen privaten Schlüssel eintragen.

  10. Torsten Schöne sagt:

    Hallo Tobi,

    zunächst einmal vielen Dank für den tollen Artikel. Ich würde gerne einen IPV6 Tunnel implementieren, über den sich Smartphones, Tablets und auch PCs mit meinem Heimnetzwerk verbinden können. Du gibst ja auch einmal einen Hinweis zu IPV6, den ich bereits umgesetzt habe. Leider weiß ich an den folgenden Stellen, bei denen IPV4 Adressen auftauchen, nicht was da dann bzgl. IPV6 zu beachten ist. Könntest Du mir da eine Hilfestellung geben?

    Das wäre toll!

    Schon jetzt vielen Dank für Deine Antwort!

    Viele Grüße

    Torsten Schöne

    • Tobi sagt:

      Nicht konkret, da ich aktuell kein IPv6 fahre und daher nicht testen kann.
      Grundsätzlich aber einfach bei jeder IPv4-Adresse die IPv6 zusätzlich oder anstatt von IPv4 eintragen. An welchen Stellen genau kommst du nicht weiter?

  11. Andreas sagt:

    Hallo und schönen Sonntag.
    Also bei mir läuft jetzt Wireguard auf dem Pi4B, zusammen mit Pi-Hole, Unbound und Hyperlocal. Die wechselnde öffentliche IP läuft über domain connect dyndns und wird jede Minute auf Änderungen geprüft. Mein Smartphone läuft nun 24/7 über VPN. Soweit auch alles super, bis zu dem Zeitpunkt, wo durch die (Zwangs)Trennung am Router eine neue öffentliche IP vergeben wird. Dann ist meine Verbindung weg. Ich habe auch schon getestet, den Pi in dem Fall neu zu starten, aber ohne Erfolg. Ich muss dann einmal manuell am Smartphone den Tunnel kurz deaktivieren und dann wieder aktivieren. Ist natürlich ärgerlich, wenn man erst nach einer Stunde das Problem bemerkt. Gibt es da nicht eine Möglichkeit per Script bei einer Änderung den Clienten zu trennen und wieder zu verbinden? Sicherlich könnte man es ja mit Tasker lösen, aber wenn es anders funktioniert, ohne zusätzliche Apps, wäre das natürlich angenehmer. Gruß Andreas

    • Tobi sagt:

      Tasker wäre meine erste Anlaufstelle gewesen. Zumindest ich nutze Tasker sowieso, umden WireGuard Tunnel aufzubauen, sobald ich aus dem heimischen WLAN disconnected bin.
      Wenn du dein Smartphone nachts in den Flugmodus versetzt und in dieser Zeit die Zwangstrennung stattfindet, dann sollte sich das Problem von selbst lösen.

    • Andreas sagt:

      Ich habe mich jetzt auch für Tasker entschieden, wobei ich nun festgestellt habe, dass unter der normalen WLAN-Verbindung Pi-Hole nicht blockiert. Ich habe im Router DHCP ausgestellt und in Pi-Hole aktiviert. Wenn ich über den Tunnel zugreife, läuft alles perfekt.

    • Michael sagt:

      Ich habe das gleiche Problem: Pi4B, Pi-Hole. Verbindung allerdings nicht über dyndns sondern myfritz.

      Der nächtliche Flugmodus ändert am Problem nichts: mittels “Bixby Routines” (das ist der abgespeckte Samsung-“Tasker”) geht das Handy nachts in Flugmodus.

      Morgens ist WLAN an und Wireguard scheinbar auch verbunden. Aber erst, wenn ich die Wireguard-Verbindung kurz aus- und wieder einschalte trudeln die Nachrichten ein.

      Letzte Nacht ein Test ohne Flugmodus: Pi-Hole meldet um 3:12 Uhr die letzte DNS-Anfrage, kurz danach trennt die FritzBox die Internetverbindung kurz, “um der Zwangstrennung durch den Provider zuvorzukommen”.

      Gibt es hier eine Lösung, oder nur den Workaround mit Tasker?

  12. Roman sagt:

    Hi Tobi,

    Danke für die tolle Anleitung. Hab mich soweit alles eingerichtet und die Wireguard App auf dem Iphoen installiert und über den QR Code die Config gezogen. Jetzt sieht es so aus als ob sich das iphone verbindet, tut es aber wohl nicht. Im Log der wireguard app kommt immer sending handshake und dann handshake did not complete aftere 5 seconds, retryinig.

    Eine Ideee woran das liegen könnte?

  13. Roman sagt:

    hat sich erledigt, ein sudo systemctl start wg-quick@wg0 hat das Problem behoben.

    Danke nochmal

  14. Amiga500 sagt:

    Gude Tobi.
    Wollt mich nur kurz für die Anleitung bedanken. Echt super easy, hat alles top gefunzt!!

    Gruß
    Amiga500

  15. Gerrit sagt:

    Hey Tobi,

    danke für das Tutorial, läuft auch. Aber bei folgenden befehlen:
    sudo chown -R root:root /etc/wireguard/
    sudo chmod -R og-rwx /etc/wireguard/*

    bekomme ich als Rückantwort:
    chmod: cannot access ‘/etc/wireguard/*’: No such file or directory

    Kann man das vernachlässigen, oder hast du eine Lösung parat?

    Danke

    • Tobi sagt:

      D.h. “sudo chown -R root:root /etc/wireguard/” hat noch funktioniert und der nächste Befehl gab dann den Fehler? Probier mal “sudo chmod -R og-rwx /etc/wireguard/” ohne *.

  16. Gerrit sagt:

    Ohne * hat es geklappt, danke. Hast du noch ein Tipp, wie man einen 2.ten Clienten zufügt?

    • Tobi sagt:

      Super!
      Ja bei einem zweiten Client sind es die gleichen Schritte wie beim ersten:
      1. Schlüsselpaar erstellen.
      2. Client 2 mit Public Key und IP in die “wg0.conf” eintragen.
      3. WireGuard neustarten
      4. Client Konfiguration für den zweiten Client erstellen
      5. Client Konfiguration auf zweiten Client einspielen

  17. Mark sagt:

    Hi Tobi,

    vielen Dank für das Tutorial! Die Einrichtung hat geklappt.Ich habe jedoch ein Problemchen…
    Ich kann ein Tunnel aufbauen, mir zeigt es den verbundenen Client an, ping-Abfrage funktioniert ebenfalls. Ich kann aber weder Webseiten aufrufen noch Geräte in meinem Netzwerk. Ich kann mir das nicht erklären.
    Habe Ubunt 20.04 auf einer Diskstation im Virtual Machine Manager laufen, denke aber nicht, das das ein Problem ist.

    • Mark sagt:

      Ich habe noch AdGuard in verdacht (DNS) sehe aber den Wald vor lauer Bäumen nicht mehr

    • Tobi sagt:

      Hi Mark,
      kenne den Virtual Machine Manager nicht, aber wenn Ubuntu nicht via NAT, also bridged im Netzwerk hängt, dann ist das kein Problem.
      Höchstens die Firewall auf Ubuntu könnte noch Probleme machen. Eventuell brauchst du hier andere iptables-Befehle. Meine Anleitung ist explizit für das Raspberry Pi OS, such mal nach ner Anleitung für Ubuntu.

  18. Iwi sagt:

    Hallo Tobi,

    vielen Dank für die verständliche Anleitung. Ich hab das auf einem Raspberry 3B installiert, allerdings funktioniert das Ganze nicht so richtig.
    Wenn das wg-interface auf dem Raspi gestartet ist, kommt der Raspi selbst nicht mehr ins Internet. Die Client-Verbindung funktioniert aber und der Client kommt auch über diese Verbindung ins Internet. Dafür kann aber der Client sein eigenes Netz nicht mehr erreichen.

    Hast du dafür eine Erklärung?

  19. Mech sagt:

    Hi
    ich kämpfe wireguard auf bullseye zum laufen zu bekommen. Wie oben beschrieben ende ich nach sudo wg-quick up wg0 mit folgender Fehlermeldung:

    [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    /usr/bin/wg-quick: line 295: iptables: command not found
    [#] ip link delete dev wg0

    und sudo wg funktioniert zum prüfen funktioniert danach nicht.

    • Tobi sagt:

      Hast du auf Bullseye aktualisiert oder neu installiert?
      Was passiert wenn du “sudo iptables” ausführst?

    • Mech sagt:

      Hi,
      erst einmal vielen Dank für die Antwort. Ist eine Neuinstallation von Bullseye auf einer neuen Karte. Das ich die iptables separat installieren muss war mir nicht klar. War bei Buster zumindest nicht so.
      Soweit so gut. Nun scheint alles zu funktionieren. Wie kann ich schauen ob Autostart von wireguard funktioniert.
      beim herein kopieren von:
      sudo systemctl enable wg-quick@wg0
      Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.

      bekomme ich nur -bash: Created: command not found zu sehen.
      Was mache ich da falsch?

    • Tobi sagt:

      Probier mal “sudo systemctl enable wg-quick@wg0.service“.

    • Mech sagt:

      Das wars. Vielen Dank.

    • Saho1 sagt:

      @Tobi: Unter Bullseye ist iptables nicht mehr im Standardpaket und muß mit apt install nachinstalliert werden. Ggf kannst du in deinem Tutorial noch einen Hinweis darauf einbauen um weitere Nachfragen zu vermeiden ;)

  20. Dieter sagt:

    Hallo Tobi,

    vielen Dank für die sehr klare und umfangreiche Anleitung. Ich habe alle Schritte gut nachvollziehen können. Allerdings scheitere ich ganz am Ende beim Starten des Servers. Folgende Ausgabe bekomme ich dort:

    [#] ip link add wg0 type wireguard
    [#] wg setconf wg0 /dev/fd/63
    [#] ip -4 address add 100.64.0.1/24 dev wg0
    [#] ip link set mtu 1420 up dev wg0
    [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    /usr/bin/wg-quick: line 295: iptables: command not found
    [#] ip link delete dev wg0

    Hast du einen Rat, was da falsch läuft? Ich habe das aktuelle Raspi Image verwendet, auf dem auch ein Pihole installiert ist.

    • Mech sagt:

      Hi
      hatte (erster Post über dir) das gleiche Problem. IPTables muss installiert werden / sein. Versuche “sudo apt-get install iptables”

  21. Ralf sagt:

    Hallo

    @Mech Danke das war es. Hatte auch den Fehler mit der Line 295

    Wäre Super wenn das mit oben aufgenommen würde. Das war der erste Ablauf mit dem ich klargekommen bin und der funktionierte.

    Danke

  22. Wolfgang Thomanek sagt:

    Hallo Tobi,
    tolle Anleitung. Vielen Dank dafür.
    Ich weiß nur nicht genau, was ich in der Konfiguration eintragen muss.

    Ich habe einen Raspberry Pi 3 mit einem LTE-Stick Huawei E3372 und einer SIM-Karte von Vodafone. Über den Stick komme ich ins Internet.

    Nun möchte ich mich aber über einem externen Windows-Rechner per VPN mit dem Raspberry Pi verbinden. Die öffentliche IP-Adresse habe ich mittels http://www.whatismyipadress.com ermittelt.

    Da sich die öffentliche IP-Adresse täglich ändert, habe ich ein DnyDNS-Account bei https://account.dyn.com/ eingerichtet. Die Namensauflösung funktioniert auch einwandfrei.

    Was genau muss ich nun in den Konfigurationsdateien eintragen. Leider habe ich keine FritzBox.

    VG Wolfgang

    • Tobi sagt:

      Hallo Wolfgang,

      zuerst einmal müsstest du prüfen, ob die LTE-IP von Vodafone überhaupt vom PC aus erreichbar ist. Eine kurze Suche meinerseits ergab, dass es da durchaus Probleme geben könnte: https://forum.vodafone.de/t5/Archiv-LTE/LTE-%C3%B6ffentliche-IP-freischalten/td-p/2094370

      Anschließend musst du die Konfigs für “Server” (Raspberry Pi) und Client (Windows PC) anlegen und die vorhandenen Daten eintragen. Hier habe ich eigentlich alle wichtigen Zeilen im Artikel beschrieben.
      An welcher Stelle hast du denn genau Probleme?

      Viele Grüße
      Tobi

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert