Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Allgemeine Fragen und Erfahrungsaustausch rund um China - Kultur - Geschichte usw.
Antworten
Benutzeravatar
拉尔斯
Forumsprofi
Forumsprofi
Beiträge: 162
Registriert: 24.07.2015, 12:12
Wohnort: Hamburg / 昆明市
Hat sich bedankt: 35 Mal
Danksagung erhalten: 13 Mal

Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von 拉尔斯 »

Hallo zusammen!

Weil hier immer wieder mal das Thema aufkommt, möchte ich hier einmal aufzeigen, wie ich vor kurzem Stunnel unter Android, Windows 10 und macOS (folgt) mit OpenVPN einrichte bzw. auf meinem Raspberry Pi eingerichtet habe und möchte das mit euch hier teilen, weil mir das hier gefehlt hat.

Vorab möchte ich darauf aufmerksam machen, dass ich keine Realitätsabgleich gemacht habe, also die Server und Konfigurationen nicht in China testen konnte. Evtl. kann man das in einem Netzwerk auch hier in Deutschland ausprobieren wo die VPN-Daten geblockt werden z. B. bei freien Wifi/WLAN Anbietern. In der Theorie sollte es eigentlich funktionieren.

Dieser Thread soll nicht unbedingt ein Erklär-Beitrag sein, indem ich alles bis auf kleinste Detail erläutere, sondern ist eher eine lose Sammlung von Artikeln in die ich mich eingelesen habe, um das vorhaben zu realisieren. Also als Hilfe zur Selbsthilfe. Ich gehe deshalb davon aus, diejenigen die das nachbauen wollen, sich auch etwas auskennen und auch gerne ein wenig experimentieren möchten 😉 Bei Fragen dürft Ihr gerne trotzdem fragen 😊 Erfahrungsberichte (insbesondere aus China) sind natürlich hier herzlich wilkommen.

Problemstellung/Ausgangslage

In China soll ja die Nutzung von VPNs untersagt sein. Die Great Firewall (GFW) blockt die Verwendung von OpenVPN. Man kann sie möglicherweise austricksen, indem man den VPN Server auf den TCP Port 443 verwendet. Dieser Port wird von HTTPS genutzt und sichert viele wichtige Websites ab.

Die GFW geht aber wohl noch weiter und verwendet DPI (Deep Packet Inspection) und die Technik kann zwischen HTTPS und VPN unterscheiden, indem sie die charakteristischen Handshakes von OpenVPN identifiziert, auch wenn man es hinter HTTPS versteck.

Es gibt grundsätzlich zwei Möglichkeiten, um die GFW zu umgehen.
  • SSH Tunneling
