WireGuard VPN Server einrichten (Ubuntu, Raspberry Pi, Linux, Android)

20 Kommentare Autor: Jürgen (jdo)

WireGuard wird offiziell in den Linux Kernel 5.6 einfließen. Ubuntu 20.04 LTS Focal Fossa setzt den Kernel nicht bei Veröffentlichung ein, implementiert das schlanke VPN-Protokoll WireGuard aber trotzdem per Standard. Das sind tolle Neuigkeiten. Bisher war eine Installation des Protokolls unter Ubuntu aber auch schon einfach, da es ein PPA gibt. Außerdem ist es seit Ubuntu 19.10 im Universe Repo. Da der Zugriff auf das VPN-Protokoll so einfach ist, zeige ich Dir, wie Du selbst einen WireGuard VPN Server aufsetzt und Dich mit Linux und Android als Client verbindest. Ich zeige Dir die Installation zuerst auf einem VPS mit Ubuntu 18.04 und dann auf einem Raspberry Pi mit Raspbian.

Konfiguration ist erstaunlich einfach!
Vielleicht sieht es auf den ersten Blick nicht so aus, aber die Installation und Konfiguration eines WireGuard VPN Servers ist verglichen mit den bestehenden Alternativen relativ einfach. Du kannst das auch im internen Netzwerk testen, wenn Du möchtest. Dem VPN ist es egal, ob der Tunnel im LAN oder via Internet etabliert wird. Du brauchst lediglich einen Linux-Rechner als Server und einen Client und kannst ebenfalls testen.

Im Schnelldurchlauf sieht die Einrichtung des WireGuard VPN Servers so aus:

  • WireGuard auf dem Gerät installieren, das als Server dient
  • IP-Forwarding auf dem Server aktivieren
  • Schlüsselpaar auf dem Server erstellen
  • WireGuard-Schnittstelle aktivieren
  • Software auf dem Client installieren
  • Schlüsselpaar auf dem Client erstellen
  • Auf dem Server eine Einwahl des Clients gestatten
  • Auf dem Client die VPN-Verbindung aktivieren

Gehen wir die Sache an? Schritt für Schritt mit Ubuntu und Raspbian auf einem Raspberry Pi als Server.

Die Voraussetzungen für meinen WireGuard VPN Server

Du wirst mir zustimmen, dass es sehr viele Kombinationen aus Clients und Servern gibt. Deswegen muss ich mich auf Setups beschränken, die für die meisten aber realisierbar sind.

  • Mein WireGuard VPN Server ist ein VPS (Virtual Private Server) von Contabo. Den günstigsten gibt es ab 3,99 € im Monat. Das ist mein Einwahlknoten, auf den ich root-Zugriff habe. Ich zeige Dir aber auch, wie Du einen Raspberry Pi als WireGuard VPN Server nutzen kannst.
  • Ein Client wird ein aktuelles Linux Mint sein. Die Installation unter Ubuntu ist gleich. Die Befehle sind für alle Linux-Distributionen gleich, die WireGuard installieren können. Das gilt auch für den Raspberry Pi.
  • Mein anderer Client ist mein Smartphone, auf dem Android läuft.
  • Die Einrichtung ist für jeden Client sehr ähnlich. Besuche den Installations-Bereich der Entwickler und Du findest viele Anweisungen und Download-Links für unter anderem Windows, macOS, Fedora, Red Hat Enterprise Linux, openSUSE, Arch, FreeBSD und so weiter.
  • Bei den Clients gebe ich Dir am Schluss noch einen Tipp, wie Du Deine Verbindung gleich mit einem Ad- und Tracker-Blocker versiehst.
Viele Wege führen nach Rom
Unter Linux gibt es viele verschiedenen Wege, die zum gleichen Ergebnis führen. Ich zeige Dir hier eine Option. Bist Du andere Tools und Wege gewohnt, dann passe die Anleitung einfach an.

WireGuard unter Ubuntu installieren

Bei Ubuntu und den Derivaten wie Linux Mint kommt es darauf, welche Version Du hast. Ab Ubuntu 19.10 reicht ein einfaches:

sudo apt install wireguard

Da ich auf meinem VPS aber nur LTS-Versionen betreibe, muss ich das PPA nehmen, das die Entwickler zur Verfügung stellen. Sehr viel komplizierter ist das aber auch nicht. Dann wird aus einem Befehl eben ein Dreisprung (unter Ubuntu 18.04 kannst Du Dir den zweiten Schritt sparen):

sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard

Keine zusätzliche Software für Server oder Client notwendig

Ich wollte an dieser Stelle noch darauf hinweisen, dass Du hier keine spezielle Software für Server oder Client installieren musst. Sobald WireGuard installiert ist, kannst Du damit aus jedem Gerät einen Einwahlknoten machen. Bei OpenVPN brauchst Du ja eine Server-Software, die extra installiert und konfiguriert werden muss. Hier unterscheidet sich also die Server- von der Client-Software. Das ist bei WireGuard nicht der Fall.

