Raspberry Pi: Menschen mit Snowflake helfen, Internet-Zensur zu umgehen

1. Internet-ZensurSnowflake

Für eines der größten Probleme unserer Zeit halte ich neben dem Klimawandel die unerträgliche Verbreitung von Propaganda und Desinformation (Fake-News). Der Schaden, der dadurch entsteht, ist kaum zu benennen/fassen. Daher ist es so wichtig, etwas dagegen zu unternehmen. Wenn euer Internetzugang also nicht zensiert ist, dann solltet ihr die Installation bzw. den Betrieb von Snowflake in Betracht ziehen, um Menschen einen Zugang zu freien Informationen zu ermöglichen.

Snowflake wird als Browser-Add-on für Firefox oder Chrome angeboten. Solange der Browser geöffnet ist, helft ihr Menschen in repressiven Staaten wie China oder Russland bei der Umgehung der Internet-Zensur. Im vorliegenden Beitrag erläutere ich die Installation von Snowflake auf einem Raspberry Pi. Der Vorteil dieser Variante: Der kleine Raspberry Pi verbraucht kaum Strom und kann 24/7 den unzensierten Zugang zu Informationen ermöglichen.

Hinweis

Welche Möglichkeiten/Techniken es gibt, die Internet-Zensur zu umgehen, ist im Beitrag »HowTo: Internet-Zensur umgehen und anonym bleiben« ausführlich dargestellt.

2. Snowflake

Snowflake wird vom Tor Project entwickelt. Der Quellcode steht unter der BSD-Lizenz und kann von jedem eingesehen werden. Offiziell wird Snowflake wie folgt beschrieben:

Snowflake is a system to defeat internet censorship. People who are censored can use Snowflake to access the internet. Their connection goes through Snowflake proxies, which are run by volunteers. For more detailed information about how Snowflake works see our documentation wiki.

Wie auch Obfs4 oder Meek-Azure ist Snowflake ein Pluggable Transport, das mit Techniken wie Domain-Fronting in der Lage ist, die staatlichen Blockademaßnahmen zu umgehen. Pluggable Transports sind Teil des Tor-Browsers und lassen sich über Settings -> Tor -> Bridges aktivieren.

Aktiviert nun jemand innerhalb des Tor-Browsers Snowflake, braucht es Snowflake-Gegenstellen, zu denen der Browser dann eine Verbindung aufbauen kann. Und hier kommen wir ins Spiel: Jeder kann mit Snowflake mithelfen, dass Menschen in repressiven Staaten wie Russland eine Verbindung zum Tor-Netzwerk herstellen können. Es genügt ein Browser-Add-on in Firefox oder Chrome zu installieren und schon wird der eigene Rechner zum Snowflake-Proxy. Der Tor-Client (integriert im Tor-Browser) stellt dann eine WebRTC-Verbindung [4] zu eurem Browser her (auf dem Snowflake installiert ist), der dann den Datenverkehr zwischen dem Snowflake-Proxy und der Snowflake-Bridge [5] bzw. dem Tor-Netzwerk vermittelt. Positiv: Snowflake-Nutzer haben keinen juristischen Ärger zu befürchten, da die angefragten Websites nicht über seinen Internetanschluss abgerufen werden, sondern über den Proxy ins Tor-Netzwerk geleitet werden. Die »letzte Meile« bzw. der finale Aufruf zum Dienst/Website erfolgt in diesem Konzept weiterhin durch den Exit-Node:

Snowflake -> Tor

Je mehr Nutzer Snowflake installiert haben, desto schwieriger können die Verbindungen blockiert werden. Jeder Proxy hat eine eigene IP-Adresse, die die Zensoren blockieren müssen. Bei der Vielzahl an IP-Adressen, die ständig wechseln und damit ungültig werden ist es nicht möglich alle zu sperren.

Nachfolgend wird die Installation von Snowflake auf einem Raspberry Pi beschrieben. Alternativ zu diesem Weg wird ebenfalls ein Docker-Image oder Ansible Role angeboten.

Mache ich dann etwas Verbotenes?

