Linux: WireGuard VPN mit Mullvad

Mullvad Logo WireGuard Logo

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".

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

Schlüssel-Eingabe

Nach der Anmeldung bei Mullvad WireGuard configuration file generator aufrufen und unter 2. Generate a WireGuard keyManage WireGuard Keys den Inhalt der privatekey Datei einfügen, mit Import key importiren und den öffentlichen Schlüssel zu Mullvad exportieren.

Multihop-Konfiguration

Mullvad 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

Mullvad Connection check
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=$(systemctl status wg-quick@* | head -n 1 | cut -d ' ' -f 2)
 
if [ -n $vpn ]; then
  systemctl stop $vpn
  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:

SOCKS-Adresse

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

Verweise auf aktuelle Seite