Wenn man ein VPN verwendet, dann möchte man in der Regel auch die Sicherheit haben, dass wirklich der gesamte Datenverkehr, der den Rechner verlässt, durch das VPN geschickt wird.
Uncompliceded Firewall (UFW) Kill-Switch-Konfiguration für VPNs
Mit einer sogenannten Netzwerk-Kill-Switch-Konfiguration für die Uncompliceded Firewall (UFW) kann man das erzwingen und verhindert damit WebRTC Leaks und DNS Leaks oder dass Daten direkt ins Internet geroutet werden, wenn die Verbindung zum VPN-Server gestört ist.
- Die Installation und allgemeine Konfiguration von UFW ist hier beschrieben. Falls UFW noch nicht auf dem Rechner vorhanden ist, installiert und aktiviert man die Firewall mit:
> sudo apt install ufw
> sudo ufw enable
- Für eine Kill-Switch-Konfiguration der Firewall benötig man die IP-Adresse(n) der VPN-Server, die man unter Linux mit "nslookup" oder "dig" ermitteln kann, falls nicht bekannt.
- Für eine neue UFW Konfiguration löscht man zuerst alle aktiven Regeln:
> sudo ufw reset
- Standardmäßig wird der gesamte aus- und eingehende Traffic blockiert:
> sudo ufw default reject outgoing
> sudo ufw default deny incoming
- Durch das virtuelle VPN Interface "tun0" (OpenVPN) bzw. "wg0…N" (Wireguard) ist ausgehender Datenverkehr erlaubt. (Die folgenden Beispiele sind für OpenVPN. Wenn man Wireguard verwendet, ist "tun0" durch "wg0" zu ersetzen.) Alles erlauben, was raus will:
> sudo ufw allow out on tun0 from any to any
Man könnte es auch restriktiv konfigurierieren und nur bestimmte Daten via VPN erlauben:
> sudo ufw allow out on tun0 http from any to any
> sudo ufw allow out on tun0 https from any to any
…
> sudo ufw allow out on tun0 dns from any to <DNS Server IP>
Wenn der VPN-Server Port Forwarding anbietet und der eigene Rechner auf bestimmten Ports von außen erreichbar sein soll, könnte man Freigaben definieren (eher seltene Anforderung):
> sudo ufw allow in on tun0 from any port 22
- Alle anderen Netzwerkschnittstellen dürfen nur mit den VPN-Servern kommunizieren:
> sudo ufw allow out from any to <VPN Server1 IP>
> sudo ufw allow out from any to <VPN Server2 IP>
…
Wenn man öfters zwischen dem Betrieb mit und ohne VPN wechselt, könnte man die Befehle zur Firewallkonfiguration in einem Script zusammenfassen, dass der NetworkManger beim Starten und Beenden des VPNs ausführt. Ein einfaches Beispielscript als Vorlage für Anpassungen:
#!/bin/sh
case "$2" in
vpn-up)
# UFW Kill-Switch Konfiguration mit VPN
ufw reset
ufw default reject outgoing
ufw default deny incoming
ufw allow out on tun0 from any to any
ufw allow out from any to <VPN Server1 IP>
;;
vpn-down)
# UFW Konfiguration ohne VPN
ufw reset
ufw default allow outgoing
ufw default deny incoming
;;
esac
Das Script ist in das Verzeichnis "/etc/NetworkManager/dispatcher.d/" zu kopieren, Eigentümer und Berechtigungen sind anzupassen. Der NetworkManager-dispatcher wird das Script nur ausführen, wenn es "root" gehört und die Berechtigungen korrekt sind:
> sudo cp beispielscript.sh /etc/NetworkManager/dispatcher.d/20-vpn-ufw
> sudo chown root:root /etc/NetworkManager/dispatcher.d/20-vpn-ufw
> sudo chmod 755 /etc/NetworkManager/dispatcher.d/20-vpn-ufw
Zukünftig wird der NetworkManager-dispatcher die Firewallregeln automatisch umschreiben, wenn das VPN aktiviert oder beendet wird. Sollte das nicht funktionieren, muss man evtl. den Dispatcher Service des NetworkManagers bei einigen Distributionen noch aktivieren:
> sudo systemctl enable NetworkManager-dispatcher
Mit folgendem Kommando kann man prüfen, ob es funktioniert und welche Regeln aktiv sind:
> sudo ufw status verbose