Sobald die Software installiert ist, kannst Du mit den hier gezeigten Befehlen anderen Rechnern erlauben, den Tunnel zu etablieren.

WireGuard auf einem Raspberry Pi installieren

Möchtest Du einen Raspberry Pi (2 Version 1.2 und höher) als Einwahlpunkt wählen, ist etwas mehr Handarbeit notwendig. Kompliziert ist es aber nicht. Die Anleitung auf der Projektseite nutzt nur teilweise, weil sie wichtige Schritte verschweigt. Ich zeige Dir, wie Du WireGuard unter Raspbian Buster zu Laufen bekommst. Stretch lasse ich aus. Ich führe alle Befehle als root aus. Stelle zunächst sicher, dass sich Dein Raspbian auf dem neuesten Stand befindet:

apt update
apt upgrade

Im Anschluss müssen wir die Kernel Headers installieren:

apt install raspberrypi-kernel-headers

Die nächsten 4 Schritte können wir aus der Installationsanleitung der WireGuard-Entwickler für Debian entnehmen, plus einem kleinen Zwischenschritt. Der dritte Befehl importiert eine Signatur für ein Debian-Archiv. Ohne diesen Schritt fällt das Update auf die Nase: 

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list 
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC
apt update
apt install wireguard

Damit ist das VPN-Protokoll installiert. Aktivieren wir nun gleich das sogenannte IP Forwarding, weil wir es brauchen.

Forwarding unter Ubuntu und Raspbian aktivieren

Das IP Forwarding sorgt einfach gesagt dafür, dass alle Pakete weitergeleitet werden, die an der WireGuard-Schnittstelle aufschlagen. Sowohl bei Ubuntu als auch bei Raspbian editierst Du dafür am einfachsten die Datei /etc/sysctl.conf. Die relevanten Einträge sind schon in der Datei, Du musst nur das Kommentarzeichen wegnehmen – also das Doppelkreuz am Anfang der Zeile entfernen.

IP Forwarding muss auskommentiert werden
IP Forwarding muss auskommentiert werden

Ist Dir das Suchen zu doof, kannst Du am Ende der Datei auch diese beide Zeilen einfügen:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Speichere die Datei im Anschluss. Danach startest Du das System neu oder Du aktivierst die Konfiguration mittels:

sysctl -p

Du kannst auch überprüfen, ob IP Forwarding aktiviert ist:

sysctl net.ipv4.ip_forward
Neue Konfiguration aktivieren
Neue Konfiguration aktivieren

Hinweis: Bei älteren Pi-Versionen und einem Raspberry Pi Zero W müsstest Du selbst kompilieren. Ist nicht kompliziert, eine Anleitung gibt es hier.

Schlüssel auf dem WireGuard VPN Server erzeugen

Das VPN-Protokoll funktioniert ähnlich wie bei SSH mit dem Austausch von Schlüsseln. Es gibt also einen privaten Schlüssel und einen öffentlichen Schlüssel. Der private ist streng geheim und den öffentlichen geben wir weiter. Das Prinzip ist ja hinlänglich bekannt. Diese Schlüssel müssen wir aber zunächst erzeugen (als root):

cd /etc/wireguard
umask 077
wg genkey | sudo tee privatekey | wg pubkey | sudo tee pubkey

Nun hast Du im Verzeichnis /etc/wireguard zwei Dateien, die sich privatekey und publickey nennen.

privatekey und publickey – privater und öffentlicher Schlüssel
privatekey und publickey – privater und öffentlicher Schlüssel

Mehr musst Du an dieser Stelle bei den Schlüsseln zunächst nicht tun. Zur Sicherheit kannst Du die Datei privatekey auch wirklich absichern:

chmod 600 /etc/wireguard/privatekey

Bei mir wäre das nicht nötig, wie Du im Screenshot oben siehst, aber sicher ist sicher – schaden tut es nicht.

Konfiguration des Einwahlknotens

Nun geht es ans Eingemachte. Wir müssen eine Netzwerkschnittstelle erzeugen, die den gesamten Datenverkehr routet. Das erste Netzwerk-Interface für diesen Zweck wird normalerweise wg0 genannt, das muss aber nicht so sein. Du kannst es taufen, wie Du willst. Ich halte mich aber hier an diesen Quasi-Standard, um die Einrichtung nicht unnötig zu verkomplizieren.

Die Schnittstelle wg0 dient als Router. Deswegen brauchen wir noch ein Subnetz für unser VPN-Netzwerk. Das Netzwerk sollte sich mit Deinem eigentlichen Netzwerk nicht in die Quere kommen. Die IP-Adressen sollten unterschiedlich sein. Ist das nicht der Fall, kommt es zu Konflikten und im schlimmsten Fall funktioniert die Sache gar nicht. Ich nehme deswegen ein Netzwerk, das die meisten wohl so nicht im Einsatz haben dürften (aber das ist nur ein Beispiel!): 192.168.206.1/24. Damit bekomme ich die IP-Adressen von 192.168.206.1 bis 192.168.206.254. Das reicht mir erst einmal.

