Du hast vielleicht einen OpenVPN und/oder WireGuard-Server am laufen, mit dem du dich von außen in dein Netz einwählst. Jetzt kommt es gelegentlich vor, dass du in WLANs bist, in denen du keine Verbindung dorthin herstellen kannst, obwohl es doch eigentlich sonst funktioniert. In diesem Fall wird deine VPN-Verbindung wahrschein von dem Router oder der Firewall gefiltert. Die wirst du tarnen wollen (Obfuscation)
Mit etwas Aufwand, kannst du diese Filter aber häufig wieder umgehen. Dazu musst du verstehen, wie sie funktionieren und Gegenmaßnahmen ergreifen. Und das ist inzwischen gar nicht so schwer.
Da ich häufig ausschließlich mit meinem Smartphone (Android) unterwegs bin, werden die Erfahrungen so im Folgenden einfließen.
Filtertechniken von Routern und Firewalls
Eine der einfachsten Techniken sind Portfilter und Protokollfilter. Häufig lassen Firewalls nur bestimmte Ports in Verbindung mit bestimmten Protokollen zu. Sehr strenge Firewalls lassen nur Webaufrufe und meist auch Email-Verkehr zu. Das kannst du dir zu Nutze machen.
Die Ports 80 (HTTP) und 443 (HTTPS) sind fast immer möglich. Meist auch die Ports 25 (SMTP), 465 (SMTPS), 110 (POP3), 995 (POP3S), 143 (IMAP) und 993 (IMAPS).
Wenn möglich, lasse deinen VPN-Server auf 443 laufen. Manchmal ist der Port auch belegt, dann bieten sich auch die Emails-Ports, insbesondere 25, an.
Ein weiterer Kniff, um VPN zu filtern besteht oft im Verbot von UDP-Verbindungen. TCP stellt sicher, dass Pakete ankommen und auch noch in der richtigen Reihenfolge. UDP ist schlanker und hat keine dieser Mechanismen. VPN läuft häufig über UDP, weil innerhalb der VPN-Verbindung, wo nötig, noch einmal TCP verwendet wird und eine doppelte Anwendung zu Lasten der Geschwindigkeit geht. Web- und Email-Aufrufe laufen alle über TCP.
WireGuard unterstützt ausschließlich UDP. OpenVPN kann auch TCP. Wenn du also Probleme mit Firewalls hast, ist es sinnvoller an dieser Stelle auf OpenVPN zu setzen.
Letztlich muss an dieser Stelle noch Stateful Packet Inspection erwähnt werden. Hierbei schaut sich eine Firewall deine Verbindung genauer an. Auch ein VPN auf TCP-Port 443 wird so erkannt und ggf. geblockt. Es gibt Techniken, die aber auch das verschleiern können.
OpenVPN VS WireGuard in Hinblick auf Obfuscation
OpenVPN, wie oben beschrieben, unterstützt TCP von Haus aus. WireGuard kann allerdings auch über einen Proxy auf jeweils beiden Enden den Verbindung geleitet und getarnt werden. In der Praxis ist es mir nicht gelungen, mit WireGuard solch eine Verbindung aufzubauen, die bequem ist und kein rooten des Smartphones (Android) nötig gemacht hätte.
Insbesondere wird stellenweise in Verbindung mit WireGuard auch stunnel empfohlen, welches die gewünschten Obfuscation-Techniken realisieren kann. stunnel und einige andere Obfuscation-Proxys setzen allerdings TCP voraus.
Shadowsocks funktioniert hingegen auch mit UDP-Verbindungen und ist eine echt Möglichkeit für den Transport von getranten WireGuard-Verbindungen, funktioniert unter Android allerdings nur in Verbindung mit AFWall+ (iptables-Implementierung), was root-Rechte benötigt.
Daher sind OpenVPN-Verbindung am komfortabelsten zu tarnen. Das geht zu Lasten der Performance. Im Zweifelsfall finde ich eine langsamere Verbindung allerdings besser als gar keine Verbindung.
OBFS-Proxy: Android zu Raspberry Pi
Der VPN Client Pro unterstützt OBFS3 direkt mindestens für OpenVPN. Wenn deine Verbindung mit dieser App zu deinem OpenVPN-Server bereits zustande gekommen ist, muss obfs3 nur noch in der Konfiguration (Entfernte Server -> [dein Server] -> Proxy) hinzugefügt werden.
Auf einem RaspberryPi lässt es sich wie folgt als Server einrichten. Dabei gehe ich davon aus, dass dein OpenVPN bereits im TCP-Modus läuft
sudo apt install obfs4proxy
sudo mkdir -p /var/lib/tor/pt_state/obfs4
Die Konfiguration von OBFS ist einfach. Setze einen Port fest, auf dem eine obfs3-Verbindung entgegengenommen werden soll (in diesem Fall Port 443). Dies Verbindung wird entschlüsselt und dann weitergereicht. In diesem Fall OpenVPN auf demselben Host auf Port 1194.
TOR_PT_MANAGED_TRANSPORT_VER=1
TOR_PT_STATE_LOCATION=/var/lib/tor/pt_state/obfs4
TOR_PT_SERVER_TRANSPORTS=obfs3,obfs4
TOR_PT_SERVER_BINDADDR=obfs3-0.0.0.0:443
TOR_PT_ORPORT=127.0.0.1:1194
Fehlt blos noch der Service für systemd. Der könnte so aussehen:
[Unit]
Description=obfs4proxy Server
[Service]
EnvironmentFile=/var/lib/tor/pt_state/obfs4/obfs4.config
ExecStart=/usr/bin/obfs4proxy -enableLogging true -logLevelStr DEBUG
[Install]
WantedBy=multi-user.target
Der service lässt sich wie folgt noch starten und beim Systemstart aktivieren. Das wars schon.
sudo systemctl start obfs4proxy.service
sudo systemctl enable obfs4proxy.service
Shadowsocks: Android zu Raspberry Pi
Shadowsocks kann gleich als getarntes VPN arbeiten und benötigt keine weitere Hilfssoftware. Es kann auch als Proxy für OpenVPN dienen. In jedem Fall aber solltest du Shadowsocks auf deinem mobilen Endgerät nur wirklich bei Bedarf aktivieren, da es einen relativ hohen Energieverbrauch verursacht. Es schadet nicht, mehr als einen VPN-Service zum eigenen Netz zu betreiben.
Auch hier gestaltet sich die Server-Installation als sehr einfach. shadowsocks-libev ist eine performante Implementierung in C, statt python.
Mit einem älteren Raspberry Pi OS und python 3.9 hatte ich allerdings schwirigkeiten mit der crypto-Bibliothek und geänderten Bezeichnungen. Die hier auskommentierte Zeile fixte das für mich.
sudo apt install shadowsocks-libev
#sudo sed -i 's/EVP_CIPHER_CTX_cleanup/EVP_CIPHER_CTX_reset/g' /usr/local/lib/python3.9/dist-packages/shadowsocks/crypto/openssl.py
Eine Server-Konfiguration hat auch hier sehr wenige Zeilen. Der gewählte Port muss natürlich von deinem Router nach außen gebracht werden und ggf. in deiner iptables berücksichtigt werden. Mit „tunnel“ kann der gesamte Datenverkehr umgeleitet werden. Eine vollständige Auflistung der Parameter findest du im Github-Projekt.
{
"server":"0.0.0.0",
"mode":"tcp_and_udp",
"server_port":443,
"password":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"timeout":300,
"method":"chacha20-ietf-poly1305",
"protocol": "tunnel"
}
Der vordefinierte Service lässt sich auch wie folgt noch starten und beim Systemstart aktivieren.
sudo systemctl start shadowsocks-libev-server@config
sudo systemctl enable shadowsocks-libev-server@config
Für den Andoid-Client sind jetzt nur noch wenige Einstellungen nötig:
Einstellungen: VPN-Modus
Profil erzeugen:
- Server-Adresse angeben
- Server-Port angeben
- Passwort angeben
- gleiche Verschlüsselungmethode auswählen
- Alle Routen (um gesamten Verkehr umzuleiten)
- ggf. Remote-DNS angeben, um dessen Namensauflösung zu verwenden