Nein. In Rechtsstaaten ist die Nutzung des Tor-Netzwerks nicht verboten. Wenn ein Nutzer aus einer gefilterten/blockierten Region eine Website aufruft, wird für den Betreiber, Behörden etc. lediglich die IP-Adresse des Tor-Exit-Knotens sichtbar sein – und nicht die IP-Adresse eures Anschlusses. Das einzige, was man euch vorwerfen kann, ist: Ihr nutzt das Tor-Netzwerk. Das ist jedoch (zumindest) in Deutschland und anderen Rechtsstaaten legal.

3. Basisinstallation

Für die Installation ist mindestens eine microSD-Karte mit 4 Gigabyte erforderlich. Nachfolgend sind alle Schritte beschrieben, mit denen zunächst das Raspberry Pi OS (Debian Bullseye) auf die microSD-Karte installiert wird.

3.1 Raspberry Pi OS laden und entpacken

Mit dem Raspberry Pi Imager, der für Windows, macOS und Linux (Ubuntu) bereitgestellt wird, lässt sich das Raspberry-Pi-OS-Image einfach auf die SD-Karte transferieren. Nach der Installation der Software muss im Grunde lediglich die SD-Karte mit dem Rechner verbunden und das entsprechende Image (Raspberry Pi OS Lite) ausgewählt werden. Ein kurzes Video How to use Raspberry Pi Imager beschreibt den Vorgang.

Es gibt aber auch andere Wege, um das Raspberry-Pi-OS-Image auf die SD-Karte zu transferieren. Nachfolgend wird dies kurz beschrieben. Vorab muss dazu das Raspberry-Pi-OS-Image auf den Rechner geladen werden. Klickt auf den Link und klickt anschließend auf den Download-Button bei Raspberry Pi OS Lite.

Das gepackte Image (bspw. 2022-01-28-raspios-bullseye-armhf-lite.zip) muss zunächst entpackt werden:

  • Windows: Mit 7Zip oder Winrar entpacken
  • Linux: Je nach Distribution ist ein grafisches Entpack-Tool bereits mitgeliefert
  • macOS: Anklicken und auspacken

Steckt anschließend die SD-Karte in euren Rechner bzw. das Lesegerät.

3.2 Image auf SD-Karte transferieren

Anschließend muss das entpackte Image (bspw. 2022-01-28-raspios-bullseye-armhf-lite.img) auf die SD-Karte übertragen werden. Am einfachsten funktioniert das mit Etcher – einem quelloffenen Tool für Windows, Linux und macOS.

  • Etcher: Zunächst wählt ihr Select Image und navigiert dann zum Ordner, in dem sich das entpackte Image befindet und wählt es aus. Anschließend wählt ihr das Ziellaufwerk, in unserem Fall also die eingelegte SD-Karte. Mit einem Mausklick auf Flash wird der Vorgang gestartet.
  • Linux (Terminal): sudo dd bs=4M conv=fsync if=2022-01-28-raspios-bullseye-armhf-lite.img of=/dev/sdX – stellt unbedingt sicher, dass ihr bei /dev/sdX das korrekte Device/Gerät angeben habt (also die SD-Karte). Eine ausführliche Beschreibung zur Installation über das Linux-Terminal findet ihr hier.
  • macOS (Terminal): sudo dd bs=1m if=2022-01-28-raspios-bullseye-armhf-lite.img of=/dev/rdiskN; sync – stellt unbedingt sicher, dass ihr bei /dev/rdiskN das korrekte Device/Gerät angeben habt (also die SD-Karte). Eine ausführliche Beschreibung zur Installation über das macOS-Terminal findet ihr hier.

3.3 SSH-Zugriff ermöglichen

Damit der SSH-Zugriff auf den Raspberry Pi möglich ist, muss dies zunächst aktiviert werden:

For headless setup, SSH can be enabled by placing a file named ssh, without any extension, onto the boot partition of the SD Card. When the Raspberry Pi boots, it looks for the ssh file. If it is found, SSH is enabled and the file is deleted. The content of the file does not matter; it could contain text, or nothing at all.

Legt also einfach eine neue Datei mit der Bezeichnung ssh auf der Boot-Partition der SD-Karte an. Das veranlasst den Raspberry Pi, den SSH-Zugriff zu aktivieren.