Da wir die Schnittstelle wg0 taufen, erstellen wir die dazu passende Konfigurationsdaten /etc/wireguard/wg0.conf. Ich erkläre anschließend die wichtigsten Zeilen.

[Interface]
PrivateKey = <Dein privater Schlüssel>
Address = 192.168.206.1/24
Address = fddc:980e:a378:05c2::/64
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens18 -j MASQUERADE; iptables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens18 -j MASQUERADE; iptables -D FORWARD -o %i -j ACCEPT
ListenPort = 51820

Die Begriffe kurz erklärt

Den PrivateKey entnimmst Du der Datei /etc/wireguard/privatekey, die Du vorher erstellt hast. Der Inhalt kommt hinter das = und zwar ohne die Klammern.

Addresse für IPv4 sollte klar sein und ich habe den Bereich bereits erklärt. Zu IPv6 möchte ich anmerken, dass Du an dieser Stelle eine ULA (Unique Local Address) verwenden solltest. Auch wenn der IPv6-Bereich riesig ist, sollten diese ULAs nicht über das Internet geroutet werden (RFC4193). Die Möglichkeiten an dieser Stelle sind irre hoch. Ich habe mir einfach mithilfe dieser Website zufällig einen privaten Adress-Bereich erstellen lassen. Du kannst IPv6 aber auch weglassen, wenn Du es nicht benutzen willst.

PostUp und PostDown sorgen dafür, dass die beim Aktivieren oder Deaktivieren der Schnittstelle wg0 die entsprechenden Routing-Einträge gesetzt werden. Wichtig an dieser Stelle ist, dass Du Deine Netzwerkschnittstelle herausfindest, über die geroutet werden soll oder die Dein Gateway ins Internet wird. Bei meinem Ubuntu VPS ist das ens18. Auf dem Raspberry Pi ist es eth0. Du findest die Schnittstelle mit dem Befehl

ip a

heraus. Das sieht so aus und Du musst es für Deine Konfiguration anpassen:

Bei meinem Ubuntu VPS ist die Netzwerkschnittstelle ens18 das Tor zum Internet für den WireGuard VPN Server
Bei meinem Ubuntu VPS ist die Netzwerkschnittstelle ens18 das Tor zum Internet für den WireGuard VPN Server

Den ListenPort kannst Du Dir selbst aussuchen. 51820 ist der Standard, aber hier kannst Du wählen, was Du möchtest. Solltest Du eine Firewall im Einsatz haben, stelle sicher, dass der Port auch erreichbar ist. Benutzt Du zum Beispiel ufw, dann hilft möglicherweise nachfolgender Befehl bei Problemen:

ufw allow 51820/udp

Nun sichern wir die Datei noch ab:

chmod 600 /etc/wireguard/wg0.conf

WireGuard-Schnittstelle starten

Ist die Konfigurations-Datei erstellt, können wir die VPN-Schnittstelle auf dem Server (Ubuntu oder Raspberry Pi) starten:

wg-quick up wg0

Nach dem up folgt der Name Deiner Konfiguration. Einfach ausgedrückt ist es der Name der Datei ohne das .conf – in meinem Fall also wg0.

Jetzt überprüfen wir noch, ob die Schnittstelle auch gestartet ist:

wg

Das hat geklappt.

Die Schnittstelle wg0 ist aktiviert
Die Schnittstelle wg0 ist aktiviert

Du kannst die Verbindung auch automatisch starten lassen. Ich erkläre weiter unten in den zusätzlichen Tipps, wie das funktioniert.

Clients konfigurieren (Android / Linux)

Hier kommt es darauf an, welchen Client Du mittels WireGuard verbinden möchtest. Ich erkläre zwei Szenarien und die anderen lassen sich relativ einfach davon ableiten. Zuerst konfiguriere ich ein Android-Gerät, damit es sich mit dem WireGuard-VPN-Server verbindet. Im Anschluss zeige ich Dir, wie Du Deinen Linux-Client (funktioniert für alle Linux-Clients gleich) verbindest.

Für Android lädst Du Dir aus dem Google Play Store oder von F-Droid die entsprechende Software herunter. Öffne sie und klicke rechts unten auf das Plus-Zeichen. Erstelle eine neue Verbindung, indem Du Create from scratch wählst. Es öffnet sich eine Maske und die müssen wir ausfüllen:

  • Name: kannst Du frei wählen
  • Private key und Public key erstellst Du, indem Du auf Generate klickst.
  • Adresses: das ist die IP-Adresse, die das Gerät im VPN-Netzwerk erhalten soll. Mein Server hat 192.168.206.1 und mein Client bekommt 192.168.206.2/32.
  • DNS servers kannst Du nehmen, welche Du eben gerne verwenden willst. Hier nun der versprochene Tipp, wie Du mit dem VPN gleich einen Adblocker bekommst. Trage hier das öffentliche Pi-hole von adminforge.de ein: 176.9.93.198, 176.9.1.117, 2a01:4f8:151:34aa::198, 2a01:4f8:141:316d::117.