Hier im Forum wurde schon mehrmals davon berichtet (hier viewtopic.php?f=13&t=28566 oder hier viewtopic.php?f=16&t=26939&p=374842&hilit=vpn#p374842), den Traffic über einen SSH Tunnel einzupacken und über einen lokalen Proxy laufen zu lassen. Diese Technik soll wohl auch unter Dynamic Port Forwarding bekannt sein. Vereinfacht gesagt: Man lässt hierbei den SSH-Client wie einen SOCKS-Server verhalten und lässt den Zugriff auf den entfernten Rechner durch einen SSH Tunnel ermöglichen. Das soll aber laut dem Kommentar unter diesem Blogartikel (https://www.linuxbabe.com/firewall/ssh- ... forwarding) in China nicht mehr funktionieren.
  • SSL Tunnel
Bei dem SSL Tunnel (auch Stunnel genannt) werden die VPN Daten in eine SSL Verschlüsselung eingepackt. Wird dieser Mechanismus verwendet, dann soll es schwer sein, die VPN Daten aus dem normalen HTTPS Traffic zu filtern. HTTPS verwendet nämlich SSL für die Verschlüsselung. Die DPI Techniken können angeblich diese Verschlüsselungsschicht nicht knacken. Hier findet man ein gutes Schaubild wie das aussieht: https://wiki.teltonika-networks.com/vie ... eme_v2.png

Ich habe mich für die zweite Lösung entschieden.

Mehr zu diesem Thema findet man hier: https://de.vpnmentor.com/blog/vpns-russ ... ntsperren/

Grundlage

Meine Grundlage ist ein eigens aufgesetzter OpenVPN-Server unter IPv6 und einem TCP Port auf einem Raspberry Pi (hier in Deutschland).
Was ich im Gegensatz zu den Artikeln anders gemacht habe: Sowohl in der Server-Konfiguration als auch in der Client-Konfiguration ersetze ich das udp Protokoll beim Eintrag „proto“ von udp auf tcp6. Am Router habe ich dann den Port 443 (sowohl IPv4 und IPv6) freigegeben.
Der VPN-Client sollte jetzt erstmal auf dieser Grundlage auf den VPN-Server zugreifen.

Hier findet hier auch nochmal ein schöne Schaubilder zum Thema VPN-Tunnel: https://blog.helmutkarger.de/raspberry- ... diagramme/

Stunnel und OpenSSL auf dem Raspi installieren

https://www.raspberrypi.org/forums/view ... hp?t=40389

In diesem Artikel wird erklärt, wie der Stunnel-Server und wie die SSL Zertifikate erstellt werden.

Was ich im Gegensatz zu den Artikeln anders gemacht habe: In der Server-Konfiguration habe ich unter dem Eintrag „connect“ 34567 durch 443 ersetzt. Den Part mit der Firewall habe ich ausgelassen und stattdessen den Port 993 (sowohl IPv4 und IPv6) im Router freigegeben.
Der Stunnel Sever sollte jetzt unter der Statusabfrage „active (running)“ anzeigen.

Android

Unter meinem Smartphone habe ich zugegebener maßen ein wenig gekämpft aber am Ende es doch hinbekommen.
Diese folgenden Artikel haben mir dabei geholfen:
Folgende Apps sind zu installieren:

TLS/SSL Tunnel
SimpleHttpServer (für SSL Zertifikatsdatei „.cert“)
OpenVPN für Android

Welche Dateien werden benötigt?

SSL-Zertifikatsdatei
OpenVPN Client-Konfigurationsdatei

Im ersten Artikel ist ein Video (https://youtu.be/_jk787bm6zA) enthalten, welches beschreibt, wie man die App TLS/SSL Tunnel einrichtet und die SSL-Zertifikatsdatei mithilfe von SimpleHttpServer importiert. Die Zertifikatsdatei und OpenVPN Client-Konfigurationsdatei habe ich mit FTP vom Raspberry Pi geholt.

Als localhost Port habe ich 1194 verwendet. Zum Remote Host habe ich den Port 993 (siehe SSL Server Konfiguration) verwendet. Am besten legt man eine Kopie von der OpenVPN Client-Konfigurationsdatei an. Somit hätten man zwei Alternativen (einmal ohne SSL und einmal mit SSL), falls eine Variante nicht funktioniert.

Bevor ich die App OpenVPN einrichte, bearbeite ich die OpenVPN Client-Konfigurationsdatei. Hier ersetze ich einfach im Eintrag „remote“ meinen Host Eintrag durch „localhost 1194“.

Im zweiten Artikel wird beschrieben, wie man nun die App OpenVPN für Android einrichtet und die App TLS/SSL Tunnel bei den ausnahmen hinzufügt. Unter Routing habe ich allerdings im Abschnitt IPv4 keinen Haken gesetzt.

Nun kann man die OpenVPN Client-Konfigurationsdatei in der App OpenVPN für Android importieren.

Zunächst startet man den Tunnel in der App TLS/SSL Tunnel und danach baut man eine Verbindung mit OpenVPN auf.

Windows 10

Unter Windows 10 war das dann (gefühlt) deutlich einfacher.

Hier kann man sich Stunnel für Windows 10 runterladen
http://www.stunnel.org/downloads.html

Für die Einrichtung von Stunnel bin ich einfach den Anweisung des letzten Abschnitts aus diesem Artikel gefolgt:
https://www.raspberrypi.org/forums/view ... hp?t=40389

Was ich im Gegensatz zu den Artikeln anders gemacht habe: Anstatt der aufgeführt OpenVPN Client-Konfigurationsdatei habe ich meine Datei unter dem Eintrag „remote“ angepasst und meinen ursprünglich Host durch „localhost 1194“ ersetzt.

Unter macOS (evtl. noch unterm Iphone) folgt noch eine Anleitung.

Viel Spaß beim experimentieren!
Viel zu spät begreifen viele die versäumten Lebensziele: Freude, Schönheit der Natur, Gesundheit, Reisen und Kultur. Darum, Mensch, sei zeitig weise! Höchste Zeit ist’s: Reise, reise! (Wilhelm Busch)
Benutzeravatar
拉尔斯
Forumsprofi
Forumsprofi
Beiträge: 162
Registriert: 24.07.2015, 12:12
Wohnort: Hamburg / 昆明市
Hat sich bedankt: 35 Mal
Danksagung erhalten: 13 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von 拉尔斯 »

Nach der Euphorie folgte die Ernüchterung. Zumindest bei Android. :roll:

Mit der App TLS/SSL Tunnel hatte ich ständig mit Abbrüchen zu kämpfen (hätte ich ja mal vorher checken können, bevor ich das hier niederschreibe :mrgreen:) Deshalb habe ich die folgende App verwendet.

SSLSocks

Mit der App SSLSocks bekomme ich Stunnel auch auf mein Smartphone. Quelle: https://hamy.io/post/0011/how-to-run-st ... #gsc.tab=0

In der Client Config kann man dann in der App wie gewohnt meine Konfiguration für den SSL/OpenVPN Server einfügen. Ich habe außerdem sowohl in der Server-Config als auch in der Client-Config etwas eingefügt.
My connections are slow, slow, slow
One option might be to turn on the TCP NODELAY option on both ends. On the server, include the following options:

socket = l:TCP_NODELAY=1
and on the client include:

socket = r:TCP_NODELAY=1

https://www.stunnel.org/faq.html
In der OpenVPN App für Android habe ich noch folgende Profil-Einstellungen geändert:

Routing:
IPv4 Use default Route: AN
IPv6 Use default Route: AN

Erweitert:
Persistent tun-Device: AN
Verbindungsversuche: 5

In meinen Smartphone Einstellungen habe ich noch eingestellt, dass die beiden Apps auch im Hintergrund laufen und als Durchgehend aktives VPN eingestellt.
Viel zu spät begreifen viele die versäumten Lebensziele: Freude, Schönheit der Natur, Gesundheit, Reisen und Kultur. Darum, Mensch, sei zeitig weise! Höchste Zeit ist’s: Reise, reise! (Wilhelm Busch)
Benutzeravatar
拉尔斯
Forumsprofi
Forumsprofi
Beiträge: 162
Registriert: 24.07.2015, 12:12
Wohnort: Hamburg / 昆明市
Hat sich bedankt: 35 Mal
Danksagung erhalten: 13 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von 拉尔斯 »

Und der nächste Fehler hat nicht lange auf sich warten lassen... :mrgreen:

Um meinen DDNS-Dienst mit der aktuellen IP zu beliefern, nutze ich das Tool "ddclient". Hat auch wunderbar funktioniert, bis ich wohl OpenSSL installiert habe und der ddclient die IP nicht mehr den DDNS-Dienst beschickt hat. Das habe ich erst jetzt festgestellt. :oops:

Also habe ich den ddclient von Hand ausprobiert:

Code: Alles auswählen

sudo ddclient -force
WARNING: cannot connect to checkipv4.dedyn.io:443 socket: SSL connect attempt failed
Irgendwie mochte der ddclient das installierte OpenSSL nicht.

Nach einer langen Recherche habe ich hier einen Workaround gefunden: https://forums.freebsd.org/threads/ddcl ... ors.27378/

Man editiert das ddclient Perl Script unter: /usr/sbin/ddclient
evtl. müsst Ihr dem Script noch die CHMOD Rechte 777 setzen.
...
line 1859:
} elsif ($use_ssl) {
$sd = IO::Socket::SSL->new(
PeerAddr => $peer,
PeerPort => $port,
Proto => 'tcp',
MultiHomed => 1,
Timeout => opt('timeout'),
SSL_ca_file => '/etc/ssl/certs/XXXX.crt',
);
...
In der roten Zeile fügt man ein SSL Zertifikat ein.

Nun sollte wieder eine SUCCESS Meldung erfolgen.

Code: Alles auswählen

sudo ddclient -force
SUCCESS:  updating DEIN.SERVER: good: IP address set to XX.XXX.XXXX.XX
PS: bei macOS konnte ich nur einen SSH Tunnel aufbauen. Wie das geht, folgt wohl heute Nachmittag.
Viel zu spät begreifen viele die versäumten Lebensziele: Freude, Schönheit der Natur, Gesundheit, Reisen und Kultur. Darum, Mensch, sei zeitig weise! Höchste Zeit ist’s: Reise, reise! (Wilhelm Busch)
Benutzeravatar
拉尔斯
Forumsprofi
Forumsprofi
Beiträge: 162
Registriert: 24.07.2015, 12:12
Wohnort: Hamburg / 昆明市
Hat sich bedankt: 35 Mal
Danksagung erhalten: 13 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von 拉尔斯 »

So, hier nochmal wie besprochen meine Geschichte mit dem macOS.

Unter macOS habe ich es nicht geschafft mit einem Stunnel/OpenVPN Client eine Verbindung herzustellen. Die Verbindung bricht leider immer wieder nach ein paar Sekunden wieder ab. Vielleicht hat jemand eine Lösung?

Ich habe mich stattdessen – wie im Eingangspost erwähnt – entschieden einen SSH Tunnel aufzubauen und den Client als Proxy Server zu verhalten allerdings ohne VPN. Vielleicht kann unser rundherum aus erster Hand berichten, ob diese Lösung in China noch funktioniert?

Hier findet Ihr wie man das auf einem Mac einrichtet: https://www.hostdime.com/kb/hd/security ... l-on-macos (hier für Win 10: https://it-lehre.de/2014/12/proxy-mit-putty-einrichten/)

Nachtrag: Diese vorgestellten Lösungen werden wahrscheinlich gut funktionieren, wenn man nur für ein paar Wochen im Jahr in China ist. Würde ich dauerhaft in China leben, dann würde ich sowohl mit einem Raspberry Pi in Deutschland als auch in China arbeiten. Ich erspare euch jetzt mal eine Aufzählung der Vorteile beim eigenen Pi.

Bei Fragen einfach gerne fragen ;)
Viel zu spät begreifen viele die versäumten Lebensziele: Freude, Schönheit der Natur, Gesundheit, Reisen und Kultur. Darum, Mensch, sei zeitig weise! Höchste Zeit ist’s: Reise, reise! (Wilhelm Busch)
mavix
Stammgast
Stammgast
Beiträge: 115
Registriert: 20.03.2012, 15:56
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von mavix »

Hallo 拉尔斯 ,

toller Beitrag. Vielen Dank für deine Mühen. Es ist schön, wenn sich auch jemand so intensiv mit dem Thema beschäftigt.

Ich habe auch schon sehr vieles ausprobiert und benutze seit einger Zeit Shadowsocks mit v2ray plugin. Das funktioniert wunderbar stabil und schnell von China aus.
Es wird weder blockiert von der GFW, noch gibt es Verbindungsabbrüche. Wenn man einen Server in Deutschland mit guter Anbindung nach China hat (vorzugsweise GIA CN2), dann kommt man da, je nach eigener Leitung auf 70-150 Mbit/s. Und zwar stabil und dauerhaft. Also Netflix, Amazon Prime und Youtube in 4K 60fps sind da kein Problem.

Für Shadowsocks auf dem Server habe ich folgende Anleitungen verwendet

https://www.linode.com/docs/guides/crea ... d-centos7/
https://frost-lee.github.io/shadowsocks-ubuntu/

Um das ganze noch ein wenig zu verschleiern benutze ich das v2ray plugin für Shadowsocks:

https://jackzhou.co/?p=108
https://github.com/shadowsocks/v2ray-plugin

Da gibt es dann auch Apps für z.B. iPhone (Shadowrocket) oder auch für den PC oder Mac.

Ich persönlich habe das zu Hause auf meinem Router mit openWRT eingerichtet, so dass ich immer "in Deutschland" surfen kann. Auch habe ich den Router noch so eingestellt, dass lokale Anfragen nicht über den Tunnel geleitet werden. So bleiben dann alle Chinesischen Seiten (vor allem für meine Frau) schnell erreichbar mit Chinesischer IP, während z.B. mein Sohn in Ruhe Disney Plus schauen kann.
Benutzeravatar
拉尔斯
Forumsprofi
Forumsprofi
Beiträge: 162
Registriert: 24.07.2015, 12:12
Wohnort: Hamburg / 昆明市
Hat sich bedankt: 35 Mal
Danksagung erhalten: 13 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von 拉尔斯 »

Hallo mavix,

danke für das Feedback. Shadowsocks habe ich Mal installiert aber scheitere am v2ray plugin (Installation schlägt fehl).

OpenWRT sagt mir was. Auf einem ausgemusterten Router hatte ich Mal DD-WRT installiert.

Bei welchem Anbieter bist du denn wegen der CN2 Anbindung?
Viel zu spät begreifen viele die versäumten Lebensziele: Freude, Schönheit der Natur, Gesundheit, Reisen und Kultur. Darum, Mensch, sei zeitig weise! Höchste Zeit ist’s: Reise, reise! (Wilhelm Busch)
mavix
Stammgast
Stammgast
Beiträge: 115
Registriert: 20.03.2012, 15:56
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von mavix »

拉尔斯 hat geschrieben: 05.01.2021, 15:58 Hallo mavix,

danke für das Feedback. Shadowsocks habe ich Mal installiert aber scheitere am v2ray plugin (Installation schlägt fehl).

OpenWRT sagt mir was. Auf einem ausgemusterten Router hatte ich Mal DD-WRT installiert.

Bei welchem Anbieter bist du denn wegen der CN2 Anbindung?
Bei den Anbietern muss man sich ein wenig durchprobieren. Es kommt halt auch immer drauf an, wo man in China lebt und welchen ISP man hat. Die Seite https://servercat.net/ testet immer wieder Server mit guter Anbindung nach China.

Wie das v2ray-Plugin auf dem Raspi funktioniert kann ich dir nicht genau sagen. Ich benutze Ubuntu 18.04 und für v2ray brauchst du Go. Für den Raspi kannst du das wie folgt installieren https://www.raspberry-pi-geek.de/ausgab ... ansteuern/

Und wenn Go installiert ist kann du das v2ray-plugin von der github Seite laden.
Benutzeravatar
拉尔斯
Forumsprofi
Forumsprofi
Beiträge: 162
Registriert: 24.07.2015, 12:12
Wohnort: Hamburg / 昆明市
Hat sich bedankt: 35 Mal
Danksagung erhalten: 13 Mal

Re: Raspberry Pi VPN – Stunnel (SSL Tunnel) mit OpenVPN einrichten - GFW umgehen

Beitrag von 拉尔斯 »

Ich bin es mal wieder und habe einen alten ausgemusterten Router mit OpenWRT ausgestattet und OpenVPN bzw. Stunnel installiert.

OpenWRT habe ich über die TFTP Pushbutton Methode installiert. Im Freifunk Forum steht beschrieben, wie man da vorgehen muss.

Als nächstes habe ich OpenVPN installiert. In diesem YoutTube Video wird erklärt, wie man OpenVPN installiert und konfiguriert.

Wichtig bei PiVPN ist, dass man für OpenWRT einen Benutzer ohne Kennwort anlegt. Problem ist bei OpenWRT, dass immer eine "auth-user-pass" Datei mit Benutzername und Passwort benötigt wird. Bei den ovpn Schlüsseldateien von PiVPN sind die Schlüssel bereits hinterlegt und man benötigt nur das Passwort. Bei GitHub habe ich diese Lösung gefunden.

Nun muss man noch zum Schluss Stunnel auf den OpenWRT Router installieren, um den VPN Tunnel über den Stunnel Tunnel aufbauen zu können.

Über Putty oder einem anderen Terminalprogramm meldet man sich auf den OpenWRT Router an.

Nacheinander sind folgende Befehle auszuführen

Code: Alles auswählen

opkg update

Code: Alles auswählen

opkg install stunnel
Mit Hilfe von WinSCP passe ich die Konfigurationsdatei stunnel unter /etc/config/ an, .

config service 'OpenVPN-Instanz-Name'
option enabled '1'
option client '1'
option accept_host '127.0.0.1'
option accept_port '10000'
list connect 'SERVER_IP:STUNNEL_PORT'


Danach führt man einmal diese Befehle aus

Code: Alles auswählen

/etc/init.d/stunnel start

Code: Alles auswählen

/etc/init.d/stunnel enable
Jetzt sollte der VPN Tunnel über den Stunnel Tunnel aufgebaut werden können.

Wie man Stunnel installiert und konfiguriert habe ich mir aus diesen beiden Seiten zusammengesucht
https://www.datenzone.de/blog/2012/01/i ... n-openwrt/
https://www.perfect-privacy.com/de/manu ... th_stunnel
Viel zu spät begreifen viele die versäumten Lebensziele: Freude, Schönheit der Natur, Gesundheit, Reisen und Kultur. Darum, Mensch, sei zeitig weise! Höchste Zeit ist’s: Reise, reise! (Wilhelm Busch)
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste