Schlagwort: raspberry pi

  • 05 Raspberry Pi – selbst Musik streamen mit Cherrymusic

    05 Raspberry Pi – selbst Musik streamen mit Cherrymusic

    In diesem Artikel zeige ich dir wie du deinen Raspberry Pi nutzen kannst um deine eigene Musiksammlung über das Internet zu streamen, ähnlich wie du auch über Spotify Musik streamen kannst. Genau dies ist möglich mit der Software Cherrymusic, um dessen Installation und Konfiguration es in diesem Artikel geht. In der hier beschriebenen Konfiguration wird nginx als reverse-proxy genutzt um Cherrymusic aus dem Internet zu erreichen. Eine direkte Erreichbarkeit ist bei Cherrymusic auch möglich.

    Installation vorbereiten

    Damit Cherrymusic korrekt funktioniert, solltest du vorher folgende Pakete installieren:

    • MARKDOWN_HASH6ed08f3b08906156ac56d5bdedb406e0MARKDOWNHASH
      [Python](https://de.wikipedia.org/wiki/Python
      (Programmiersprache)) ist die Programmiersprache, mit der Cherrymusic programmiert wurde und mit dessen Interpreter es auch ausgeführt wird.
    • sudo apt install ffmpeg imagemagick lame python3-unidecode
      Diese Pakete benötigst du, damit Cherrymusic mit verschiedenen Audiocodecs umgehen kann.
    • sudo apt install git
      Git ist eine Versionskontrollsoftware, mit der du Cherrymusic herunterladen und updaten kannst.
    • sudo apt install python3-pip
      Ein Paketmanager für Python.
    • sudo pip3 install cherrypy
      Cherrypy ist die Webserversoftware auf der Cherrymusic aufbaut. Du kannst Cherrypy entweder selbst mit diesem Befehl installieren oder beim ersten Start von Cherrymusic die Option auswählen, Cherrypy nur lokal für Cherrymusic zu installieren.

    Aus Sicherheitsgründen wird empfohlen, Cherrymusic unter einem eigenen User laufen zu lassen:

    • sudo adduser cherrymusic
    • su cherrymusic Zu user cherrymusic wechseln
    • git clone --branch devel git://github.com/devsnd/cherrymusic.git ~/cherrymusic-devel Damit wird nun Cherrymusic ins home Verzeichnis vom user cherrymusic in den Ordner cherrymusic-devel heruntergeladen. Es wird hierbei der branch development genutzt. Ich habe bisher keine negativen Erfahrungen mit der Stabilität gemacht und kann ihn deshalb weiterempfehlen.

    Cherrymusic konfigurieren

    Zuerst wird Cherrymusic gestartet, damit es die Konfigurationsdateien anlegt.

    • cd ~/cherrymusic-devel/
    • ./cherrymusic

    Unter /home/cherrymusic/.config/cherrymusic/cherrymuic.conf existiert nun eine Konfigurationsdatei. Diese enthält unter anderem:

    • basedir = Hier kann entweder ein direkter Pfad zu deiner Musiksammlung angegeben werden oder ein Ordner in dem du Links zu verschiedenen Orten mit Musik sammelst. z.B. so
      mkdir ~/.local/share/cherrymusic/basedir
      ln -s PATH_TO_MUSIC_COLLECTION ~/.local/share/cherrymusic/basedir/MUSIC_COLLECTION
      dann basedir so angeben:
      basedir = /home/cherrymusic/.local/share/cherrymusic/basedir
    • port = 8080 ist später wichtig für die nginx Konfiguration
    • localhost_only = True Damit wird cherrymusic nur über den nginx reverse proxy erreichbar sein und nicht direkt von außen.
    • rootpath = /cherrymusic Dies ist die Pfadangabe für die reverse proxy Auflösung.
    • ssl_enabled = False Da die SSL Verschlüsselung von nginx gemacht wird, braucht Cherrymusic dies nicht tun.

    Cherrymusic ist fertig konfiguriert und kann gestartet werden.
    cd ~/cherrymusic-devel/
    ./cherrymusic&
    Mit exit wird der user cherrymusic wieder verlassen.
    Damit Cherrymusic automatisch startet, falls der Raspberry Pi rebootet kannst du noch in der Datei /etc/crontab folgende Zeile einfügen:
    @reboot cherrymusic cd /home/cherrymusic/cherrymusic-devel; /home/cherrymusic/cherrymusic-devel/cherrymusic

    nginx konfigurieren

    Im Folgenden wird nginx für Cherrymusic so konfiguriert, dass es sich in jene Konfiguration, die ich in dem Artikel über nginx beschrieben habe, einfügt. Beispielsweise läuft Cherrymusic hinter einem reverse proxy mit der domain example.com. Dafür wird folgende Datei erstellt: /etc/nginx/sites-available/example.com_81.conf
    Mit dem Inhalt:

    server {
        listen localhost:81;
        root /var/www;
        server_name example.com;
        location = / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
        }
    
        location ^~ /cherrymusic {
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            proxy_pass         http://127.0.0.1:8080;
        }
    }

    Hier ist nochmal der Port 8080 und die location Angabe /cherrymusic zu sehen. Um die Konfiguration zu aktivieren muss noch ein Link erstellt werden und nginx neugestartet werden.
    sudo ln -s /etc/nginx/sites-available/example.com_81.conf /etc/nginx/sites-enable/
    sudo service nginx restart
    Fertig! Cherrymusic ist nun unter example.com/cherrymusic erreichbar.

  • 04 Raspberry Pi – nginx konfigurieren (SSL mit letsencrypt)

    04 Raspberry Pi – nginx konfigurieren (SSL mit letsencrypt)

    In diesem Artikel beschreibe ich wie du nginx auf deinem Raspberry Pi installierst und zeige dir eine mögliche Konfiguration.

    Nginx ist eine gute Wahl als Webserver auf einem Raspberry Pi, da Nginx deutlich ressourcenschonender arbeitet als z.B. Apache.

    Nginx installieren

    Nginx ist in den offizielen Paketquellen enthalten und lässt sich einfach installieren mit:
    sudo apt install nginx
    Wenn alles geklappt hat und dein Raspberry Pi korrekt erreichbar ist, solltest du eine default Seite angezeigt bekommen, wenn du den Raspberry Pi über einen Browser mit einer Adresse oder der IP besuchst.

    Nginx allgemein konfigurieren

    Zuerst kannst du einige allgemeine Einstellungen für Nginx in /etc/nginx/nginx.conf überprüfen.

    • user www-data;
      www-data ist der user unter dem nginx läuft. Die Dateien in deinem webroot sollten diesem Nutzer gehören. Das erreichst du mit
      sudo chown -R www-data:www-data /var/www/
    • worker_processes auto;
      Diese Option bestimmt wie viele Threads nginx eröffnet. auto ist hier in den meisten Fällen die richtige Einstellung.
    • server_tokens off;
      Möglicherweise findest du diese Option auskommentiert oder du musst sie selber im http-Block hinzufügen. Diese Einstellung sorgt dafür, dass nginx bei Fehlern nicht mehr seine Versionsnummer preisgibt und ist damit ein Sicherheitsfeature.

    Nginx virtual host Konzept

    Ich habe über die Zeit eine nginx hosts Konfiguration entwickelt, die mir für alle meine Anwendungen volle Kompatibilität bietet. Wenn du nur einen Webserver hinter einer Domain laufen lassen möchtest, ist diese Konfiguration möglicherweise etwas overkill für dich. Ich zeige dir trotzdem welche Vorteile du damit hast. Ich nutze in dieser Konfiguration mehrere virtual hosts um folgenden Aufbau zu erreichen:

    • Gatewayhost:
      Hier trifft der Besucher auf deinen Webserver, typischerweise auf Port 80 für http und Port 443 für https. In diesem virtual host ist einerseits eine Weiterleitung aktiv, die alle Anfragen über http an Port 80 auf https über Port 443 umleitet. Außerdem ist hier die gesamte Konfiguration für SSL. Der Vorteil ist dabei, dass die Konfiguration für SSL nur in einer Datei beschrieben wird und nicht für jeden host eine eigene SSL Konfiguration benötigt wird. Weiterhin wird sichergestellt, dass jede Kommunikation verschlüsselt abläuft, da hosts hinter dem Gatewayhost somit nicht unverschlüsselt erreichbar sind.
    • domain-Auflösung:
      Alle Anfragen werden an einen Port weitergeleitet, z.B. 81. An Port 81 lauschen mehrere hosts, die alle auf verschiedene Domainnamen reagieren.
    • Reverse Proxy:
      Wenn hinter einer Domain verschiedene Services laufen sollen, können weiterhin noch Reverse Proxys über Pfadauflösung konfiguriert werden.

    SSL mit Letsencrypt einrichten

    nginx vorbereiten

    Um ein Zertifikat von Letsencrypt zu beziehen wird zuerst ein virtual host für Letsencrypt erstellt. Dies wird in der Weise getan, die bereits der oben benannten Struktur genügt. Die Dateinahmen beschreiben bei mir entweder den Service oder die domain. Außerdem enthalten sie den jeweiligen Port auf den der host lauscht, um nicht durcheinander zu kommen. Anlegen des Gatewayhosts in der Datei:
    etc/nginx/sites-available/gateway_80_443.conf

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www;
        server_name raspberrypi.abcdefghijklmn.myfritz.net;
    
        location ^~ /.well-known/acme-challenge {
            proxy_pass http://127.0.0.1:82;
            proxy_redirect off;
        }       
    }

    Hinter Port 82 verbirgt sich also der letsencrypt host. Dieser wird angelegt in der Datei:
    /etc/nginx/sites-available/letsencrypt_82.conf

    server {
        listen 127.0.0.1:82;
        server_name 127.0.0.1;  
    
        location ^~ /.well-known/acme-challenge {
            default_type text/plain;
            root /var/www/letsencrypt;
        }
    }

    Um diese hosts zu aktivieren müssen Links von /etc/nginx/sites-enable/ auf die eben erstellen Dateien erstellt werden. z.B. mit
    sudo ln -s /etc/nginx/sites-available/* /etc/nginx/sites-enable/
    Achte dabei darauf, dass sich kein Link mehr zu der default Seite in diesem Verzeichnis befindet. Außerdem sollte der Ordner letsencrypt im webroot erstellt werden
    sudo mkdir /var/www/letsencrypt/
    sudo chown -R www-data:www-data /var/www/

    Wenn du alle Änderungen abgeschlossen hast, kannst du die Konfiguration testen mit:
    sudo nginx -t
    Wenn dies erfolgreich war übernimmst du die Einstellungen indem du nginx neustartest:
    sudo service nginx restart

    letsencrypt installieren

    Nun ist alles bereit um letsencrypt zu nutzen. Installieren kannst du es mit
    sudo apt install certbot

    Zertifikat erstellen

    Mit folgendem Befehl erstellt du dir ein Zertifikat:
    sudo certbot certonly --webroot -w /var/www/letsencrypt -d raspberrypi.abcdefghijklmn.myfritz.net --rsa-key-size 4096
    Du kannst auch weitere Domains angeben für die das Zertifikat gültig sein soll indem du weitere -d Optionen angibst. Die erste -d Option gibt den Hauptnamen des Zertifikats an, welcher auch den Pfad bestimmen wird unter dem die Zertifikate gespeichert werden. Die domain von einem http-Proxy, wie ich ihn hier beschrieben habe, muss nicht angegeben werden, da der http-Proxy eigene Zertifikate benutzt. Eine domain von einem Portmapper wie feste-ip.net kann nicht angegeben werden, da dir nur Subdomains zugewiesen werden und du im Besitz der Hauptdomain sein musst um Letsencrypt zu nutzen.

    Diffie Hellman Parameter erstellen

    Um Perfect Forward Secrecy zu ermöglichen, müssen Diffie Hellmann Parameter erstellt werden. Dieser Vorgang kann einige Stunden dauern. Du kannst die Datei auch auf einem leistungsstärkerem PC als dem Raspberry Pi erstellen, was die Erstellung beschleunigen wird. Dabei ist jedoch darauf zu achten, dass die erstellte Datei nicht unsicher über das Internet auf den Raspberry Pi übertragen wird. Als Ort für die Datei eignet sich z.B. /etc/nginx/ssl. Die Erstellung kann begonnen werden mit
    sudo openssl dhparam -out /etc/nginx/ssl/dhparams.pem 2048
    Für paranoidere Anwender sind auch noch sichere Parameter möglich mit:
    sudo openssl dhparam -out /etc/nginx/ssl/dhparams.pem 4096
    Die Erstellung dauert in dem Fall noch einmal deutlich länger. Es ist auch möglich den Befehl im Hintergrund auszuführen mit
    sudo openssl dhparam -out /etc/nginx/ssl/dhparams.pem 2048&
    Dann ist z.B. auch ein ausloggen möglich und du kannst zu einem späteren Zeitpunkt wiederkommen.

    Zugriffsberechtigungen

    Die Zertifikatsdateien sollten die korrekten Zugriffsberechtigungen haben:
    sudo chmod 600 /etc/letsencrypt/live/raspberrypi.abcdefghijklmn.myfritz.net/*
    sudo chmod 600 /etc/nginx/ssl/dhparams.pem

    nginx für SSL konfigurieren

    Der gatewayhost kann nun so geändert werden, dass jegliche Kommunikation über SSL läuft. Dazu wird wieder etc/nginx/sites-available/gateway_80_443.conf editiert.

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www;
        server_name example1.com example2.com raspberrypi.abcdefghijklmn.myfritz.net;
    
        location ^~ /.well-known/acme-challenge {
            proxy_pass http://127.0.0.1:81;
            proxy_redirect off;
        }
        location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
        }
        location / {
            # Enforce HTTPS
            return 301 https://$server_name$request_uri;
            return 301 https://$server_addr$request_uri;
        }       
    }
    
    server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        server_name _;
        root /var/www;
    
        # Configure SSL
        ssl on;
        # Certificates used
        ssl_certificate /etc/letsencrypt/live/raspberrypi.abcdefghijklmn.myfritz.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/raspberrypi.abcdefghijklmn.myfritz.net/privkey.pem;
    
        # Not using TLSv1 will break:
        #   Android <= 4.4.40
        #   IE <= 10
        #   IE mobile <=10
        # Removing TLSv1.1 breaks nothing else!
            # There are not many clients using TLSv1.3 so far, but this can be activated with nginx v1.13
        ssl_protocols TLSv1.2;
    
        # Using the recommended cipher suite from: https://wiki.mozilla.org/Security/Server_Side_TLS
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
    
        # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
        ssl_dhparam /etc/nginx/ssl/dhparams.pem;
    
        # Specifies a curve for ECDHE ciphers.
        # High security, but will not work with Chrome:
        #ssl_ecdh_curve secp521r1;  
        # Works with Windows (Mobile), but not with Android (DavDroid):
        #ssl_ecdh_curve secp384r1;
        # Works with Android (DavDroid):
        ssl_ecdh_curve prime256v1; 
    
        # Server should determine the ciphers, not the client
        ssl_prefer_server_ciphers on;
    
        # OCSP Stapling
        # fetch OCSP records from URL in ssl_certificate and cache them
        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_trusted_certificate /etc/letsencrypt/live/raspberrypi.abcdefghijklmn.myfritz.net/fullchain.pem;
    resolver 192.168.178.1;
    
        # SSL session handling
        ssl_session_timeout 24h;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
    
        # Add headers to serve security related headers
        # HSTS (ngx_http_headers_module is required)
        # In order to be recoginzed by SSL test, there must be an index.hmtl in the server's root
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains" always;
        add_header X-Content-Type-Options "nosniff" always;
        # Usually this should be "DENY", but when hosting sites using frames, it has to be "SAMEORIGIN"
        add_header Referrer-Policy "same-origin" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
    
        location ^~ / {
            client_max_body_size 10G;
            proxy_connect_timeout 3600;
            proxy_send_timeout 3600;
            proxy_read_timeout 3600;
            send_timeout 3600;
            proxy_buffering off;
            proxy_request_buffering off;
            proxy_max_temp_file_size 10240;
            proxy_set_header Host $host;
            proxy_redirect off;
            # Following 2 options are needed when using web sockets
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_pass http://127.0.0.1:81;
        }   
    }

    Weitere virtual hosts

    Die Konfigurierung des gateway hosts ist nun abgeschlossen. Nun können die hosts definiert werden, mit denen ein Besucher am Ende auch interagiert. Um die verschiedenen Möglichkeiten der Konfigurierung zu verstehen, schau dir folgende Beispiele an:

    server {
        listen localhost:81;
        server_name example1.com;
        root /var/www/example1.com/
    
        location = / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
        }
    }
    server {
        listen localhost:81;
        server_name  example2.com; 
        root /var/www/example2.com/;
    
        location = / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
        }
    
        location ^~ /service1 {
            proxy_pass http://127.0.0.1:12345;
        }   
    }

    Mit dieser Konfigurierung gibt es 3 verschiedene Möglichkeiten auf deinen Webserver zuzugreifen.

    1. https://example1.com
      Damit wird dir die index.html aus dem Verzeichnis /var/www/example1.com/ angezeigt.
    2. https://example2.com
      Hier wird die index.html aus dem Verzeichnis /var/www/example2.com/ angezeigt.
    3. https://example2.com/service1
      Nginx wird als reverse proxy genutzt und du greifst auf einen Webdienst zu, der hinter dem lokalen Port 12345 läuft.

    Du wirst auf meinem Blog demnächst verschiedene Beispiele an Anwendungen finden inkl. der Konfigurationen für nginx.

  • 03 Raspberry Pi – Mit DS-lite aus dem Internet erreichbar (Teil 2 – IPv4)

    03 Raspberry Pi – Mit DS-lite aus dem Internet erreichbar (Teil 2 – IPv4)

    In diesem zweiten Teil, zeige ich dir wie du deinen Raspberry Pi auch über IPv4 trotz DS-Lite von außen erreichen kannst. Der Raspberry Pi sollte dafür schon über IPv6 erreichbar sein, siehe Teil1.

    Um dieses Ziel zu erreichen zeige ich euch zwei verschiedene Möglichkeiten: einen Portmapper und einen http-Proxy.

    Portmapper

    Ein Portmapper ist ein Server, der Anfragen entgegennimmt und diese weiterleiten kann, auch wenn der Service nur über IPv6 erreichbar ist, wie z.B. mein Raspberry Pi, dabei beziehen sich die Anfragen immer auf einen spezifizierten Port, daher der Name. Eine Anfrage über einen Portmapper würde z.B. so aussehen:
    portmapper.com:10000 welche die Anfrage weiterleitet auf example.com:80
    Solch einen Dienst bietet feste-ip.net an. Ein universeller Portmapper für 12 Ports an einer Adresse kostet bei feste-ip.net 5€ pro Jahr (die ersten 50 Tage sind kostenlos). Nachdem du dich bei feste-ip.net angemeldet hast, kannst du über die Schaltfläche Unviverseller Portmapper einen Portmapper erstellen:

    Der Alias, den du dir aussuchen kannst, bildet zusammen mit der domain deine Adresse. Also: beispiel.feste-ip.net. Im Feld DNS oder IPv6 Ziel gibst du die Myfritzadresse deines Raspberry Pis an. In den Felder unter Ports gibst du alle Ports an, zu denen du einen Portmapper haben möchtest. Also z.B. 443 für https, 80 für http, 22 für ssh. Wenn du dies nun bestätigst bekommst du folgende Übersicht:

    Hier siehst du nun die Adressen, die für deine Zielports erstellt wurden. In diesem Beispiel wären folgende Zugriffe (über IPv4) nun möglich:

    • ssh pi@beispiel.feste-ip.net -p 36164

    Und wenn auf deinem Raspberry Pi ein Webserver läuft auch:

    Wenn der Webserver auch für SSL konfiguriert ist:

    Der Nachteil in dieser Variante ist, dass in der Adresse nun immer die custom Ports beibehalten werden müssen, was, je nach dem welche Anwendung man auf dem Webserver laufen hat, zu Problem führen kann. Deswegen kommen wir nun zu der zweiten Variante.

    HTTP- / HTTPS-Proxy

    Ein HTTP-Proxy nimmt, ähnlich wie ein Portmapper, Anfragen entgegen und leitet sie an einen anderen Server weiter. Doch hier werden die Ports nicht selber bestimmt, sondern es werden nur Ports genutzt, die auch typischerweise für Webanfragen genutzt werden (80, 443). Cloudflare bietet solch einen Dienst kostenlos an. Doch um diesen Dienst nutzen zu können brauchst du zuerst eine domain, mit der du in Zukunft auf den HTTP-Proxy zugreifst. Dafür bietet sich eine kostenlose Domain von Freenom an. Folgende Schritte sind nun notwendig:

    1. auf Freenom.com eine Domain registrieren: nehmen wir an example.ga
    2. auf Cloudflare.com einen Account anlegen und unter Add Site example.ga eintragen.
    3. example.ga wird nun gescannt, abwarten
    4. Clouflare zeigt dir nun die gecannten Nameserver an und in welche diese geändert werden sollen. Nehmen wir an: bella.ns.cloudflare.com und earl.ns.cloudflare.com
    5. auf Freenom unter Services–>My Domains, dann bei example.ga auf Manage Domain
      weiter bei management tools–>nameservers–>use custom nameservers
      Hier nun die von Cloudflare angeforderten Nameserver eintragen und mit change nameserver bestätigen. Es kann nun einige Stunden dauern, bis die Server sich aktualisiert haben. Wenn du dich bei Cloudflare einloggst, wird dir Cloudflare mitteilen ob die Umstellung schon erfolgreich war.
    6. Sobald die Umstellung erfolgreich war kannst du nun bei example.ga unter DNS weitere Einstellungen vornehmen. Dort legst du zwei cname Einträge an, einen für www.example.ga und einen weiteren für example.ga. Unter Value trägst du in beiden Fällen deine Myfritzadresse des Raspberry Pis raspberrypi.abcdefghijklmnopq.myfritz.net ein. Die beiden orangenen Wolken sollten dabei aktiviert sein.
    7. Zusatz: Bei Clouflare findest du außerdem noch die Option Crypto für deine Website. Hier kannst du verschiedene Möglichkeiten einstellen:
      • Off: nicht zu empfehlen
      • Flexible: nur wenn dein Webserver auf dem Raspberry Pi noch kein SSL eingerichtet hat
      • Full: wenn du zwar SSL eingerichtet hast, jedoch mit selbst signierten Zertifikaten
      • Full strict: wenn du SSL korrekt eingerichtet hast mit Zertifikaten, die von einer CA herausgegeben sind (z.B. letsencrypt)
        (Siehe auch hier)
        Zur Einrichtung von SSL und nginx folgen noch Artikel.

    Glückwunsch! Dein Webserver auf dem Raspberry Pi ist nun unter example.ga erreichbar.

    Fazit

    Beide Varianten haben Vor- und Nachteile, die hier noch einmal aufliste.

    Port-mapper

    Vorteile:

    • Für beliebige Ports nutzbar –> beliebige Services (z.B. ssh)

      Nachteile:

    • nicht kostenlos
    • Adresse immer mit custom port
    • https lässt sich nicht korrekt konfigurieren, da du kein Zertifikat auf die Portmapper Adresse austellen kannst

    HTTP-Proxy

    Vorteile:

    • https funktioniert vollständig
    • beliebige, schicke Adressen
    • kostenlos

      Nachteile:

    • nur für Webdienste geeigenet

    Ich nutze um auf den Webserver auf dem Raspberry Pi zuzugreifen immer den HTTP-Proxy, example.ga. Den Port-mapper nutze ich aber noch zusätzlich um meinen Raspberry Pi von überall auch per ssh erreichen zu können. Ich habe geplant einen VPN Dienst zum Raspberry Pi aufzubauen, das wäre dann auch nur über den Port-mapper möglich.

  • 02 Raspberry Pi – Mit DS-lite aus dem Internet erreichbar (Teil 1 – IPv6)

    02 Raspberry Pi – Mit DS-lite aus dem Internet erreichbar (Teil 1 – IPv6)

    Du würdest deinen Raspberry Pi gerne als Webserver benutzen doch hast nur DS-Lite Zugang zum Internet? In diesem Artikel zeige ich dir, wie du deinen Raspberry Pi oder auch andere Geräte von außen sowohl über IPv6 als auch IPv4 erreichbar machst. Hier in Teil 1 geht es um den IPv6 Teil, wenn du schon sicher bist, dass du du über IPv6 erreichbar bist, dann geht es hier direkt zu Teil 2

    Voraussetzungen / Vorwissen

    • An einigen Stellen sind Einstellungen im Router entscheidend, hier handelt es sich um eine Fritzbox
    • Dein Raspberry Pi sollte über das lokale Netz bereits erreichbar sein, siehe Erste Schritte
    • Zum Thema, was DS-lite bedeutet siehe hier: IPv4, IPv6 & DS-lite

    Router Einstellungen

    IPv6

    Zuerst überprüfen wir einige Einstellungen am Router. Wenn du dich auf deiner Fritzbox in deinem Browser über die Adresse fritz.box anmeldest, bekommst du eine Übersichtsseite angezeigt. Hier sind bereits einige Informationen interessant.

    Hier weißt die Fritzbox auf die DS-Lite Verbindung hin: "FRITZ!Box verwendet einen DS-Lite Tunnel" Die zugehörige Einstellung befindet sich unter Internet–>Zugangsdaten–>IPv6. Einstellungen, die zu einer DS-Lite Verbindung gehören sehen folgendermaßen aus:

    Bitte denke daran, dass dies keine Einstellungen sind, die du selber aussuchen kannst, sondern sie werden dir von deinem Internet Provider vorgegeben. Falls du hier andere Einstellungen verwendest, ist dieses Anleitung möglicherweise nicht vollständig für dich geeignet.

    Eine weitere Einstellung, die ich lange nicht gefunden habe, da sie etwas versteckt ist, findest du unter Netzwerk–>Netzwerkeinstellungen. Hier musst du unter dem Punkt IP-Adressen auf die Schaltfläche IPv6-Adressen klicken.

    Es offenbaren sich dir nun unter anderem folgende Optionen:

    Hier ist es wichtig die dritte Option der DHCPv6 Optionen auszuwählen. Dies sorgt dafür, dass eine IPv6 Adresse aus dem Adressbereich, der dir von deinem ISP zugewiesen wird, an ein Gerät in deinem Netzwerk weiterverteilt wird. Denn die Freigabe von Geräten geschieht bei IPv6 nicht mehr wie bei IPv4 über Portfreigaben, sondern es werden Adressen aus dem Adressbereich, den du von deinem ISP zugewiesen bekommst, an Geräte, die du freigibst, weiter verteilt. Dies führt dazu, dass diese Geräte, dann mit einer eigenen IPv6 Adresse direkt ansprechbar sind.

    Myfritz

    AVM bietet dir über Myfritz einen eigenen DynDNS-Dienst an. Dazu musst du dich zuerst bei Myfritz registrieren. Dies kannst du tun indem du innerhalb deines Fritzbox Interfaces rechts oben auf die Schaltfläche MyFRITZ! klickst. Nachdem du dich erfolgreich bei Myfritz registriert hast, kannst du deine Fritzbox nun unter Internet–>MyFRITZ!-Konto mit deinem Myfritz Konto verbinden.

    Wenn die Fritzbox erfolgreich mit deinem Konto verbunden ist, findest du auf der selben Seite etwas weiter unten nun deine persönliche Myfritz Adresse. Diese hat das Format abcdefghijklmnopqr.myfritz.net. Außerdem kannst du hier, durch setzen eines Häckchens, deine Fritzbox über diese Adresse erreichbar machen. Beachte dabei auch den Hinweis, dass du hierfür noch einen Benutzer anlegen musst, dem du dies gestattest.

    Eine weitere nützliche Option ist das Anschalten von letsencrypt Zertifikaten. Damit besorgt sich deine Fritzbox automatisch ein Zertifikat, mit welchem keine Sicherheitswarnung mehr angezeigt wird, wenn du die Fritzbox über https besuchst. (Nur in sehr neuen FritzOS Versionen verfügbar, evtl nur in Labor-Versionen)

    Nachdem du diese Schritte alle vollended hast, probiere doch direkt mal aus ob deine Fritzbox nun mit deiner Myfritz-Adresse erreichbar ist. (Dies ist nur über IPv6 möglich)

    Geräte freigeben

    Der nächste Schritt wird sein, die Fritzbox nun so zu konfigurieren, dass sie Anfragen an den Raspberry Pi durchlässt. Dazu findest du unter Internet–>Freigaben–>Portfreigaben die Schaltfläche Gerät für Freigaben hinzufügen.

    Hier kannst du unter deinen Geräten den Punkt raspberrypi suchen. Wenn die diesen auswählst, werden automatisch alle korrekten Adressdaten übernommen. Achte darauf, dass die IPv6-Interface-ID, die hier angegeben ist auch wirklich mit der zugewiesenen Adresse deines Raspberry Pis übereinstimmt. Du kannst das überprüfen indem du dich per ssh auf deinem Raspberry Pi einloggst und dort ip a eingibst, welches die Kurzform für ip address ist. Die Zeile in der Ausgabe, die nun entscheidend ist, sieht in etwa so aus:

    inet6 xxxx:xxxx:xxxx:xxxx:55cf:77d:9d4c:80fc/128 scope global noprefixroute dynamic

    inet6 sagt dir, dass es sich um eine IPv6 Adresse handelt. Die ersten vier Adressblöcke werden dir von deinem Provider zugewiesen. Die letzten vier Blöcke bilden die IPv6 Interface ID deines Raspberry Pis. Der Präfix /128 gibt die Aufteilung der Adresse in Netzadresse und Netzteilnehmer an, so wie die Subnetzmaske bei IPv4. (siehe auch Aufteilung des IPv6 Adressraums)

    Als weiteren Schritt solltest du die folgenden Optionen aktivieren:

    Um eine Myfritz Adresse für den Raspberry Pi zu generieren klickst du dann auf die Schaltfläche Neue Freigabe. Hier wählst du die Option MyFRITZ!-Freigabe. Das ausgewählte Schema macht für unseren IPv6 Fall hier keinen Unterschied, wähle einfach http aus. Wenn du die Einstellungen alle vorgenommen hast, speicherst du diese. Wenn du nun zurück kehrst zu der Myfritz Freigabe des Raspberry Pis wird dir hier die Myfritz Adresse des Raspberry Pis angezeigt. Diese hat das Format raspberrypi.abcdefghijklmnopqr.myfritz.net.

    Erreichbarkeit testen

    Dies sind nun auch schon alle Einstellungen, damit der Raspberry Pi per IPv6 aus dem Internet erreichbar ist. Ein nützliches Tool, welches ich dir an dieser Stelle vorstellen möchte, da es mir während der Konfiguration eine große Hilfe war, ist ein Online IPv6 Ping Tool.

    Auf dieser Seite kannst du die Myfritz Adresse deines Raspberry Pis angeben. Wenn alles geklappt hat, sollte dir hier eine positive Rückmeldung angezeit werden. Außerdem sollte hier die IPv6 Interface ID deines Raspberry Pis in den letzten 4 Blöcken der angepingten IPv6 Adresse wieder sichtbar werden. Der Ping auf deinen Raspberry Pi sollte auf jeden Fall funktionieren, bevor du deinen Kopf an anderen Stellen zerbrichst. Du kannst dich auf deinen Raspberry Pi bei vorhandener IPv6 Verbindung jetzt übrigens auch einloggen über:
    ssh pi@raspberrypi.abcdefghijklmnopqr.myfritz.net

    Auch ein Websever auf deinem Raspberry Pi sollte jetzt über IPv6 erreichbar sein. Falls noch kein Webserver auf deinem Raspberry Pi läuft, kannst du dies schnell testen indem du nginx installierst mit:
    sudo apt install nginx
    Wenn du nun raspberrypi.abcdefghijklmnopqr.myfritz.net in deinen Browser eintippst, sollte dir die Default Seite von nginx angezeigt werden. (Zur weiteren Konfiguration von nginx folgen noch Artikel)

    Hier geht es zu Teil 2.

  • 01 Raspberry Pi – Erste Schritte

    01 Raspberry Pi – Erste Schritte

    Mit diesem Post beginnt eine kleine Reihe von mir wie ich verschiedene Software auf meinem Raspberry Pi eingerichtet habe. Dieser Artikel soll die Grundvoraussetzungen schaffen um mit dem Raspberry Pi zu arbeiten.

    Voraussetzungen

    • Raspberry Pi
    • microSD Karte (mind. 2GB, empfohlen 8GB oder mehr)
    • USB – microUSB Kabel für die Energieversorgung + ein Netzstecker für USB Kabel oder ein Gerät welches die Energie per USB Port liefert, z.B. ein Router
    • ein LAN Kabel (neue Raspberry Pis haben auch eine WLAN Schnittstelle, LAN ist trotzdem die Variante mit der stabileren Verbindung)
    • Ein Router
    • Ein Computer mit SD-Kartenslot
      Alle Tutorials sind aus Sicht eines Ubuntunutzers geschrieben. Daher sind diese mit einem unixoiden Betriebssystem sicherlich leichter nachzuvollziehen.

    Ziele

    Raspberry Pi einrichten

    Nachdem du alle Zutaten beisammen hast können wir mit dem Einrichten des Raspberry Pis beginnen.

    Betriebssystem installieren

    Eine Reihe vieler verschiedener Betriebssysteme für den Raspberry Pi findest du hier. Ich nutze das Betriebssystem Raspbian Stretch Lite, welches auf Debian Strech basiert. Der Zusatz "Lite" bedeutet, dass das Betriebssystem keine grafische Oberfläche besitzt, sondern nur über Kommandozeile zu bedienen ist. Ein sogenanntes headless System.

    1. Lade Debian Stretch Lite hier herunter.
    2. Entpacke die zip Datei z.B. mit unzip 2018-04-18-raspbian-stretch-lite.zip
    3. Schau dir mit lsblk deine Speichermedien an.
    4. Lege deine microSD Karte in dein SD-Kartenlesegerät ein.
    5. Schau dir mit lsblk deine Speichermedien erneut an. Das neu hinzugekommene ist deine SD-Karte. Sie könnte z.B. sdb heißen. Du erkennst sie außerdem an der passenden Speicherkapazität.
    6. Falls die SD-Karte gemountet wurde, erkennbar daran, dass in der Zeile der SD-Karte sdb oder auch einer Partition der SD-Karte z.B. sdb1 ein Mountpoint beschrieben ist z.B. /media/: SD-Karte unmounten mit sudo umount sdb
    7. Schreibe nun das Betriebssystem auf die SD-Karte
    sudo dd if=2018-04-18-raspbian-stretch-lite.img of=/dev/sdb bs=4M status=progress

    Achtung! Überprüfe diese Zeile sehr genau. if steht für input file und sollte die heruntergeladene Datei beinhalten. of steht für output file und sollte auf jeden Fall die korrekte Bezeichnung deiner SD-Karte haben. Gemeint ist hier die Bezeichnung sdb, die gesamte SD-Karte und nicht eine einzelne Partition wie z.B. sdb1. Wenn du hier nicht die SD-Karte einträgst, sondern z.B. deine Festplatte wirst du damit alle deine Daten auf der Festplatte verlieren. bs steht für block size. Ein hoher Wert beschleunigt den Vorgang, die Option ist jedoch nicht entscheidend. status=progress sorgt dafür, dass du während des Kopierens eine Fortschrittsanzeige bekommst.
    Kleine Zusatzinfo: Falls du dich fragst warum du auf die SD-Karte als "file" zugreifst, schau hier.

    1. SSH aktivieren: Dazu legst du auf der neu entstandenen Partition "boot" auf der SD-Karte eine Datei mit dem Namen "ssh" an, z.B. mit touch ssh
      Fertig! Das Betriebssystem Raspbian Stretch Lite befindet sich nun einsatzbereit auf deiner SD-Karte.

    Raspberry Pi in Betrieb nehmen

    1. Stecke die microSD-Karte in den Raspberry Pi.
    2. Verbinde den Raspberry Pi per LAN Kabel mit deinem Router.
    3. Schließe den Raspberry Pi per USB Kabel an eine Energieversorgung an.
      Fertig! Es sollte nun die rote Power-LED leuchten und gelegentlich die grüne Busy-LED blinken.

    Mit dem Raspberry Pi per SSH verbinden

    Der Raspberry Pi ist standardmäßig so konfiguriert, dass er sich von einem Router eine IP Adresse zuweisen lässt. Diese musst du als nächstes herausfinden. Dazu besuchst du über einen Browser deinen Router, in meinem Fall eine Fritzbox, also mit fritz.box.
    IP Adresse vom Raspberry Pi
    Über das Menü navigierst du zu Heimnetz -> Netzwerk. Dort findest du unter Netzwerkverbindungen ein Gerät mit dem Namen raspberrypi. Weiterhin erkennst du deinen Raspberry Pi anhand der LAN-Buchse an der du den Raspberry Pi angeschlossen hast. In diesem Fall LAN 4. Direkt daneben erkennst du die lokale IP-Adresse, hier: 192.168.178.90 Die Standard Benutzerdaten sind:

    • Benutzer: pi
    • Passwort: raspberry

    Das Einloggen ist also nun, wenn du dich im selben lokalen Netzwerk befindest, möglich mit:

        ssh pi@192.168.178.90

    Nun wirst du nach einem Passwort gefragt, dies ist das eben genannte. Fertig! Du hast dich soeben erfolgreich per ssh auf deinem Raspberry Pi eingeloggt.

    Als ersten Schritt auf deinem Raspberry Pi und als wichtigen letzten Schritt in diesem Artikel solltest du noch das Standardpasswort zu einem eigenen ändern mit passwd.

    Nützliche Links