Peer hinzufügen

Im Anschluss klickst Du auf ADD PEER und dort trägst Du die Daten Deines Einwahlknotens ein:

  • Public key: Der öffentliche Schlüssel aus der Datei /etc/wireguard/publickey Deines Servers oder des Raspberry Pi.
  • Allowed IPs: 0.0.0.0/0, ::/0 (das bedeutet, dass sämtlicher Traffic über das VPN geroutet wird)
  • Endpoint: die öffentliche IP-Adresse Deines Servers, gefolgt von :Port also in meinem Fall :51820. Es funktioniert auch der Domain-Name und das ist wichtig, wenn Dein Raspberry Pi via DDNS erreichbar ist.

Bei mir sieht das so aus (ich benutze sogar einen Domain-Namen und keine IP-Adresse).

WireGuard-Konfiguration unter Android
WireGuard-Konfiguration unter Android

In meinem Screenshot siehst Du auch, dass es 1 EXCLUDED APPLICATION gibt. Hier kannst Du Apps hinterlegen, die nicht über das VPN laufen sollen. Bei mir ist das die Kodi-Fernbedienung Kore, weil ich sonst meine Musik bei einer Verbindung zum WireGuard VPN Server nicht mehr steuern kann. 🙂

Dem Client die Einwahl auf dem Server erlauben

Nun geht es zurück zum Server und ich brauche den öffentlichen Schlüssel des Clients. Wie Du im Screenshot oben siehst, fängt der bei mir mit LQ8Z an. Dort gestattest Du, dass sich der Client verbinden darf:

wg set wg0 peer <öffentlicher Schlüssel des Clients> allowed-ips 192.168.206.2/32

Jetzt kannst Du Dein Android-Gerät verbinden. Rufst Du nun den Befehl wg wieder auf, dann sollte so etwas in der Art herauskommen.

Mein Android Client ist mit dem WireGuard VPN Server verbunden
Mein Android Client ist mit dem WireGuard VPN Server verbunden

Linux mit dem WireGuard VPN Server verbinden

Ich habe mein InfinityBook mit Linux Mint 19.3 verbunden, aber die Konfiguration funktioniert für eigentlich alle Linux-Distributionen gleich. Das Prinzip ist sogar für alle Betriebssysteme äquivalent. Zunächst einmal musst Du WireGuard wieder wie oben beschrieben installieren. In meinem Fall sehr einfach, da ich das PPA verwenden kann.

Danach muss ich wieder ein Schlüsselpaar erstellen. Das funktioniert auf dem Client genauso wie auf dem Server:

cd /etc/wireguard
umask 077
wg genkey | sudo tee privatekey | wg pubkey| sudo tee pubkey

Im Anschluss erstelle ich eine Konfigurations-Datei (ich nenne sie, damit es klar ist wgclient0.conf) mit den entsprechenden Werten. Mein zweiter Client soll die IP-Adresse 192.168.206.3/32 bekommen. Meine Datei sieht wie folgt aus (wieder mit dem öffentlichen Pi-hole von adminforge.de):

[Interface]
PrivateKey = <Dein privater Schlüssel>
Address = 192.168.206.3/32
DNS = 176.9.93.198, 176.9.1.117, 2a01:4f8:151:34aa::198, 2a01:4f8:141:316d::117

[Peer]
PublicKey = <Öffentlicher Schlüssel des Servers>
Endpoint = <Server-IP oder Domain>:51820
AllowedIPs = 0.0.0.0/0, ::/0

Wie beim Android Client auch passt Du Port 51820 an und bei den DNS-Servern hast Du auch freie Wahl.

Im Anschluss erlaubst Du auf dem Server, dass sich der neue Client verbinden darf. Also in der Art:

wg set wg0 peer <öffentlicher Schlüssel des Clients> allowed-ips 192.168.206.3/32

Danach kannst Du die Verbindung starten. Wie gehabt ist das der Name der Verbindung ohne das .conf am Ende und wir benutzen wieder den Befehl wg-quick (beim Client):

wg-quick up wgclient0

Tipp: gibt es hier eine Fehlermeldung /usr/bin/wg-quick: line 31: resolvconf: command not found, dann hilft unter Ubuntu / Debian:

ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf

Nun sind sowohl mein Smartphone als auch mein Linux-Rechner mit dem WireGuard VPN Server verbunden:

Nun sind 2 Clients (Linux und Android Smartphone) mit dem WireGuard VPN Server verbunden
Nun sind 2 Clients (Linux und Android Smartphone) mit dem WireGuard VPN Server verbunden

Willst Du die Verbindung trennen, nimmst Du folgenden Befehl:

wg-quick down wgclient0

