LEAP Docs
GitHub Wechsel zwischen Dunkel/Hell/Auto Modus Wechsel zwischen Dunkel/Hell/Auto Modus Wechsel zwischen Dunkel/Hell/Auto Modus Zurück zur Startseite
Seite bearbeiten

Einrichten eines obfuskierten VPN Services (1/2)

Note
In diesem Tutorial wird ein obfuskiertes VPN-Gateway eingerichtet und alle Schritte werden sehr anschaulich beschrieben. Es werden keine Vorkenntnisse in der Systemadministration vorausgesetzt (ein sicherer Umgang mit dem Terminal ist jedoch von Vorteil). Du benötigst Zugang zu einem VPS-Anbieter Deiner Wahl, um neue virtuelle Maschinen zu erstellen (idealerweise drei, aber du kannst dich auch mit zwei zufrieden geben, oder sogar einer zu Testzwecken). Wenn Du es vorziehst, direkt zur technischen Dokumentation zu gehen, kannst Du dieses Tutorial überspringen und direkt einen Blick auf docker compose in obfsvpn werfen.

Autor

kikki

Last edited

25 Mar 2023

Überblick

In diesem Tutorial werden wir einen OpenVPN-Server (auch bekannt als "Gateway") und zwei weitere obfs4-Bridges einrichten, die sich mit diesem Gateway auf verschleierte Weise verbinden.

💡
Warum in aller Welt brauchen wir drei zusätzliche Server, um einfach nur im Internet zu surfen? Kurze Antwort: Weil es mehr als einen Angreifer gibt, vor dem wir uns schützen wollen. Der erste ist der Administrator der Ziel-Website selbst: Websites können die IPs der Benutzer protokollieren und versuchen, browser fingerprinting zu verwenden. Der zweite ist der Internetanbieter des Nutzers: Er protokolliert die Websites, die der Nutzer zu besuchen versucht, und kann Anfragen nach Belieben blockieren.

Das Gateway bietet dem Nutzer einen besseren Schutz seiner Privatsphäre beim Surfen im öffentlichen Internet.

Websites sehen den gesamten Datenverkehr des Benutzers als vom Gateway stammend an, das als Fassadenadresse für mehrere Personen gleichzeitig fungiert.

Wir versuchen zwar, die wahre IP-Adresse des Nutzers zu verbergen, aber auf der Netzwerkebene können wir die Fingerabdrücke des Browsers nicht verhindern, dafür ist der Browser zuständig.

Durch das Gateway ist es für den Internetanbieter auch schwieriger zu erkennen, auf welche Websites zugegriffen wird. Denn der Benutzer kontaktiert nur einen Server - den Gateway.

Wenn der Benutzer jedoch versucht, auf Dienste aus einem zensierten Land zuzugreifen, ist es für einen Zensor ein Leichtes, den Benutzer von der Verbindung zum Gateway abzuhalten.

  1. Erstens, weil OpenVPN-Verkehr einen eindeutigen Fingerabdruck hat.

  2. Zweitens sind Gateways für große Mengen an ausgehendem Datenverkehr oder sogar für mäßig bekannte Dienste wie RiseupVPN global auflistbar.

Wir können das OpenVPN-Protokoll für das Gateway nicht verwenden, wenn wir uns z. B. aus dem Iran, Russland oder China verbinden.

Um das OpenVPN-Protokoll vor den Augen eines potentiellen Zensors zu verbergen, werden wir ein anderes Protokoll, obfs4, verwenden, um OpenVPN-Daten zu kapseln (think:hide). Obfs4 wurde so entworfen, dass es wie nichts aussieht, ein zufälliger verschlüsselter Strom von Bytes, und ist heutzutage eines der am häufigsten verwendeten Pluggable Transports, die zur Umgehung verwendet werden in der Tor-Community.

⁉️
Pluggable Transports ist eine von der Community geleitete Initiative, die neue, einfach zu benutzende Wege zur Umgehung der Zensur auf der ganzen Welt erforscht und entwickelt.

Wir werden einen separat gehosteten obfs4-Dienst einrichten, der als Brücke zwischen dem Benutzer und dem Gateway dient.

Der Benutzer schickt der Brücke unauffällige, verschleierte Pakete, die dann von ihr entpackt werden. Die darin enthaltenen OpenVPN-Pakete werden zum dem Gateway weitergeleitet, wo diese wiederum entpackt werden und die zugrundliegenden Datenpakete ihren Weg ins öffentliche Internet finden.

