Wer vor OpenVPN aufgrund seiner Komplexität zurückschreckt, der kann sich mit WireGuard ein einfaches und vor allem schnelles VPN aufbauen. WireGuard ist schneller als OpenVPN und verzichtet dafür auf einige Funktionen. Unter Anderem arbeitet es ausschließlich auf Layer 3 (wie das TUN-Device von OpenVPN) und unterstützt lediglich UDP als Übertragungsprotokoll. Im Kontext von VPN macht das Sinn, denn meist wird innerhalb des Tunnels mittels TCP Die Ankunft von Paketen sichergestellt. Um die Verbindung nicht als VPN-Verbindung erscheinen zu lassen (Stichwort: Obfuscation), könnte TCP eine Anforderung sein, die aber dann mit zusätzlicher Software behandelt werden muss.
Insbesondere aber bietet WireGuard den Vorteil, dass auch schon Fritzboxen mit aktueller Software als Server dienen können, weil sie inzwischen WireGuard unterstützen. Darüber hinaus können auch Mikrocontroller damit schon arbeiten. ESPHome hat WireGuard bereits für ESP32 im Funktionsumfang.
Installation von WireGuard
Die Installation unter Raspberry Pi als Server ist unkompliziert.
sudo apt install wireguard
sudo modprobe wireguard #Laden der WireGuard-Kernelmodule
Schlüsselpaare für WireGuard generieren
Im Gegensatz zu OpenVPN muss bei WireGuard keine Certification-Authority aufgebaut werden. Es arbeitet mit einfachen asynchronen Schlüsselpaaren, welche in einer Zeile erschaffen werden können. Alle erzeugten public keys müssen bei den jeweiligen Gegenseiten hinterlegt werden. Die private keys werden in der Konfiguration der Teilnehmer hinterlegt. Das gilt für Client als auch Server.
wg genkey | tee privatekey | wg pubkey > publickey
Server-Konfiguration
Zunächst einmal will ich hervorheben, dass WireGuard keine starken Unterschiede zwischen Client und Server macht. Das ergibt sich (fast) ausschließlich aus dem Kontext. Erstmal sind alle Teilnehmer des VPNs „Peers“.
Dann musst du festlegen, welchen Netz-Bereich du für das VPN verwenden willst. Der sollte unbedingt sich von dem Bereich deines Heimnetzes unterscheiden und zu den privaten Netzen gehören. Ich will dir 10.0.0.0/8 oder feiner empfehlen. Falls du mehr als ein VPN-Netz erzeugen willst evtl. 10.0.X.0/24.
Auf den meisten Raspberry Pis sollte iptables als Firewall bereits installiert sein. Wireguard nimmt dann die Konfiguration beim Start selbst vor.
[Interface]
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
#PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
Address = 10.0.0.3/24
ListenPort = 51820
# DNS-Configuration (optional)
# If you want to use the DNS of another peer
#DNS = 192.168.23.3
# Firewall-Configuration. Necessary.
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
#Peer 1
#Just list all your clients like this.
[Peer]
PublicKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
# /32 means, that only packages to this peer shall be routed to this peer.
# You can also list more IPs, if you want to reach the network behind and the peer supports this (comma separated).
AllowedIPs = 10.0.0.11/32
# This is for if you're behind a NAT and
# want the connection to be kept alive.
PersistentKeepalive = 25
#Peer 2
[Peer]
PublicKey = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=
AllowedIPs = 10.0.0.12/32
PersistentKeepalive = 25
#... more peers if you want ...
Start und Autostart
Starte dann deine Konfiguration. Wenn mit den Netzwerkeinstellungen etwas falsch gelaufen ist, wirst du dich aus deinem Pi aussperren (soweit du mit SSH verbunden bist). Aktiviere den Autostart (enable) also erst, wenn deine Konfiguration zu deiner Zufriedenheit läuft. Im Notfall macht so ein Reboot erstmal alles Rückgängig.
sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0
Client-Configuration
Der Client ist noch einfacher. Der private key für den Client wird hinterlegt und der public key des Servers.
Lediglich der Eintrag „Endpoint“ unterscheidet den Client vom Server. Dieser weist den Client an, sich zu verbinden. Wenn sich zwei peers gegenseitig adressieren und beide DynDNS-Adressen haben, wird aus der Verbindung (unter Berücksichtigung des richtigen Routings) eine site-to-site-Verbindung, die zwei Netzwerke miteinander verbindest, statt nur zwei Clients. Oder ein Client mit einem Netzwerk, wie in diesem Beispiel.
Für „Allowed IPs“ gibt es zwei verbreitete Anwendungsszenarien.
- Du willst mit deinem Client ins das entfernte Netzwerk hineinkommen, aber sonstige Internetverbindungen nicht darüber leiten
- Dann listest du das entfernte Netz hier auf (z.B. 192.168.178.0/24) und vielleicht noch das VPN-Netz, falls die Clients untereinander miteinander kommunizieren können sollen.
- Du willst in das entfernte Netzwerk hineinkommen, aber auch allen anderen Traffic darüber leiten
- Dann listest du hier alle Netzwerke überhaupt auf. Das geht mit AllowedIPs = 0.0.0.0/0
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
#PublicKey = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
Address = 10.0.0.11/32
DNS = 192.168.22.3
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
AllowedIPs = 192.168.178.0/24, 10.0.0.0/24
Endpoint = yourhost.dyndns.de:51820
PersistentKeepalive = 25
Pingback: Obfuscation - Verbergen von VPN gegenüber Firewalls