Es ist wirklich so einfach. Ist das Ding erst eingerichtet, bist Du im Bruchteil einer Sekunde verbunden und der VPN-Tunnel ist etabliert.

Möglicher Bug: ich weiß nicht warum, aber unter Linux löscht mir der Befehl wg-quick down die DNS-Server aus der Konfigurationsdatei, wenn sich darin die Zeile SaveConfig = true befindet.

Einige zusätzliche Tipps und Tricks zum WireGuard VPN Server

Hier noch eine Sektion mit Problemen und Lösungen, die mir bei der eigenen Benutzung aufgefallen sind. Früher oder später könntest Du ebenfalls darauf stoßen – vor allen Dingen, wenn sich ein neuer Kernel installiert oder Linux entsprechend aktualisiert wird.

Ebenfalls kann ein Blick in die sogenannte manpage nicht schaden: man wq-quick

Autostart der Netzwerk-Schnittstelle auf dem WireGuard VPN Server

Der Start der WireGuard-Schnittstelle überlebt keinen Neustart. Du musst aber nicht jedes Mal manuell konfigurieren, wenn Du das nicht möchtest. Unter Ubuntu und Raspbian können wir die wg-Schnittstellen bei Systemstart aktivieren:

systemctl enable wg-quick@wg0

Auf meinem Linux-Client funktioniert das natürlich auch, aber hier müsste ich in meinem Fall den Befehl anpassen, da die Konfigurations-Datei anders heißt – Du erinnerst Dich:

systemctl enable wg-quick@wgclient0

An dieser Stelle kommt es eben darauf an, wie Du Deine Konfigurations-Dateien und damit die Schnittstellen genannt hast.

WireGuard ist Roaming-fähig

Die Verbindung zum WireGuard VPN Server bleibt auch dann bestehen, wenn Du Netzwerke wechselst. Gehst Du mit Deinem Android Smartphone zum Beispiel aus dem heimischen WLAN und Deine mobile Internet-Verbindung aktiviert sich, bleibt das VPN weiterhin aktiv.

Du kannst bei neueren Android-Versionen in den Einstellungen über Netzwerk & Internet -> VPN WireGuard auch als Durchgehend aktives VPN einstellen. Eine weitere Option dort ist Verbindungen ohne VPN blockieren, was einem Kill-Switch gleichkommt.

Durchgehend aktives VPN und Kill-Switch – dauerhafte Verbindung zum WireGuard VPN Server
Durchgehend aktives VPN und Kill-Switch – dauerhafte Verbindung zum WireGuard VPN Server

Ist Verbindungen ohne VPN blockieren aktiv, überschreibt das übrigens die Option EXCLUDED in der App. Kann man sich merken.

User Management Script für den WireGuard VPN Server

Es gibt auf GitHub ein WireGuard User Management Script, mit dem Du Anwender auf dem Server hinzufügen und Konfigurations-Dateien erstellen kannst. Handelt es sich nur um ein paar Clients, ist das vielleicht etwas übertrieben.

Ganz nett an dem Script ist aber, dass es auch gleich einen QR-Code erstellt. Damit ist die Einrichtung auf Mobilgeräten einfacher, da der Android-Client zum Beispiel QR-Codes einlesen und verarbeiten kann.

Kann man sich ja merken, dass es so etwas gibt.

Für jemanden anderes eine Konfigurations-Datei erstellen

Du kannst natürlich auch für jemanden anderes eine Konfigurations-Datei erstellen. Die Dateien privatekey und publickey müssen nicht im Verzeichnis /etc/wireguard angelegt oder dort aufgehoben werden. Da liegen sie halt gut, weil das Verzeichnis an sich geschützt sein sollte.

Du kannst das Schlüsselpaar aber auch für jemanden anderes anlegen, eine Konfigurations-Datei erstellen und sie verschicken. Die Android App des VPNs hat sogar eine Option, solche .conf-Dateien importieren zu können.

Es wird vermutlich auch nicht mehr lange dauern, bis das GUI des Network Managers unter Linux solche Dateien importieren kann. Die CLI-Version kann bereits mit WireGuard umgehen.

Bei neuem Linux-Kernel beachten!

WireGuard ist ein Kernel-Modul, das via DKMS automatisch installiert wird, sobald das System einen neuen Kernel benutzt. Sollte es sich nicht automatisch einbinden, gibt mehrere Optionen, wie Du das Problem beheben kannst.

Ob das Modul geladen ist, findest Du mit diesem Befehl heraus:

lsmod | grep wireguard

Ist das Ergebnis leer, versuche es mit modprobe:

modprobe wireguard

Danach sollte das Kernel-Modul eigentlich geladen sein. Ich hatte gerade das Problem, dass sich der Kernel aktualisiert hat und WireGuard ist danach erst einmal nicht mehr gelaufen.

Kernel-Modul auf dem WireGuard VPN Server laden
Kernel-Modul auf dem WireGuard VPN Server laden

Sollten diese Methoden nicht funktionieren, kannst Du immer noch mit dpkg-reconfigure das Kernel-Modul neu konfigurieren:

