Linux: WireGuard VPN mit Mullvad
Mit dem Privoxy Proxy, dem Anbieter Mullvad (TOS) und WireGuard sollen WireGuard basierte „VPN“ Tunnel genutzt werden, die mehr als zwei WireGuard Server ("Multihop") und zusätzlich einen Mullvad SOCKS-Proxy als Nodes verwenden, die in zufälligen Intervallen zufällig rotieren. WireGuard ist eine Anwendung und ein Protokoll, mit dem sich neben OpenVPN VPNs realisieren lassen.
Mullvad wurde als Anbieter ausgewählt, weil er nach verschiedenen Reviews, Audits usw. neben IVPN und vielleicht noch 1 – 2 weiteren Anbietern am vertrauenswürdigsten erscheint. Siehe z. B. VPN Testing Reveals Poor Privacy and Security Practices, Hyperbolic Claims von Consumer Reports oder Signals of Trustworthy VPNs von CDT. Mullvad stellt nebenbei die Infrastruktur für das "Mozilla VPN". Ein Nachteil, den Mullvad hat: Außer in den UKUSA-Staaten, Brasilien, Japan, Hong Kong und Singapur hat Mullvad keine weiteren Server im außereuropäischen Ausland.
Installation
Kernel
Device Drivers --> Network device support <*> WireGuard secure network tunnel [*] Debugging checks and verbose messages (optional z. Überprüfung) <*> Universal TUN/TAP device driver support
wireguard-tools & Verzeichnis
sudo aptitude install wireguard-tools sudo mkdir /etc/wireguard sudo chmod 700 /etc/wireguard
Das wireguard-tools Paket enthält die wg, wg-quick Anwendungen und die wg-quick systemd Unit.
Konfiguration
Schlüsselpaar
sudo -i wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
Nach der Anmeldung bei Mullvad WireGuard configuration file generator aufrufen und unter 2. Generate a WireGuard key → Manage WireGuard Keys den Inhalt der privatekey
Datei einfügen, mit Import key importiren und den öffentlichen Schlüssel zu Mullvad exportieren.
Multihop-Konfiguration
Unter 3. Select one or multiple exit locations möglichst viele Kombinationen aus Entry → Exit WireGuard-Servern zusammenstellen und dabei möglichst die UKUSA Länder (Großbritannien, Australien, Neuseeland, Kanada, USA), Deutschland und Schweden meiden. Nach jeder Kombination die Konfigurationsdatei mit Download file herunterladen. Alle mlvd*.conf Dateien werden nach /etc/wireguard verschoben. Alle Konfigurationsdateien werden nach folgendem Schema geändert:
- /etc/wireguard/mlvd*.conf
[Interface] PrivateKey = string Address = a.b.c.d/32 (IP-Adresse, die mlvd* Netzwerkschnittstelle erhält) DNS = 127.0.0.1 TABLE = off PostUp = /etc/wireguard/wg-routes.sh [Peer] PublicKey = string (Schlüssel v. Exit-Server) AllowedIPs = 0.0.0.0/0 Endpoint = ip-adresse (v. Entry-Server):multihop-portnummer (v. Exit-Server)
Zur Namensauflösung wird ein lokales, anonymisierendes DNS Resolver-System verwendet. Die Namensauflösung findet außerhalb des WireGuard Systems über Dnsmasq → DNSCrypt-Proxy → Tor statt. Mit TABLE = off werden zunächst keine Routen in der Routing-Tabelle (route -n) angelegt. Über die PostUp Anweisung wird das wg-routes.sh Skript-Snippet nach Einrichten der Mullvad WireGuard-Netzwerkschnittstelle per bash ausgeführt, das mlvd* Routen schaltet, die Traffic über die WireGuard-Netzwerkschnittstelle bzw. WireGuard-Tunnel leiten.
- /etc/wireguard/wg-routes.sh
if=$(wg show interfaces) ip route add a.0.0.0/8 dev $if ip route add 193.138.218.74/32 dev $if ip route add e.f.g.h/32 dev $if
Der untere [Peer] Bereich muss nicht geändert werden. Später wird der Privoxy Proxy so eingerichtet, dass er Traffic an einen Mullvad SOCKS-Proxy weiterleitet – d. h. der Traffic durchläuft WG-Entry → WG-Exit → WG-SOCKS-Proxy. Für alle Anwendungen oder Dienste, deren Traffic über Mullvad bzw. WireGuard getunnelt werden soll, kann dann Privoxy als Proxy angegeben werden. Für Anwendungen und Dienste, deren Traffic direkt zum Zielserver verlaufen soll, wird entweder kein Proxy angegeben oder in der Privoxy Konfiguration Ausnahmen für Zieladdressen eingetragen, so dass der Traffic nicht über die WireGuard-Netzwerkschnittstelle, sondern die herkömmliche Netzwerkschnittstelle verläuft. Server kann man weiterhin über Tor ansprechen, wenn für deren Adressen entsprechende Weiterleitungsregeln in der Privoxy Konfiguration hinterlegt sind.
Will man nur den Mullvad DNS-Server public-dns.mullvad.net (193.138.218.74) statt verschiedener DNSCrypt/DoH Resolver verwenden, ändert man die dnsmasq.conf Datei unter #all-servers:
- /etc/dnsmasq.conf
# server=127.0.0.1#1153 server=193.138.218.74#53
DNS-Resolver per DNSCrypt-Proxy (links), Mullvad DNS-Server (rechts) im Mullvad Connection check
Multihop Auswahl & Start
- /etc/systemd/system/wg-vpn-one.service
[Unit] Description=VPN-Changer for WireGuard After=network-online.target nss-lookup.target Wants=network-online.target [Service] Type=OneShot ExecStart=/etc/systemd/scripts/wg-vpn-random.sh [Install] WantedBy=multi-user.target
sudo systemct enable wg-vpn-one.service
Mit der Dienste-Unit wird direkt nach dem Start von systemd initial eine WireGuard-Netzwerkschnittstelle eingerichtet.
Aus der Menge der gespeicherten Multihop-Konfigurationen soll anschließend in Intervallen die bestehende WireGuard-Netzwerkschnittstelle bzw. Konfiguration zufällig durch eine andere Konfiguration ersetzt werden. Mittels einer systemd Timer-Unit wird dazu über eine systemd Dienste-Unit ein entsprechendes Skript ausgeführt:
- /etc/systemd/timer/wg-vpn.timer
[Unit] Description=VPN-Changer for WireGuard [Timer] OnBootSec=N1min OnUnitActiveSec=N1min AccuracySec=0 RandomizedDelaySec=N2min [Install] WantedBy=timers.target
sudo systemctl enable /etc/systemd/timer/wg-vpn.timer
Mit dem Timer wird N1 Minuten nach dem Systemstart (u. N1 Minuten später als wg-vpn-one.service) und danach alle N1 Minuten mit einer zufälligen Zeitverzögerung von 0 – N2 Minuten nach letzter Aktivierung die gleichnamige Dienste-Unit gestartet.
- /etc/systemd/system/wg-vpn.service
[Unit] Description=VPN-Changer for WireGuard After=network-online.target nss-lookup.target Wants=network-online.target [Service] ExecStart=/etc/systemd/scripts/wg-vpn-random.sh
- /etc/systemd/scripts/wg-vpn-random.sh
#!/usr/bin/sh mullvadrandom=$(ls /etc/wireguard/ | grep --word-regexp "mlvd\w*" | cut -d. -f1 | shuf -n 1) vpn=$(wg show interfaces) if [ -n $vpn ]; then systemctl stop wg-quick@"$vpn".service sleep 3 fi systemctl start wg-quick@"$mullvadrandom".service && \ printf "Mullvad VPN via $mullvadrandom\n" exit 0
Über die vom Timer ausgelöste Dienste-Unit wird das Skript ausgeführt, das aus den gespeicherten Multihop-Konfigurationen eine Konfiguration zufällig auswählt, mit der und der wg-quick Dienste-Unit die WireGuard-Netzwerkschnittstelle eingerichtet wird. Eine eventuell bereits bestehende WireGuard-Netzwerkschnittstelle wird zuvor abgebaut.
SOCKS
Für die Mullvad SOCKS-Proxys, die Privoxy zur Weiterleitung verwenden soll, stellt man sich Listen der Kennungen aller SOCKS-Proxys des Landes zusammen, in dem der Traffic letztendlich vom Proxy zum Zielserver ausgehen soll. Das Land sollte nicht Bestandteil der obigen Multihop-Konfigurationen sein. Wenn z. B. alle SOCKS-Proxys amerikanischer WireGuard Server verwendet werden, wird z. B. keine Multihop-Konfiguration Luxemburg → WG-US1 → Proxy-US2 oder Luxemburg → WG-US1 → Proxy-US1 verwendet.
Jeder Mullvad WireGuard Server hat auch eine SOCKS-Adresse, die man in der Server-Übersicht von Mullvad einsehen kann:
Für die „wg-socks.txt“ Liste interessiert nur der us167-wg.socks5.mullvad.net Bestandteil, der für alle Proxies des ausgewählten Landes in die wg-tld-socks.txt Liste untereinander weggeschrieben wird. Dafür kann zuerst die Liste aller Mullvad Server herunterladen. Danach kann man sich für jedes gewünschte Zielland eine eigene „wg-tld-socks.txt“ Liste erstellen und dann einen wg-socks.txt Symlink setzen:
wget -O v1.json https://api.mullvad.net/public/relays/wireguard/v1/ cat v1.json | egrep -o tld[0-9]+- | cut -d- -f1 | sort --key=1.3 -g > wg-tld-socks.txt sudo mv wg-tld-socks.txt /etc/wireguard/ sudo ln -s /etc/wireguard/wg-tld-socks.txt /etc/wireguard/wg-socks.txt
SOCKS Auswahl & Privoxy
Aus der Menge der in der wg-socks.txt Liste gespeicherten Einträge soll in Intervallen zufällig ein Eintrag ausgewählt werden, der in der Privoxy Konfiguration den Mullvad SOCKS-Proxy ersetzt, an den der Traffic über den WireGuard-Tunnel weitergeleitet wird. Anschließend wird Privoxy neu gestartet.
- /etc/privoxy/config
forward-socks4 / tldN-wg.socks5.mullvad.net:1080 .
Privoxy Konfiguration zur Weiterleitung an Mullvad SOCKS-Proxy.
Mittels einer systemd Timer-Unit wird über eine systemd Unit ein entsprechendes Skript ähnlich wie zur Auswahl der Multihop-Konfiguration ausgeführt:
- /etc/systemd/timer/wg-socks.timer
[Unit] Description=SOCKS-Changer for WireGuard [Timer] OnBootSec=6 OnUnitActiveSec=30min AccuracySec=0 RandomizedDelaySec=15min [Install] WantedBy=timers.target
sudo systemctl enable /etc/systemd/timer/wg-socks.timer
- /etc/systemd/system/wg-socks.service
[Unit] Description=SOCKS-Changer for WireGuard [Service] ExecStart=/etc/systemd/scripts/wg-socks-random.sh
- /etc/systemd/scripts/wg-socks-random.sh
#!/usr/bin/sh pp=/etc/privoxy socksrandom=$(cat /etc/wireguard/wg-socks.txt | shuf -n 1) cd $pp/ sed -r '/^forward-socks4\ \/\ [a-z]{2}[0-9]{1,3}-wg.socks5.mullvad.net/ s/\ [a-z]{2}[0-9]{1,3}/\ '"$socksrandom"'/' \ <config >config_tmp && chown :privoxy config_tmp && mv config_tmp config && \ systemctl stop privoxy.service && systemctl start privoxy.service && \ printf "Privoxy verwenden $socksrandom-wg.socks5.mullvad.net als SOCKS-Proxy\n" exit 0