Um Zensoren zusätzlich zu verwirren, unterstützen wir den automatischen Wechsel der Bridges in zufälligen Abständen, dies wird in Teil 2 dieses Tutorials behandelt.

😁 😁 😁

Also…​ lasst uns loslegen!

Einrichten des OpenVPN-Gateways

In diesem Tutorial werden wir einen gewöhnlichen Cloud-Anbieter wie Digital Ocean verwenden, nur um zu zeigen, wie man die Software bei einem mehr oder weniger handelsüblichen Dienst von den vielen, die es da draußen gibt, installieren würde.

Wenn Sie daran denken, Ihren VPN-Dienst wirklich zu nutzen (wie im echten Leben), müssen Sie zweimal darüber nachdenken, wo Sie Ihren VPN-Dienst hosten werden. Dies ist für VPNs sehr wichtig, denn während Sie versuchen, die Eingriffe Ihres Internetanbieters oder anderer Akteure in Ihren Datenverkehr zu verlagern, setzen Sie nun viel Vertrauen in die Netzwerke und Hardware, von denen Ihr VPN-Dienst abhängt. Das bedeutet, dass Sie Ihr eigener (VPN-)Anbieter werden und dass Sie den Leuten im Rechenzentrum Ihr Vertrauen schenken. Wählen Sie also sorgfältig aus ;)

Melden Sie sich bei Ihrem Cloud-Anbieter an und erstellen Sie neue Maschinen

  1. Wählen Sie auf der Registerkarte "Erstellen" die Option "Neues Droplet erstellen".

  2. Wählen Sie Standard-Ubuntu.

  3. Wählen Sie den günstigsten Tarif (wir brauchen nichts Besonderes, damit OpenVPN funktioniert).

  4. Geben Sie dem Droplet einen aussagekräftigen Namen, z.B. "obfsvpn-gateway". Aber es ist in Ordnung, wenn Sie Ihren Katzennamen verwenden wollen, solange Sie sich daran erinnern 😉 .

  5. Beenden Sie die Erstellung noch nicht!

Hinzufügen eines SSH-Schlüssels

Dieser und der nächste Abschnitt gehen von einer unixähnlichen Umgebung aus.

  1. Klicken Sie auf "ssh-Schlüssel hinzufügen". Es sollte ein Feld angezeigt werden, in das Sie den Schlüssel eintragen können.

  2. Im Terminal: cd .ssh.

  3. Erzeugen Sie einen neuen Schlüssel mit ssh-keygen.

  4. Kopieren Sie Ihren öffentlichen Schlüssel in das Feld.

  5. Beenden Sie die Erstellung des Droplets. Nach der Fertigstellung sollten Sie die IP des neuen Rechners sehen und kopieren können.

Verbinden Sie sich mit Ihrem neuen Rechner

Öffnen Sie Ihr Terminal und verbinden Sie sich per ssh mit dem neuen Rechner:

ssh -i yourkeyfile root@gateway-ip

Nachdem Sie die Passphrase eingegeben haben, die Sie bei der Erstellung des ssh-Schlüssels festgelegt haben, sollten Sie eine root-Konsole sehen. Wir müssen nur noch openvpn und easy-rsa installieren, um den nächsten Schritt vorzubereiten.

``Shell apt install openvpn easy-rsa

=== Erstellen der öffentlich Schlüssel für OpenVPN

Ok, jetzt müssen wir einige Schlüssel erzeugen. Warum das? Weil wir sicher sein wollen, dass unsere `openvpn`-Clients sich mit unserem Gateway verbinden (und nicht mit irgendeinem anderen dubiosen Rechner, den ein Gegner dazwischengeschaltet haben könnte). Wir wollen auch, dass unser `openvpn`-Server nur die Clients akzeptiert, die wir zuvor autorisiert haben. Du kannst einen Blick auf die https://de.wikipedia.org/wiki/Public-Key-Infrastruktur[Public-Key-Infrastruktur] Seite in Wikipedia werfen, aber wenn du es eilig hast, geht es im Wesentlichen um Folgendes. Sie haben das schon eine Million Mal gemacht - es ist eigentlich fast derselbe Prozess wie für die `ssh`-Schlüssel, die wir gerade oben verwendet haben.

[TIP]
Dieser Schritt speichert die Schlüsselpaare; wenn Sie sogar die Zertifizierungsstelle wechseln wollen, sollten Sie diesen Schritt wiederholen, aber auch daran denken, neue Client-Zertifikate zu erzeugen.

Das easy-rsa-Paket von Ubuntu setzt `easyrsa` nicht in den PATH, also kopieren wir das gesamte easyrsa-Verzeichnis in unser zukünftiges Schlüsselverzeichnis:

