Wireguard Kompletttunnel mit DHCP

07.03.2020

Seit einem Jahr verwende ich Wireguard um in unsicheren Netzen (free Wi-Fi, etc.) dieses warme, kuschelige VPN-Gefühl zu haben. Der Umstieg von OpenVPN war einfach und das VPN ist um Größenordnungen performanter und stabiler. Sogar im ICE Wi-Fi habe ich jetzt eine stabile VPN-Verbindung, das war mit OpenVPN oft nicht so: Bis das VPN wieder aufgebaut war, war die Netzwerkverbindung es schon wieder weg. Aufgrund des Designs von Wireguard ist nach einem erfolgreichen Handshake kein Reconnect nötig. Sobald die Datenpakete wieder ankommen, läuft die Verbindung einfach weiter.

Kill Switch

In der Wireguard-Dokumentation ist ein Beispiel für einen sogenannten “Kill Switch” enthalten. In diesem Beispiel wird jeder, am VPN-Tunnel vorbei gehende, Netzwerkverkehr automatisch unterbunden, sobald der Wireguard-Tunnel gestartet wird. Das Beispiel nutzt hierfür die Option PostUp und PreDown aus der wg-quick Konfiguration:

PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

Der Aufbau der Filterregel ist raffiniert: Es wird geprüft, ob das Datenpaket durch Wireguard markiert wurde. Wenn ja, dann ist es ein verschlüsseltes Datenpaket und darf in die weite Welt verschickt werden. Wenn nicht, wird es verworfen.

Richtig tot

Wer die vorgeschlagene Konfiguration ausprobiert stellt fest, dass in einigen WLAN-Netzwerken die Verbindung nach wenigen Minuten überhaupt nicht mehr funktioniert. Der Grund ist einfach: Gerade in öffentlichen Netzwerken sind die DHCP-Leases nur sehr kurz gültig. Die Knappen IP-Adressen sollen möglichst schnell dem nächsten Benutzer zur Verfügung stehen. Mit aktiven “Kill Switch” kann der Client jedoch keine Erneuerung der Lease durchführen. Also ist nach kurzer Zeit die IP-Adresse - und damit auch die Verbindung - weg.

Wiederbelebung

Es müssen also auch bei aktivem “Kill Switch” noch einige Netzwerkpakete am VPN-Tunnel vorbei gehen. Außerdem wäre es schön, wenn man neue Regeln einfügen könnte, ohne sich Gedanken zu machen, dass jede einzelne später wieder entfernt werden muss. Die originale Regel braucht für jedes “Insert” (-I) im PostUp ein identisches “Delete” (-D) im PreDown. Fehlt dieses, bleibt die Filterregel auch nach dem Abbau des Tunnels aktiv und stiftet Unfrieden.

Die folgende Lösung verwendet eine eigene Chain (killswitch), welche die Netzwerkblockade umsetzt und Ausnahmen definiert. Dies erlaubt es die ganze Chain beim Abbau der Verbindung zu verwerfen, ohne jede Regel einzeln löschen zu müssen.

# Disallow all traffic that cirumvents the VPN tunnel
# except DHCP to allow lease renewal.
PostUp = iptables -N killswitch
PostUp = iptables -A killswitch -p udp -m multiport --dports 67,68 -j RETURN
PostUp = iptables -A killswitch ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PostUp = iptables -I OUTPUT -j killswitch
PreDown = iptables -D OUTPUT -j killswitch
PreDown = iptables -F killswitch
PreDown = iptables -X killswitch

Vor der Bekannten “Kill Switch”-Regel lassen sich nun die Ausnahmen hinzufügen. Ein -j RETURN sorgt dafür, dass die Standard-Firewallregeln des Hosts für die durch den Filter erfassten Datenpakete greifen. Generell wird der “Kill Switch” durch PostUp vor der ersten benutzerdefinierten Output-Regel in den Regelsatz eingefügt. Das heißt, dass alles was mit -j RETURN an aus der Chain killswitch zurückkehrt, durch den schon vorhandenen Regelsatz bearbeitet wird.

Die letzte Regel in der Chain killswitch ist die Bekannte “verwerfe alles, was nicht von Wireguard verschlüsselt wurde”-Regel.

Fazit

Mit diesem Regelsatz funktioniert Wireguard als Kompletttunnel auch in öffentlichen WLANs perfekt. Wer es noch nicht versucht hat, sollte es wenigstens mal Probieren. Natürlich können die etablierten VPN-Lösungen wie IPSec oder OpenVPN viele Dinge, die Wireguard nicht kann. Doch das ist auch nicht sein Anspruch:

WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. wireguard.org

Verwendet man es als “einfaches, schnelles und modernes VPN” dann ist Wireguard allen anderen VPN-Lösungen weit überlegen und so nah an Plug&Play wie kein andere VPN, dass ich bisher ausprobiert habe.