sudo dpkg-reconfigure wireguard-dkms

Modprobe hat sich bei mir nur als temporäre Lösung herausgestellt. Einen Neustart hat es nicht überlebt. Deswegen nehme ich normalerweise den Ansatz mit dpkg-reconfigure. Damit lädt sich das WireGuard-Kernel-Modul auch nach einem Neustart automatisch.

Du kannst das System auch überreden, das Modul grundsätzlich bei einem Neustart zu laden. Editiere dafür die Datei /etc/modules und füge wireguard ein.

Lange Rede … das Modul muss laufen, sonst klappt es nicht. Wie Du es zum Laufen bringst, ist egal. 🙂

Ist Dein WireGuard VPN Server hinter einem NAT Router?

Setzt Du auf eine Eigenlösung mit einem Raspberry Pi hinter Deinem Heimrouter? Dann stelle sicher, dass der notwendige Port durchgeleitet wird. In meinem Fall müsste ich Port 51820 freigeben.

Es ist im Prinzip das gleiche Problem als, wenn Du eine Nextcloud im Wohnzimmer hast und willst sie aus dem Internet erreichen.

WireGuard VPN Server auf dem Raspberry Pi aus dem Internet erreichen
WireGuard VPN Server auf dem Raspberry Pi aus dem Internet erreichen

Kannst Du den Fehler einfach nicht finden, bist Dir aber sicher, alles richtig konfiguriert zu haben, nimm Deinen Router unter die Lupe. Vielleicht sperrt der die Verbindung.

Gute Lösung, hat aber Schattenseiten

Die Lösung mit dem eigenen WireGuard VPN Server funktioniert, und zwar sehr gut. Allerdings kommt es stark darauf an, was Du mit dem VPN machen möchtest. Anonym bist Du damit natürlich nicht unterwegs. Entweder benutzt Du ein VPS, das auf Dich zurückverfolgt werden kann oder via Raspberry Pi zum Beispiel Deinen Internet Provider.

Ebenfalls eignet sich das Setup nur bedingt, um Geoblocking zu umgehen. Willst Du Zattoo Schweiz schauen, weil dort Rugby und Champions League übertragen wird und Dein VPS oder Raspberry Pi stehen in Deutschland, dann funktioniert das natürlich nicht.

Sehr gut funktioniert der eigene WireGuard VPN Server, wenn Du Dich in fremden Netzwerken einfach schützen willst. Denkbar sind kostenlose WLANs oder Hotspots in Hotels, Cafés, Airbnb, Flugzeug, Bus, ICE und so weiter.

Der Preis ist natürlich auch ein Argument. Zahlst Du 4 € für ein VPS pro Monat, dann klingt das nicht nach viel Geld. Installierst Du gleich noch Deine eigene Nextcloud darauf, lohnt sich die Sache möglicherweise. Benutzt Du den Server nur als VPN-Einwahlpunkt, solltest Du wissen, dass vertrauenswürdige Services wie von NordVPN* günstiger sind. Letzterer VPN Provider kostet weniger als die Hälfte. Beide Anbieter können Geoblocking sehr gut umgehen und Du bekommst damit Zugriff auf Netflix USA, BBC iPlayer und auch Zattoo Schweiz.

Mit persönlich taugt NordVPN besser, weil der Linux Client auch auf dem Raspberry Pi läuft und Du damit sehr einfach einen eigenen VPN-Router mit einem Raspberry Pi basteln kannst. Außerdem stellt NordVPN schon länger NordLynx zur Verfügung und das ist deren WireGuard-Implementierung für Linux. Die Verbindung ist damit schneller, wie Speedtests zeigen.

Die Lösung mit dem Raspberry Pi als VPN-Router funktioniert natürlich auch, wenn sich der Pi als Client bei Deinem eigenen WireGuard VPN Server anmeldet.

So konfigurierst Du Deinen eigenen WireGuard-Server unter Linux

Time needed: 30 minutes