3.4 Raspberry Pi anschließen

Nachdem der Flash-Vorgang abgeschlossen ist, wird die SD-Karte vom Rechner entfernt und in das vorgesehene Einschubfach im Raspberry Pi gesteckt. Verkabelt den Raspberry Pi nun vollständig und schließt ihn mit dem Netzwerk- bzw. Ethernet-Kabel direkt an einem freien Port an eurem Router an.

3.5 Im Netzwerk erkennen

Ihr könnt den Raspberry Pi nun zum ersten Mal starten. Im Normalfall sollte euer Router einen bestimmten IP-Adressbereich reserviert haben, um mittels DHCP eine IP-Adresse an den Pi zu vergeben. Da die IP-Adresse dynamisch vergeben wird, müsst ihr natürlich herausfinden über welche IP-Adresse, der Pi nun erreichbar ist:

  • Router-Interface: Über das Router-Interface solltet ihr die IP-Adresse ablesen können. Bei einer Fritz!Box findet ihr die vergebene Adresse unter Heimnetz -> Netzwerk. Der Gerätename lautet raspberrypi. Mit einem Klick auf den Stift am Ende der Zeile könnt ihr die IP-Adresse ändern.
  • nmap: Mit nmap einfach kurz das lokale LAN scannen: nmap 192.168.1.0/24

4. Snowflake-Installation

Nachfolgend wird die Installation auf einem frisch ausgerollten Raspberry Pi OS dargestellt. Damit Snowflake funktioniert, sollte mindestens Debian Bullseye installiert sein. Das aktuelle Raspberry Pi OS erfüllt diese Anforderungen.

4.1 Installation

Zunächst wird eine SSH-Verbindung zum Raspberry Pi hergestellt – nachfolgend müsst ihr die IP-Adresse natürlich anpassen:

ssh pi@192.168.50.100 [Standardpasswort lautet raspberry]

Das Standard-Passwort sollte aus Sicherheitsgründen verändert werden:

passwd

Danach erfolgt erstmal eine Aktualisierung des Systems bzw. der installierten (Debian-)Pakete:

sudo apt-get update
sudo apt-get upgrade

Für den Betrieb von Snowflake müssen die folgenden (Debian-)Pakete installiert werden:

sudo apt-get install git
sudo apt-get install golang

Danach kann der Quellcode von Snowflake mittels git heruntergeladen werden:

cd
git clone https://git.torproject.org/pluggable-transports/snowflake.git

Anschließend wechseln wir in das Snowflake-Verzeichnis und lösen den Build-Vorgang aus:

cd snowflake/proxy
go build

Danach ist Snowflake einsatzbereit. Mittels nohup wird der Snowflake-Proxy gestartet und alle Aktivitäten in ein Logfile geschrieben:

nohup /home/pi/snowflake/proxy/proxy > /home/pi/snowflake/proxy/snowflake.log 2>&1 &

Mit dem nachfolgenden Befehl lässt sich der Status ausgeben bzw. wie viele Verbindungen über Snowflake initiiert wurden:

cat /home/pi/snowflake/proxy/snowflake.log

Beispielausgabe:

2022/04/05 08:09:25 In the last 1h0m0s, there were 14 connections. Traffic Relayed ↑ 32 MB, ↓ 2 MB.
2022/04/05 09:09:25 In the last 1h0m0s, there were 20 connections. Traffic Relayed ↑ 23 MB, ↓ 4 MB.
2022/04/05 10:09:25 In the last 1h0m0s, there were 21 connections. Traffic Relayed ↑ 193 MB, ↓ 11 MB.
2022/04/05 11:09:25 In the last 1h0m0s, there were 28 connections. Traffic Relayed ↑ 176 MB, ↓ 14 MB.
2022/04/05 12:09:25 In the last 1h0m0s, there were 13 connections. Traffic Relayed ↑ 45 MB, ↓ 4 MB.
[...]

4.2 Autostart

Nach einem Neustart des Raspberry Pi müsst ihr den Start-Befehl erneut ausführen. Da kann man mit systemd sicherlich ein schickes Service-Script basteln, um Snowflake automatisch zu starten. Nachfolgend eine einfache Lösung, die ohne systemd auskommt:

