Wireguard Kompletttunnel mit DHCP
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.