Für Deinen eigenen WireGuard-Server benötigst Du einen Linux-Computer, der aus dem Internet erreichbar ist.

  1. Hole Dir einen Linux-Rechner, der aus dem Internet erreichbar ist

    Der Server kann ein Raspberry Pi mit dynamischem DNS oder ein VPS sein. Wichtig ist, dass es sich um eine moderne Linux-Distribution handelt, bei der Du das WireGuard-Paket einfach installieren kannst. Ich habe Ubuntu benutzt.

  2. WireGuard aus dem Repository installieren (falls vorhanden)

    Bei neueren Ubuntu-Varianten kannst DU WireGuard einfach aus dem Repository installieren:
    sudo apt install wireguard

  3. Port-Forwarding aktivieren

    Aktiviere das Port-Forwarding auf dem Linux-Server, damit Dein WireGuard-Server die Pakete weiterleiten kann:

    net.ipv4.ip_forward=1
    net.ipv6.conf.all.forwarding=1

    Starte den Netzwerk-Sevice oder den Linux-Server neu.

  4. Erzeuge die Schlüssel auf dem WireGuard-Server und konfiguriere den Einwahlknoten

    Damit Deine Clients sicher mit dem Server kommunizieren können, musst Du die entsprechenden Schlüssel erzeugen. Im Anschluss konfigurierst Du den Einwahlknoten, mit dem sich Deine Clients verbinden.

  5. Überprüfe die Firewall

    Stelle sicher, dass die Firewall den von Dir gewählten Port nicht blockiert. Eventuell musst Du den Port freigeben.

  6. Aktiviere die WireGuard-Schnittstelle

    Ist alles richtig konfiguriert, startest Du die WireGuard-Schnittstelle. Nur dann können sich Clients damit verbinden. In meinem Fall heißt die Schnittstelle wg0:
    wg-quick up wg0

  7. Der Server ist nun konfiguriert und lauscht auf eingehende Verbindungen

    Glückwunsch! Du hast Deinen eigenen WireGuard-VPN-Server konfiguriert. Nun kannst Du die Clients entsprechend konfigurieren und sie mit Deinem WireGuard-Server verbinden. In der Zwischenzeit gibt es Clients für Linux, Android, macOS, iOS und Windows.




 Alle Kommentare als Feed abonnieren