sudo crontab -u pi -e

Und dort einfügen:

@reboot nohup /home/pi/snowflake/proxy/proxy > /home/pi/snowflake/proxy/snowflake.log 2>&1 &

Hilf mit die Spendenziele zu erreichen!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

4.3 Update

Ein Update der Snowflake-Umgebung sollte wie folgt möglich sein:

kill -9 $(pidof proxy)
cd /home/pi/snowflake/
git pull https://git.torproject.org/pluggable-transports/snowflake.git
cd /home/pi/snowflake/proxy
go build

Anschließend muss Snowflake wieder gestartet werden:

nohup /home/pi/snowflake/proxy/proxy > /home/pi/snowflake/proxy/snowflake.log 2>&1 &

5. Technische Details

Wer sich für die technischen Details hinter Snowflake interessiert, dem sei ein Blick auf das Technical Overview empfohlen. Anbei ein Auszug, wie der Vermittlungsprozess zwischen zwei Snowflake-Peers abläuft:

  • Ein Nutzer in einer Region mit Internet-Zensur möchte auf das freie und offene Internet zugreifen. Er öffnet dazu den Tor-Browser und wählt Snowflake als Pluggable Transport aus. Dadurch wird der Snowflake-Client gestartet.
  • Freiwillige außerhalb der gefilterten/blockierten Region stellen mit dem Add-on (Firefox / Chrome) oder als Stand-Alone-Lösung einen Snowflake-Proxy bereit.
  • Der Snowflake-Client findet mittels Rendezvous-Strategie automatisch einige dieser freiwilligen Snowflake-Proxys.
  • Diese beiden Snowflake-Peers stellen anschließend eine Peer-to-Peer-Verbindung über WebRTC her.
  • Sobald WebRTC bereit ist, gibt der Snowflake-Client den WebRTC-Transport für die Nutzung durch Tor frei.
  • In der Zwischenzeit verbindet sich der Snowflake-Proxy des Freiwilligen mit einem Tor-Relay und beginnt, den Verkehr zwischen dem Snowflake-Client und dem Tor-Relay weiterzuleiten.
  • Der Snowflake-Proxy ermöglicht also den Zugriff auf das Tor-Netzwerk, mit dem ein Nutzer aus einer gefilterten/blockierten Region anschließend ungefiltert auf das Internet zugreifen kann.

Für diesen Vorgang sind drei Komponenten notwendig:

  • Snowflake-Client: Der Snowflake-Client ist Teil des Tor-Browsers. Mittels Rendezvous-Strategie (siehe Broker) baut er eine Verbindung zu einem Snowflake-Proxy auf.
  • Snowflake-Proxy: Der Snowflake-Proxy vermittelt Daten zwischen Snowflake-Clients und einem Ziel bzw. Website im Tor-Netzwerk. Damit der Snowflake-Proxy gefunden werden kann, meldet er sich bei einem Broker.
  • Broker: Damit sich Snowflake-Clients und Snowflake-Proxys finden können, ist eine Rendezvous-Strategie erforderlich. Diese Aufgabe erfüllt der Broker, der den (Erst-)Kontakt zwischen Snowflake-Client und Snowflake-Proxy herstellt.

Der komplette Vorgang ist auf einem Diagramm skizziert:

Snowflake-Client <-> Snowflake-Proxy <-> Tor

6. Fazit

Ein freies und unzensiertes Internet ist zu einem wichtigen Bestandteil unserer Demokratie und Zivilgesellschaft geworden. Wenn euer Internetzugang also nicht zensiert ist, dann solltet ihr die Installation bzw. den Betrieb von Snowflake in Betracht ziehen, um Menschen in repressiven Staaten einen Zugang zu freien Informationen zu ermöglichen.

Bildquellen:

Snowflake: Tor Project from Snowflake Tor Project
Snowflake diagram: Tor Project from Technical Overview

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

