Blog

  • Haselnusskranz vegan

    Haselnusskranz vegan

    Haselnusskranz vegan

    Haselnusskranz vegan

    Ein von mir veganisiertes Haselnusskranz-Rezept
    Vorbereitungszeit 15 Minuten
    Zubereitungszeit 45 Minuten
    Gesamtzeit 2 Stunden
    Gericht Kuchen
    Portionen 1

    Zutaten
      

    • 300 g Weizenmehl Typ 550
    • 2 TL Backpulver
    • 200 g Zucker
    • 1 Päckchen Vanillezucker
    • Wasser
    • 125 g Magerine
    • 200 g Haselnüsse fein gehackt
    • 3 EL Apfelmus
    • Sojasahne

    Anleitungen
     

    • Zutaten für Teig zusammengeben und gut durchkneten:
      – 300g Weizenmehl
      – 2 TL Backpulver
      – 100g Zucker
      – 1 Vanillezucker
      – 2 EL Wasser
      – 125g Magerine
      – 1 EL Apfelmus
    • Teig für 1h kalt stellen.
    • Zuaten für die Haselnusscreme zusammengeben und gut durchkneten:
      – 200g gehackte Haselnüsse
      – 100g Zucker
      – 3-4EL Wasser
      – 2 EL Apfelmus
      – 1 EL Sojasahne
    • Die Haselnusscreme für die restliche Zeit mit kaltstellen.
    • Den Teig rechteckig und dünn auf Backpapier ausrollen, dann mit der Haselnusscreme gleichmäßig bestreichen. Mithilfe des Backpapiers den Teig mit der Creme einrollen und mit dem Backpapier auf dem Blech platzieren. Die Enden der Rolle leicht an die Rolle drücken, sodass der Kuchen überall gleich dick ist.
    • Die Rolle alle paar Zentimeter mit einem Messer einschneiden und die Schnitte leicht auseinander ziehen.
    • Die Rolle von außen mit Sojasahne dünn bestreichen. Dies sorgt später für die Bräunung.
    • Bei 160°C Umluft im Backofen für 45 min backen.
    Keyword vegan
  • Nudeln gldhnchn style

    Nudeln gldhnchn style

    Teller Spaghetti

    Nudeln gldhnchn style

    Nudeln mit einer sahnigen, cremigen Soße
    Zubereitungszeit 13 Minuten
    Gesamtzeit 13 Minuten
    Gericht Hauptgericht
    Küche Italienisch
    Portionen 1

    Zutaten
      

    • Nudeln original gldhnchn style: Spaghetti
    • Olivenöl
    • Hefeflocken
    • Sojasauce
    • Sojasahne
    • Sonnenblumenkerne

    optionale Zusätze

    • Chillisauce
    • Oliven
    • Tofu, geräuchert kleine Würfel

    Anleitungen
     

    • Nudeln gar kochen.
    • Nudelwasser abgießen und Nudeln auf Teller geben.
    • Ordentlich mit Olivenöl übergießen.
    • Eine handvoll Sonnenblumenkerne drüber streuen.
    • Mit Sojasahne übergießen.
    • Einen kleinen Schluck Sojasauce hinzugeben.
    • Optionale Toppings hinzufügen.
    • Nudeln mit Hefeflocken bedecken.
    • Mit einer Gabel alles vermischen, bis alles gleichmäßig auf dem Teller verteilt ist. Es ist wirklich gldhnchn style wenn du dabei ein knetschiges Geräusch hörst!

    Notizen

    Mit den zusätzlichen Toppings kannst du sehr kreativ werden. Ursprünglich aus Faulheit entstanden, hat sich dieses Gericht unter meinen Freund*innen doch an erstaunlich großer Beliebtheit erfreut.
    Keyword vegan
  • Baked Beans auf Krautsalat

    Baked Beans auf Krautsalat

    Baked Beans auf Krautsalat

    Klingt komisch, ist aber geil.
    Zubereitungszeit 2 Minuten
    Gesamtzeit 2 Minuten
    Gericht Hauptgericht
    Küche Deutsch
    Portionen 1

    Zutaten
      

    • Krautsalat
    • Baked Beans in Tomatensauce
    • Oliven
    • Olivenöl
    • Hefeflocken

    Anleitungen
     

    • Krautsalat auf dem Teller verstreichen.
    • Baked Beans in Tomatensauce drüber geben.
    • Ein paar Oliven drauf legen.
    • Ordentlich Olivenöl drüber kippen.
    • Viel Hefeflocken drüber kippen.
    • Eventuell noch mit Salz und Pfeffer abschmecken.
    • Fertig, genießen!

    Notizen

    Den Krautsalat habe ich ebenfalls selber gemacht nach diesem Rezept: chefkoch.de/rezepte/614141161435086/Krautsalat-wie-im-griechischen-Restaurant.html
    In der Variante vom Foto besteht der Krautsalat zur Abwechslung aus Weißkohl und Rotkohl.
    Keyword vegan
  • gldhnchns Frühstücksbrei

    gldhnchns Frühstücksbrei

    gldhnchns Frühstücksbrei

    gldhnchns Frühstrücksbrei

    Frühstücksbrei aus Samen, Kernen, Apfel, getrockneten Früchten, Nüssen und Getreide
    Zubereitungszeit 10 Minuten
    Gesamtzeit 10 Minuten
    Gericht Frühstück
    Küche Deutsch
    Portionen 1

    Zutaten
      

    • 3 Hände Getreideflocken z.B. 6-Korn-Mischung, Haferflocken, Basis Müsli
    • Nüsse z.B. Mandeln, Walnüsse, Haselnüsse
    • Kerne z.B. Kürbiskerne, Sonnenblumenkerne
    • getrocknete Früchte z.B. Rosinen
    • Samen z.B. Sesam, Chiasamen, Leinsamen
    • 1 Apfel
    • Zimt
    • Kürbiskernöl
    • etwas zum Süßen z.B. Ahornsirup, Honig

    Anleitungen
     

    • Samen und Kerne in einem Topf mit Öl leicht rösten.
    • Nüsse grob hacken und in den Topf hinzugeben.
    • Getrocknete Früchte hinzugeben.
    • Apfel klein schneiden und die Hälfte in den Topf hinzugeben. Die andere Hälfte in die Servierschüssel geben.
    • Zwischen 100ml und 200ml Wasser hinzugeben.
    • Getreideflocken hinzufügen und kurz ziehen lassen, dann in Servierschüssel umfüllen.
    • Zimt und weitere Addons wie Kürbiskernöl hinzugeben. Bei Bedarf süßen. Fertig.
    Keyword vegan
  • How to install Signal Desktop without owning a smart phone

    How to install Signal Desktop without owning a smart phone

    When you want to install signal desktop but don’t own a smart phone you could run into some problems. Even if you link signal desktop to a smart phone of a friend, signal desktop gets deactivated when you remove the app of your friends phone. So here are the instructions to get around this problem.

    What you need to install signal desktop

    • a phone with your sim card
    • a smart phone of a friend with android

    Steps to install signal desktop

    1. Install Signal Dekstop on your computer: https://signal.org/de/download/
    2. Install Android sandboxing app Island on your friends smart phone: https://play.google.com/store/apps/details?id=com.oasisfeng.island&hl=en_US
    3. Open Chrome web browser in Island sandbox.
    4. Download Signal apk and install it in Island: https://signal.org/android/apk/
    5. Activate Signal with your own phone number.
    6. Link the Island Signal app to Signal desktop.
    7. Cut the smart phone from internet connection – airplane mode.
    8. Go to settings in Island. Remove the sandox in which you installed Signal.
    9. Remove Island
    10. Done!

    This works even if your friend already got Signal installed on his/her smart phone.

  • 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.

  • IPv4, IPv6 & DS-lite

    IPv4, IPv6 & DS-lite

    Es folgt ein kleiner Artikel in dem ich auf Adressierung innerhalb des Internet Protokolls eingehe und damit DS-lite mit verbundenen Problemen erkläre.

    IP

    Ein wesentlicher Bestandteil der Datenübertragung im Internet bildet IP – das Internet Protokoll. IP ist dabei vor allem für das Routing verantwortlich. Kurz gesagt bedeutet Routing, die Entscheidung zu fällen auf welchem Weg ein Datenpaket von Computer zu Computer schließlich zu seinem Ziel gelangt. Um das zu realisieren wird unter anderem den Netzwerkteilnehmern jeweils eine eindeutige Adresse zugewiesen. Um diese Adressen soll es in diesem Artikel gehen.

    IPv4

    In den Anfängen des Internets wurde von IP die Version IPv4 entwickelt. Mit dieser Version erreichte das Internet große Verbreitung und sie wird auch heute noch zu einem großen Teil genutzt. Eine IPv4 Adresse besteht aus 4 8-bit Blöcken, die mit Punkten von einander getrennt werden. Ein Beispiel wäre 87.142.36.2. Jeder Block kann, aufgrund der 8-bit Größe, einen Wert zwischen 0 und 255 annehmen. Die Gesamtgröße des Adressraums ergibt 32-bit. Daraus folgt, dass 2^32=4.294.967.296 verschiedene Adressen in IPv4 existieren. Das mag viel erscheinen, doch wenn man dies der Anzahl an Menschen gegenüber stellt (über 7.000.000.000), dann wird klar, dass der Adressraum von IPv4 in den heutigen Dimensionen des Internets an seine Grenzen stößt. Das gilt besonders, falls auch jede Lampe mal ans Internet angeschlossen werden sollte (siehe auch IoT). Zudem sind bei weitem nicht alle dieser 2^32 Adressen als globale individuelle Adressen verwendbar, da in dem IPv4 Standard auch einige Adressen mit Spezialanwendung vorgesehen sind.

    Im folgenden Graph ist die Anzahl der verfügbaren IPv4 Adressen über die Zeit aufgetragen.

    Von Mro – Eigenes Werk, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=10593349

    IPv6

    Aufgrund der Begrenzung von IPv4 wurde eine neue Version von IP entwickelt: IPv6. In dieser Version besteht eine Adresse aus 8 16-bit Blöcken, die durch Doppelpunkte getrennt werden, z.B. also: 2001:0db8:85a3:08d3:1319:8a2e:0370:7344. Die Adresse ist damit 128-bit lang. Damit sind 2^128 verschiedene Adressen möglich, das sind 2^96 mal mehr Adressen im Vergleich zu IPv4. Eine unvorstellbar große Menge. Trotz dessen, das IPv6 bereits 1998 eingeführt wurde, ist die Verbreitung von IPv6 noch nicht besonders groß, sie liegt bei etwa 23% (vgl. hier, Stand 2.1.18) Und genau darin liegt auch das Problem bei dem nun in Folge beschriebenen DS-Lite.

    DS-Lite

    Dein Internet Anbieter ist im Endeffekt die Stelle, die bestimmt mit welcher IP Version du im Internet unterwegs bist. Dabei hat dein ISP verschiedene Möglichkeiten, dir IP Adressen zu zuweisen:

    • nur eine IPv4 Adresse: Als Nutzer wirst du hierbei keine Einschränkungen erfahren, da es wahrscheinlich noch(!) keine Dienste gibt, die nur über IPv6 erreichbar sind. Das Problem: IPv4 Adressen gehen zur Neige und sind möglicherweise nicht mehr günstig für deinen ISP zu reservieren.
    • eine IPv6 und eine IPv4 Adresse (dual stack): Dir steht hier als Nutzer die volle Funktionalität beider Internetprotokolle zur Verfügung. Es gilt jedoch das selbe Problem für die IPv4 Adressen.
    • eine IPv6 Adresse + eine getunnelte IPv4 Verbindung (dual stack-lite): Einige ISP in Deutschland gehen mittlerweile zu dieser Methode über. Dein ISP umgeht damit das Problem, dass sie für jeden Kunden eine IPv4 Adresse benötigen. Stattdessen werden Anfragen die du an einen Server stellst, der nur IPv4 verarbeiten kann, über deinen ISP getunnelt. Das Problem hierbei: du bist für das IPv4 Protokoll nicht mehr öffentlich verfügbar.

    Das schöne an der Internet-Infrastruktur ist, dass auf der niedrigsten Ebene keine Hierarchie wie z.B. eine Client-Server Hierarchie etabliert wird. Es ist theoretisch damit jedem möglich mit einer IP-Adresse einen Computer im Internet für alle öffentlich verfügbar zu machen. Diese Möglichkeit wird jedoch in DS-lite begrenzt. Es ist dir zwar noch möglich IPv4 Adressen zu erreichen, da sie für dich getunnelt werden, aber du besitzt keine IPv4 Adresse mehr, mit der du für Anfragen aus dem Internet erreichbar bist. Falls du jedoch einen kleinen Server von deinem Heim-Internetanschluss betreiben willst, ist es eigentlich genau das was du brauchst. Denn von vielen Internetanschlüssen aus, insbesondere aus dem mobilen Internet deines Handys, wirst du noch keine IPv6 Verbindung zu deinem Server herstellen können.

    Genau vor diesem Problem stand ich, da ich meinen Raspberry Pi aus dem Internet erreichbar machen wollte. Wie ich erreicht habe, dass mein Raspberry Pi aus dem Internet erreichbar ist und das sogar für das IPv4 Protokoll, werde ich bald in einem Artikel beschreiben.

    Nützliche Links