20 Kommentare zu “WireGuard VPN Server einrichten (Ubuntu, Raspberry Pi, Linux, Android)”

  1. Rayman says:

    Danke für die ausführliche Anleitung. Warum kann ich das nicht auf einem Raspberry Pi 2 B V1.1 zum Laufen bekommen?

    • jdo says:

      Bekommst Du schon zum Laufen, musst aber selbst kompilieren. Die beiden haben unterschiedliche Prozessoren.

  2. Stephan says:

    Hi. Danke für die Anleitung.
    Ich habe es heute damit auf einem Raspberry Pi 3B installiert. Und nach den ersten Tests (Performance) bin ich sehr zufrieden.
    Eine kleine Anmerkung habe ich. Beim generieren der Key's scheint die Anleitung nicht vollständig zu sein. Ich musste den Befehl noch erweitern.
    wg genkey | tee privatekey | wg pubkey > publickey

    • jdo says:

      Du hast Recht, Danke für den Hinweis. Ich habe es in der Anleitung ausgebessert und nun wird auch die Datei pubkey erstellt und der öffentliche Schlüssel nicht nur im Terminal angezeigt.

  3. tweg says:

    Herzlichen Dank für die ausführliche und super nachvollziehbare Anleitung. Ich konnte alles problemlos einrichten und sehr froh, dass es funktioniert.

  4. tzabbi says:

    Hi,

    super Tutorial, ich habe alles genau so gemacht bekomme allerdings keine Verbindung zu meinem Server. Im Log erscheint immer die Meldung "Handshake did not complete". Kann du mir da weiterhelfen?

    Server ist Ubuntu 18.04 LTS der bei Ionos gehostet ist. Client ist ein Ubuntu bzw ein Windows, der die gleiche Konfig benutzt.

    VG tzabbi

    • jdo says:

      In welchem Log? In dem vom Client oder vom Server?

      Der Netzwerk-Port für WireGuard ist schon offen, oder? (Firewall ist der Spielverderber?)

      Wenn Du DIr sicher bist, dass die Konfiguration stimmt und der Port erreichbar ist, würde ich freundlich beim Ionos Support anfragen, ob denen der Fehler bekannt ist. Leider ist eine Ferndiagnose wirklich schwer.

      Viele Grüße
      Jürgen

  5. tzabbi says:

    Hallo Jürgen,

    vielen Dank für deine Antwort. Die Installation hab ich von der offiziellen Wireguard Seite für meine beiden Systeme entnommen. Die Konfiguration hab ich dann anhand dieses Tutorials gemacht und leichte Abänderungen vorgenommen (IPv6 rausgenommen). Zudem habe ich bei Ionos eine Firewallregel eingestellt, die Anfragen auf Port 51820 durchlässt. Den Log habe ich vom Wireguard-Windowstool entnommen.

    Privatekey und Publickey für Server und Client habe ich mehrmals überprüft, genauso die IPs etc.

    Was benötigst du an Informationen, um mir weiterhelfen zu können?

    Viele Grüße
    tzabbi

    • jdo says:

      Ja wie gesagt sind da zu viele Faktoren involviert, um eine Ferndiagnose machen zu können. Vielleicht liegt es an einer Firewall, möglicherweise braucht der Server auch einen Neustart (hat ein reddit-Beitrag ausgespuckt, nachdem ich nach dem Fehler gesucht habe).

      Um zu prüfen, dass es sicher nicht am Client oder der Konfigurationsdatei liegt, könntest Du auch einen WireGuard-Server im eigenen LAN aufsetzen, also intern. Klappt die Verbindung dort, weißt Du auf jeden Fall, dass die Konfigurations-Datei richtig und der Client nicht schuld ist. So musst Du Dich dann eben langsam an den Fehler tasten.

      Ich würde trotzdem beim Ionos Support anfragen, ob denen da irgendein Fehler bekannt ist.

      Viele Grüße

  6. tzabbi says:

    Intern klappt alles, ich hab es jetzt mit einem Raspberry Pi als Server versucht und da klappt die Verbindung einwandfrei. Dann werde ich wirklich mal Ionos schreiben, ob die schon was davon gehört haben.

    Vielen Dank für deine Hilfe und schöne Osterfeiertage
    tzabbi

  7. Steffen says:

    Vielen Dank für die verständliche, ausführliche Anleitung. Hat auf Anhieb geklappt mit einem ipv6 Endpoint (Vodafone Dual Stack lite).
    Allerdings konnte ich mit meinem Handy laut ipv6-test.com keine ipv6 Verbindungen nutzen. Ich habe dann als client Adressen "192.168.206.2/32,fddc:980e:a378:5c2::1/72" genommen und dann noch "wg set wg0 peer allowed-ips 192.168.206.3/32,fddc:980e:a378:5c2::/72" und es funktioniert. 🙂

  8. Marcel says:

    Erstmall...Super Anleitung!
    Trotzdem noch eine Frage dazu:
    Du empfiehlst in deinem Beitrag, die DNS-Server von adminforge zu nutzen wegen dem Ad-Blocking. Wäre es denn möglich, daß du deine Anleitung so erweitern kannst, daß man anhand deiner Anleitung ein Komlettpaket aus Wireguard und Pi-Hole auf einem Server im Netz aufsetzen kann und somit alles selber unter Kontrolle hat und nicht auf Dienste Dritter angewiesen ist?
    Das wäre echt super!

    Danke und LG
    Marcel

    • jdo says:

      Ich mag das nicht gerne, zu viele Komponenten auf einem Gerät. Das bringt nur Komplikationen, die ich auf den ersten Blick nicht abschätzen kann. Die Preisfrage an dieser Stelle ist, ob Du einen öffentlich erreichbaren VPS einsetzt (wie erreicht der dann Dein Pi-hole in Deinem Netzwerk?) oder einen Pi im eigenen Wohnzimmer als Einwahlknoten. In letzterem Fall würde ich eher einen zweiten Pi mit Pi-hole nehmen (bei mir läuft es auf einem Pi2 sogar als DHCP-Server). Komponenten vermischen führt häufig zu Komplikationen, die man aber erst im Betrieb merkt.

      Willst Du auf einem VPS ein Pi-hole aufsetzen, kann das sehr schnell öffentlich erreichbar sein und das bringt ebenfalls wieder viele Komplikationen mit sich. Wie gesagt kommt es auf die Richtung an, wie Du den WireGuard-Server einsetzt.

  9. Marcel says:

    Mein Gedanke dahinter ist eigentlich...Einen kleinen Server für 4-5 Euro anmieten, Pi-Hole und Wireguard darauf installieren und so die Vorzüge beider Softwarepakete (VPN und Ad-Blocking) für all meine Geräte an einer zentralen Stelle verfügbar zu haben.

    • jdo says:

      Es gibt ja mehrere öffentliche Pi-holes. Will man nicht auf einen einzelnen Anbieter setzen, dann würde ich ganz pragmatisch einfach 2 verschiedene Pi-holes als DNS benutzen.

      In Deinem Fall willst Du wahrscheinlich auch nicht, dass andere Leute Dein Pi-hole benutzen. Also müsste man es wiederum schützen.

      Wie schon in der ersten Antwort vermutet, gibt es hier zu viele offene Fragen, die man erst testen müsste. Deswegen möchte ich mich nicht zu weit aus dem Fenster lehnen, weil ich die Fragen nicht mit 100 % Sicherheit beantworten kann.

  10. Nicht says:

    Sehr gute Anleitung.
    Aber wie hast du das mit der public ip/dynamic ip gelöst?Jeden abend ändert der Provider ja die public IP. Wenn ich heute mein WG configuriert habe, setzt er die public ip in die config. Am nächsten Tag passt die schon wieder nicht, und ich muss die händisch wieder eintragen...sehr uncomfortabel. Das müsste ja mit einem Dynamic DNS Dienst gehen, nur weiß ich nicht wie ich das configuriere. Ich hab noip.com als Dynamic DNS Dienst.
    Funktioniert das überhaupt?

    Grüße

    • jdo says:

      Du kannst eine Domain angeben, ja. Damit sollte das auch mit einer dynamischen Domain funktionieren. Persönlich benutze ich einen VPS für die WireGuard-Verbindung, der auch noch andere Dinge macht. Als DynDNS benutze ich selbst DuckDNS.org.

  11. Nicht says:

    Hey,

    Danke für die Antwort. Hab PiVPN über die bash neu installiert und die DynDNS bei der installation eingetragen. Jetzt läufts so wie es soll!

    Danke dir!

    Grüße