```Shell
cp -r /usr/share/easy-rsa /etc/openvpn
cd /etc/openvpn/easy-rsa
# jetzt können wir unser leeres pki-Verzeichnis initialisieren
./easyrsa init-pki

Erstellen einer Zertifizierungsstelle (CA)

Wenn zwei Parteien sicher kommunizieren wollen, tauschen sie öffentliche Verschlüsselungsschlüssel aus.

Woher weiß man jedoch, ob man einen RICHTIGEN Schlüssel verwendet, der wirklich einer anderen Partei gehört?

Ein TLS-Zertifikat enthält nicht nur den Schlüssel selbst, sondern auch eine Unterschrift einer vertrauenswürdigen Stelle, die bestätigt, dass dieser Schlüssel demjenigen gehört, für den er sich ausgibt.

In diesem Lernprogramm werden wir diese vertrauenswürdige Instanz, die allmächtige Zertifizierungsstelle, selbst erstellen.

Mit genau einem Befehl:

./easyrsa build-ca

Kopieren Sie die erzeugte ca.crt irgendwo hin! Wir werden sie später auf dem Client-Rechner benötigen.

Erzeugen Sie einen Schlüssel für den OpenVPN Server

Wir generieren die Anfrage und signieren sie:

./easyrsa gen-req server
./easyrsa sign-req server server server

Ja, dieser Rechner wird sowohl unser VPN-Server als auch unsere Zertifizierungsstelle sein (bei einer dauerhaften Installation wollen Sie wahrscheinlich die Zertifizierungsstelle offline nehmen und nur Zertifikate und Schlüssel kopieren). Nun, als zusätzliche Sicherheitsebene neben TLS, bietet OpenVPN einen zusätzlichen Schutz (indem es die Sicherheit des Kontrollkanals erhöht). Dafür brauchen wir einen statischen Schlüssel. Generieren Sie ihn mit:

openvpn --gen-key > ta.key

Diesen ta.key müssen wir anschließend auch auf den Client kopieren.

Zuletzt generieren Sie die Parameter für Diffie Hellman Handshakes. Diese werden nicht weitergegeben:

openssl dhparam -out dh2048.pem 2048

Erstellen unserer OpenVPN-Server-Konfigurationsdatei

Erstelle zunächst eine Beispielkonfiguration aus dem openvpn Dokumentationsordner.

cd ..
cp /usr/share/doc/openvpn/examples/configs/server.conf .

Bearbeite dann server.conf so, dass sie wie folgt aussieht:

proto tcp

ca easy-rsa/pki/ca.crt
cert easy-rsa/pki/ausgestellt/server.crt
schlüssel easy-rsa/pki/private/server.key

Für Clients benötigst du pki/issued/server.crt und ca.crt.

OpenVPN starten

  • openvpn --config server.conf

  • Die normale Ausgabe endet mit "completed".

  • Wenn dies funktioniert, stoppe es mit ctrl+c, dann

  • systemctl enable openvpn@server.service

  • systemctl start openvpn@server.service

Damit läuft OpenVPN im Hintergrund und wird beim Hochfahren des Rechners automatisch gestartet

Aktiviere das Routing zum Internet

Im Moment können die Pakete, die zu unserem VPN gehen, nur unser VPN erreichen, man kann z.B. nicht DuckDuckGo darüber benutzen. Um dies zu ändern, ändern wir die iptables Regeln.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

OBFS4-Brücken einrichten

Ok, wir haben ein funktionierendes VPN-Gateway. Nun richten wir Bridges ein, um uns " im Verborgenen" mit dem VPN zu verbinden.

Erstellen Sie eine neue Maschine

💡
Sie könnten die Bridge zu Testzwecken auf demselben Rechner wie das OpenVPN-Gateway einrichten, aber das ist keine gute Idee. Zensoren werden bei einem Scan schnell bemerken, dass Sie einen offenen Port neben einem anderen haben, der eindeutig ein OpenVPN-Server ist, was den Zweck der Verschleierung ziemlich untergräbt. In einem realistischen System sollten sich diese Brücken in anderen IP-Bereichen befinden als Ihre Gateways.
  • Loggen Sie sich bei Digital Ocean ein.

  • Erstellen Sie ein neues Droplet mit minimalen Spezifikationen. Wir werden es obfs-bridge nennen.

  • Notieren Sie sich seine IP.

  • Verbinden Sie sich mit ssh, ähnlich wie bei der Einrichtung von openvpn oben.

  • Sie sind jetzt root!

Vorbereiten der ausführbaren Dateien

apt install golang make git
git clone https://0xacab.org/leap/obfsvpn
cd obfsvpn/cmd/server
make build

obfs-Zertifikat generieren

Um einen schnellen Test zu machen, können wir ein paar Platzhalter als obfs4-Schlüssel rüberkopieren: siehe Appendix um zu erfahren, wie man sie erzeugt.

  • cp -r ../../server/test_data .

Ziel-Gateway festlegen

Im Sinne einer einfachen Wiederverwendung werden wir auch einige Variablen exportieren.

``Shell export LHOST=<Ihre Bridge-IP> export LPORT=<beliebiger Port> export RHOST=<Gateway ip:port>

[NOTE]
Denk daran, den Port für deine Bridge in der Firewall deines Rechners zu öffnen.

=== Starte die Bridge!

```Shell
make certs
./server -addr ${LHOST} -port ${LPORT} -vpn ${RHOST} -state test_data -c test_data/obfs4.json