3 Ergänzungen zu “Raspberry Pi: Menschen mit Snowflake helfen, Internet-Zensur zu umgehen”

  1. Comment Avatar Jonas sagt:

    Hi,

    kleine Ergänzung zum Pi Imager, die die Einrichtung des Systems (gerade für Neulinge) eventuell erleichtert: Drückt man STRG, SHIFT und X erscheint ein zusätzliches Fenster mit erweiterten Optionen. Dort kann man dann Dinge wie den SSH-Zugang über die GUI aktivieren.

    Beste Grüße!

  2. Comment Avatar Johannes sagt:

    Hi,

    ich hatte zunächst den Microblog-Artikel zur Installation gelesen und war beim Befolgen der Anleitung bis zu der Stelle

    go build

    gelangt, welche mir den Fehler

    cannot find module for path crypto/ed25519

    produziert hat. Grund ist, dass auf meinem Raspberry Pi Debian buster installiert ist, bei welchem die go version 1.11.6 ist. Benötigt wird aber go 1.13+

    Lösung für buster:

    Anstatt go mittels sudo apt-get install golang zu installieren, habe ich hier diesen one-liner gefunden um die aktuelle go Version from source (nach /usr/local/go) zu installieren:

    curl -L https://golang.org/dl/$(curl -s https://api.github.com/repos/golang/go/git/matching-refs/tags/go | grep '/ref' | sed -e '/beta/ d' -e '/rc/ d' -e 's/.*\(go[0-9.]*\).*/\1/' | tail -1).linux-armv6l.tar.gz | sudo tar -xzC /usr/local

    Anschließend noch in /home/pi/.profile die Zeilen

    PATH=$PATH:/usr/local/go/bin
    GOPATH=$HOME/golang

    hinzufügen und Snowflake lässt sich einwandfrei installieren.

  3. Comment Avatar Nick sagt:

    Hallo Mike,

    ein großartiges Timing hast du mit deinem Beitrag. Mit dem aktuellen Konflikt bin Ich ebenfalls auf Snowflake gestoßen und habe es erst einmal als Plugin im Firefox laufen lassen. Sobald mein Desktop an war, war mindestens ein Firefox Tab immer im Hintergrund offen.
    Anfangs wollte Ich schnell das Docker Image auf meinem Pi installieren, wobei es den Container leider nicht für die ARM Architektur gibt.

    Zufällig dann heute deinen Beitrag gefunden und direkt noch mal an den Pi gesetzt, um Ihn zur Abwechslung auch mal sinnvolle Dinge machen zu lassen.
    Dabei störe mich nur die Art der Ausführung mit nohub und &.
    Es wurde also kurzerhand ein systemd service file geschrieben.
    Damit startet snowflake bei systemstart, bei fehlern und es lässt sich einfacher stoppen oder logfiles auslesen.
    In meinem Fall hat es auch einen eigenen User für den Sicherheits Aspekt bekommen.

    1. Erst einmal das service file erstellen:

    sudo vim /etc/systemd/system/snowflake.service

    2. Mit folgendem Inhalt beschreiben:

    [Unit]                                                                                                
    Description=Snowflake
    Wants=network.target
    After=syslog.target network-online.target
    StartLimitIntervalSec=300
    StartLimitBurst=10
    
    [Service]
    Type=simple
    ExecStart=/home/snowflake/snowflake/proxy/proxy
    Restart=on-failure
    RestartSec=5
    KillMode=process
    User=snowflake
    Group=snowflake
    
    [Install]
    WantedBy=multi-user.target
    

    3. Die Berechtigungen anpassen:

    sudo chmod 644 /etc/systemd/system/snowflake.service

    4. Den User snowflake (interaktiv) erstellen:

    sudo adduser snowflake

    5. systemd die service files neu einlesen lassen:

    sudo systemctl daemon-reload

    6. Final snowflake bei systemstart und jetzt sofort starten:

    sudo systemctl start snowflake.service

    Mit dem folgenden Befehl lässt sich dann der Status und auch die aktuellsten Log-Meldungen anschauen:

    sudo systemctl status snowflake.service

    Mit Erfolg mit dem Schnee!

HilfeWenn du konkrete Fragen hast oder Hilfe benötigst, sind das offizielle Forum oder der Chat geeignete Anlaufstellen, um dein Anliegen zu diskutieren. Per E-Mail beantworte ich grundsätzlich keine (Support-)Anfragen – dazu fehlt mir einfach die Zeit. Kuketz-Forum

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.