Wireguard ist ein Peer-2-Peer VPN, das durchgehend moderne Kryptografie für Verschlüsselung und Authentifizierung verwendet. Im Unterschied zu OpenVPN und IPsec werden Client-Server Architekturen nicht direkt unterstützt, können aber auch (irgendwie) realisiert werden.
Jeder Wireguard Peer stellt einen IP-Adressbereich zur Verfügung, der transparent mit den Netzen der anderen Peers über eine unsichere Internetverbindung gekoppelt wird.
Einige VPN-Provider vergewaltigen das Konzept und bauen damit individuelle Client-Server ähnliche Infrastrukturen, indem die Client Peers nur die eigene IP-Adresse (ein "/32" Netz) verwenden und auf der Seite des VPN-Servers das gesamte Internet bereitgestellt wird.
- Es gibt keine zentral verwalteten Authentifizierungsmechanismen für VPN Endpunkte wie bei OpenVPN oder IPsec, wo die VPN-Server sich mit X509v3 Zertifikaten authentifizieren können, die von einer zentralen CA ausgegeben werden. Bei Wireguard müssen die public Keys der verbundenen Peers irgendwie "per Hand" zwischen den Peers ausgetauscht werden.
- Es gibt keine Authentifizierung von Nutzern und keine zentrale Account Datenbank für Nutzer. Der Zugriff via VPN wird ausschließlich mit den public Keys der Peers verwaltet.
- Linux verwaltet Wireguard Verbindungen als Netzwerk Interfaces wie die WLAN oder LAN Schnittstellen und nicht als VPN Verbindungen wie bei OpenVPN oder IPsec, die man einfach im NetworkManager als Overlays zu bestehenden Netzwerkverbindungen aktivieren kann.
Viele VPN-Provider haben individuelle Lösungen entwickelt, um Wireguard für ihre Kunden in eine Client-Server ähnliche Infrastruktur zu pressen und Wireguard VPN-Server anbieten zu können.
- Man könnte die Linux Apps der VPN-Provider verwenden, die sich automatisch um alles kümmern und die Besonderheiten von Wireguard gegenüber dem Nutzer verbergen.
Wenn der VPN-Provider die öffentlichen Schlüssel der Wireguard Server zum Download anbietet, auf der Webseite einen Upload der öffentlichen Schlüssel der Nutzer erlaubt, eine IP-Adresse für das Wireguard Interface zuteilt und wenn man keine Angst vor einem Full-Text Adventure hat, könnte man auch die Wireguard Implementierung von Linux direkt nutzen.
Als erstes ist die Wireguard Software zu installieren:
Ubuntu: > sudo apt install wireguard resolvconf
Fedora: > sudo dnf install wireguard-tools resolvconf
Dann muss man seinen eigenen privaten und öffentlichen Schlüssel erzeugen:
> sudo su
# cd /etc/wireguard
# umask 077
# wg genkey | tee privatekey | wg pubkey | tee publickey
bjqCt8IJ20zbfn3kLxvJ3mYGjTF+oe7Dg5vgyKqG4gU=
- Der am Ende angezeigte öffentliche Schlüssel ist zu kopieren beim VPN-Provider hochzuladen. Man findet ihn auch in der Datei "/etc/wireguard/publickey".
- Den privaten Schlüssel aus der Datei "privatekey" braucht man im nächsten Schritt in der Konfigurationsdatei für die Wireguard Verbindung.
Dann kann man eine Konfigurationsdatei "/etc/wireguard/wg0.conf" für die Verbindung zum ersten Wireguard Server erstellen. Wenn man zwischen mehreren Servern wechseln möchte, muss man für jeden Wireguard Server eine eigene Konfigurationsdatei "wgX" erstellen.
Da die Konfigurationsdatei den privaten Schlüssel enthält, darf sie auschließlich für "root" lesbar sein und es sollten keine Kopien irgendwo in $HOME Verzeichnissen rumliegen. (Der Schutz der Schlüssel ist eine wichtige Komponente bei sicherer Kryptografie und oft unterschätzt.)
[Interface]
PrivateKey = <privater Schlüssel>
Address = <IP für den eigenen Peer>/32
DNS = <IP vom DNS Server>
PostUp = /etc/wireguard/wg0-postup.sh
PostDown = /etc/wireguard/wg-all-postdown.sh
[Peer]
PublicKey = <öffentlicher Schlüssel des Servers>
Endpoint = <Server-Adresse>:<Port>
AllowedIPs = 0.0.0.0/0
- Die IP-Adresse für den eigenen Peer findet man irgendwo auf der Webseite des VPN-Providers nach dem Login. Zuerst muss man seinen public Key hochladen und dann wird eine IP-Adresse zugewiesen. An die IP-Adresse ist "/32" für den Netzbereich anzuhängen.
- Den empfohlenen DNS-Server findet man in der Doku oder FAQ des VPN-Providers. Man kann auch andere DNS-Server nutzen, die vom VPN-Server erreichbar sind.
- Mit den PostUp und PostDown Scripten kann man IPv6 deaktivieren und die Firewall für VPN-Nutzung umkonfiguren. Ein Beispiel für ein PostUp Script für die UFW:
#!/bin/sh
# IPv6 deaktivieren
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
# UFW Firewall Konfiguration für Wireguard Interface "wg0"
ufw reset
ufw default reject outgoing
ufw default deny incoming
ufw allow out on wg0 from any to any
ufw allow out from any to <VPN Server Adresse>
Das PostDown Script stellt den ursprünglichen Zustand wieder her, ein Beispiel:
#!/bin/sh
# IPv6 aktivieren
echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6
# UFW Firewall (normale Konfiguration)
ufw reset
ufw default alow outgoing
ufw default deny incoming
Beide Schripte müssen ausführbar gemacht werden, nachdem man sie erstellt hat:
> sudo chmod +x /etc/wireguard/wg0-postup.sh
> sudo chmod +x /etc/wireguard/wg-all-postdown.sh
Den öffentlichen Schlüssel sowie den DNS-Namen bzw. IP-Adresse des Servers findet man in der Serverliste des VPN-Providers. Der Port muss ebenfalls angegeben werden. Oft wird Port 51820 verwendet, den man ausprobieren kann, wenn in den FAQ nichts erwähnt wird. Aber einige Provider verwenden andere Ports. IVPN.net bietet die Ports 53, 2049, 2050, 30587, 41893, 48574 oder 58237 an. Man sollte also in den FAQ nachschauen.
- Die letzte Zeile bedeutet, dass die Gegenstelle (also der VPN-Server) das gesamte Internet zur Verfügung stellt (alle IPv4 Adressen - einfach übernehmen).
Die Verbindung zum ersten Wireguard VPN-Server startet man mit folgendem Kommando:
> sudo wg-quick up wg0
Mit folgendem Kommando beendet man die Verbindung zu diesem VPN-Server:
> sudo wg-quick down wg0
Mit dem Systemd kann man den Start des Wireguard-VPN beim Booten automatisieren:
> sudo systemctl enable wg-quick@wg0.service
> sudo systemctl daemon-reload
Um den automatischen Start beim Booten wieder zu enfernen sind folgende Komandos nötig:
> sudo systemctl stop wg-quick@wg0
> sudo systemctl disable wg-quick@wg0.service
> sudo rm -i /etc/systemd/system/wg-quick@wg0*
> sudo systemctl daemon-reload
> sudo syytemctl reset-failed
Hinweis für QubesOS Linux: Die Einstellungen werden nicht in der Net-VM vorgenommen sondern in dem Template, das für die Net-VM verwendet wird!
Um zu verhindern, dass die Wireguard Schlüssel in die Arbeits-VMs exponiert werden und die Arbeits-VMs eine Wireguard Verbindung zum VPN-Server aufbauen, die die QubesOS Firewall umgeht, muss man für die Net-VM eine eigene Template-VM erstellen.