Ausführen des obfs4-Clients

Auf einem beliebigen Rechner, von dem du dich verbinden willst:

apt install golang make git
git clone https://0xacab.org/leap/obfsvpn
cd obfsvpn/cmd/client
make build
./client -c <Zertifikatstring aus Ihrer obfs4.json> -r <Ihre Bridge-IP, LHOST> -rp <Ihr Bridge-Port, LPORT>

Wenn alles gut geht, wird gemeldet, dass der Socks5-Port auf 8080 geöffnet ist. Um ihn jedoch nutzen zu können, müssen wir unseren openvpn-Client einrichten.

OpenVPN-Client einrichten

Wiederhole die Schritte für den openvpn Server, höre aber nach der Erzeugung des pki dir auf.

  • Kopieren Sie ta.key vom Server in den openvpn-Ordner.

  • Kopieren Sie ca.crt vom Server in das pki-Verzeichnis.

  • Erzeugen Sie aus /etc/openvpn/easy-rsa eine Client-Zertifikatsanforderung:

  • Auf dem Client: ./easyrsa gen-req server

  • Kopiere es in das pki/reqs Verzeichnis des Servers:

  • Auf dem Server: ./easyrsa sign-req client client client

  • Kopiere das pki/ausgestellte Zertifikat in das pki-Verzeichnis des Clients.

  • Kopieren der Beispiel-Client-Datei

  • cp /usr/share/doc/openvpn/examples/configs/client.conf .

  • Bearbeite sie so, dass sie auf deine Dateien und dein Gateway zeigt.

1
2
3
4
5
6
proto tcp
remote <Gateway-Host> <Gateway-Port>

ca easy-rsa/pki/ca.crt
cert easy-rsa/pki/client.crt
key easy-rsa/pki/private/client.key
  • Prüfe, ob die direkte Verbindung zum Gateway erfolgreich ist:

  • openvpn -c client.conf

  • Überprüfe, ob die Ausgabe mit completed endet.

  • Auf dem Gateway, ip addr

  • Finde die IP des tun0-Interfaces

  • Auf dem Client: "ping -I tun0 <gateway tun0 ip>".

Wenn das funktioniert, kannst du versuchen, das Internet von außen anzupingen:

ping -I tun0 8.8.8.8

Glückwunsch, zumindest der direkte openvpn-Tunnel funktioniert.

Lass uns nun den verdeckten OpenVPN-Tunnel überprüfen!

openvpn -c client.conf --remote <obfs4_ip> <obfs4_port> --socks-proxy 127.0.0.1 8080

Wenn dies erfolgreich ist

ping -I tun0 8.8.8.8

Funktioniert es? Ja? Du bist spitze! Nein? Schick uns deinen Fehler, damit wir einen Abschnitt zur Fehlerbehebung schreiben können.

Anhang: Ein eigenes obfs4-Zertifikat erstellen

apt install python3-pysodium
wget -O gen-shapeshifter-state.py https://0xacab.org/leap/container-platform/lilypad/-/raw/main/playbooks/scripts/gen-obfs4-state.py
python3 gen-shapeshifter-state.py statedir

Nun kannst du deine Dateien aus dem Ordner statedir holen.

Zum nächsten Schritt!
Wir könnten hier aufhören, aber das ist ein guter Moment, um etwas Tee zu trinken, uns auf die Schulter zu klopfen und mit dem zweiter Teil des Tutorials fortzufahren. Darin fügen wir eine weitere Brücke hinzu und bringen unserem Client bei, wie er zwischen beiden Brücken springen kann.