n.eko – die virtuelle Browserumgebung oder VPN-Alternative

Allgemein Linux

Vielleicht kennst du das auch: Du befindest dich in einer IT-Umgebung, in der der Zugriff auf eine Vielzahl von Internetadressen durch ein strenges Regelwerk verhindert wird. Das habe ich als Herausforderung aufgefasst und versucht, diese (Schutz)maßnahmen mit Alternativen zu umgehen. Aber auch ohne diese Herausforderung möchte ich dir n.eko empfehlen. n.eko ist eine Open-Source-Browserumgebung, mit der du unterschiedliche Browser (Firefox, Chrome, Waterfox, Brave, Vivaldi usw.) sowie ganz andere Linux-Anwendungen wie z. B. VLC oder Remmina (ein RDP-Client) in einem installierten Docker-Container über das Internet (oder Intranet) im Browser verfügbar machen kannst. Letzteres kann TeamViewer und ähnliche Programme ersetzen.

N.eko nutzt WebRTC, um einen Desktop direkt aus einem Docker-Container zu streamen. Mehrere Leute können gleichzeitig darauf zugreifen. Das eignet sich zum Beispiel auch für interaktive Präsentationen, Support oder Workshops.

Mit n.eko kannst du ganz einfach Apps oder ganze Desktops in einem Container streamen, ähnlich wie bei Kasm Workspaces. Außerdem kannst du mit n.eko einen abgeschotteten Browser verwenden, der keine Cookies auf deinem Rechner speichert und dich vor Werbe-Tracking und Fingerprinting schützt. Wenn n.eko im Firmennetzwerk läuft, kannst du sogar ohne VPN auf interne Webseiten oder Anwendungen zugreifen – das ist ziemlich praktisch!

Du merkst schon, die Möglichkeiten sind mehr als vielseitig. Alles, was du brauchst, ist ein Docker-Host mit mindestens zwei Kernen und zwei GB RAM. Empfohlen werden jedoch mindestens sechs Kerne und vier GB RAM. Das klingt nach viel, bedenke aber, dass du einen vollwertigen Browser in voller Bildschirmauflösung mit Videostreaming bzw. einen vollständigen Desktop virtualisierst und streamst.

Legen wir also los: Logge dich in deinen VPS oder Proxmox-Container ein (ich habe mich mal wieder für einen Debian-CT entschieden) und bringe das System auf den aktuellen Stand.

sudo apt update && apt upgrade -y

Dann laden wir uns das Skript für die Docker-Repositories herunter und führen es aus. Du könntest auch einfach sudo apt install docker docker-compose ausführen, aber dann hast du halt nicht die aktuellste Docker-Version.

curl -sSL https://get.docker.com/ | CHANNEL=stable bash

Im nächsten Schritt installieren wir docker und docker-compose:

sudo apt-get update
sudo apt-get install docker-compose-plugin

Und dann kannst du auch direkt n.eko herunterladen und starten:

wget https://raw.githubusercontent.com/m1k1o/neko/master/docker-compose.yaml
sudo docker compose up

Wenn du statt ich ein grafisches Debian (oder Derivat) nutzt, dann kannst du n.eko bereits jetzt im lokalen Browser durch http://localhost:8080 aufrufen. Ansonsten fährst du den Container mit STRG-C direkt wieder herunter und wir schauen und erstmal die Konfiguration mit nano docker-compose.yaml an:

services:
  neko:
    image: "ghcr.io/m1k1o/neko/firefox:latest"
    restart: "unless-stopped"
    shm_size: "2gb"
    ports:
      - "8080:8080"
      - "52000-52100:52000-52100/udp"
    environment:
      NEKO_DESKTOP_SCREEN: 1920x1080@30
      NEKO_MEMBER_MULTIUSER_USER_PASSWORD: neko
      NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD: admin
      NEKO_WEBRTC_EPR: 52000-52100
      NEKO_WEBRTC_ICELITE: 1

Okay, dann gehen wir Zeile für Zeile durch. Der Dienst „neko” wird mit den folgenden Parametern initial gestartet:

  • ein Firefox-Image
  • automatischer Restart des Containers, bei ungewollter Beendigung
  • geteilte RAM-Größe für den Container: 2GB
  • die Ports 8080 TCP und 5200 bis 52100 UDP werden auf dem Docker-Host verfügbar gemacht und an dieselben Ports im Container durchgereicht
  • Umgebungsvariablen:
    • Bildschirmauflösung des virtuellen Browser: 1920×1080 bei 30 Frames pro Sekunde
    • Standardpasswort für normale Nutzer: neko
    • Standardpasswort für Admins: admin
    • die WebRTC-Ports 52000-52100
    • ICELite wird für WebRTC genutzt

n.eko ist eine Mehrbenutzerumgebung, das heißt es können sich mehrere Nutzer gleichzeitig in die Browsersession einloggen (der Benutzername ist egal) und das Passwort entscheidet darüber, ob du als User oder Admin eingeloggt bist. Die beiden Passwörter solltest du umgehend durch eigene ersetzen.

Die UDP-Ports 52000 bis 52100 kannst du auch durch einen anderen Bereich (kleiner oder größer) ersetzen, aber du musst darauf achten, dass der Bereich unter „Ports“ exakt derselbe ist wie unter den „Umgebungsvariablen“.

Wenn du n.eko im lokalen Netzwerk nutzen willst, dann solltest du unter environment noch folgende Zeile hinzufügen. Ersetze dabei die IP-Adresse durch die deines Docker-Containers (die bekommst du ggf. mit ip a heraus).

NEKO_WEBRTC_NAT1TO1: "192.168.178.42"

Wenn du die virtuelle Browserumgebung darüber hinaus oder zusätzlich öffentlich verfügbar machen willst, musst du deine öffentliche IP-Adresse angeben (also die WAN-Adresse deines Routers, wenn du das lokal hostest). Das geht ganz einfach mit folgender Zeile im Abschnitt environment:

NEKO_WEBRTC_IP_RETRIEVAL_URL: https://ifconfig.co/ip

Weitere Optionen findest du in der sehr guten Dokumentation des Projektes..

Die Konfiguration von n.eko ist abgeschlossen und du kannst den Container mit dem Befehlt sudo docker-compose up -d starten. Er ist im lokalen Netz unter http://192.168.178.42:8080 erreichbar (ersetze die IP-Adresse durch die deines Docker-Hosts).

Wenn du den virtuellen Browser allerdings aus dem Internet erreichbar machen möchtest, musst du folgende Dinge beachten:

  • Wenn du nicht jedes Mal deine öffentliche IP-Adresse eingeben willst, solltest du dir bei einem DynDNS-Anbieter wie z. B. DuckDNS einen Eintrag sichern.
  • n.eko ist nach der bisherigen Konfiguration unter Port 8080 zu erreichen. Diesen Port musst du in deinem Router (sofern du keinen VPS nutzt) an deinen Docker-Host weiterleiten. Ich mache das etwas anders: Ich leite die Ports 80 (HTTP) und 443 (HTTPS) in der Fritzbox an die Firewall weiter. Dort läuft ein Reverse Proxy, der die Anfragen nach einem bestimmten Regelwerk an die jeweilige interne Instanz (wie z. B. der n.eko-Docker-Host) weiterleitet. Diese Vorgehensweise im Detail zu beschreiben, wird dir wenig nützen, da dein Setup sicherlich anders aussieht.
  • Zudem müssen die UDP-Ports 52000 bis 52100 vom Internet-Router an den n.eko-Docker-Host weitergeleitet werden. Du könntest das in der Fritzbox händisch machen, aber die Fritzbox unterstützt beim Port-Forwarding keine Bereiche, sondern nur einzelne Ports. Das kann bei 101 Ports ziemlich nervig werden.

Für diesen letzten Punkt kann ich dir einen Tipp geben: Gehe im Fall der Fritzbox unter Internet / Freigaben / Portfreigaben und klicke dort auf Gerät für Freigaben hinzufügen. Wähle dort als Gerät deinen Docker-Host aus und aktiviere den Haken bei „Selbstständige Portfreigaben erlauben”. Stelle außerdem sicher, dass „Exposed Host” deaktiviert ist.

Dann installierst du auf deinen Docker-Host das Tool upnpc mit:

sudo apt install upnpc

Führe das folgende Skript aus (ersetze dabei die 192.168.178.42 durch die IP deines Docker-Hosts, auf dem n.eko läuft) und passe gegebenenfalls den Portbereich an, falls du diesen geändert hast.

for port in $(seq 52000 52100); do upnpc -a 192.168.178.42 $port $port udp; done

Das Skript benötigt etwas Zeit, richtet dir dann aber die Portfreigaben auf deinem UPnP-fähigen Router automatisch ein. Mit der Option „-d” statt „-a” kannst du die Portfreigaben auch über das Skript im Router wieder löschen.

Zum Schluss noch ein kleiner Tipp: Wenn auch du mit Verbindungsabbrüchen alle 30 Sekunden zu kämpfen hast (n.eko baut die aber sofort wieder auf), dann erhöhe den WebSockets-Timeout im Reverse Proxy für das n.eko-Backend auf 3600 s.

Im Browser sieht das bei Erfolg wie folgt aus:

Um die Steuerung des virtuellen Desktops zu übernehmen, musst du ganz unten auf die Tastatur klicken (neben dem Lautstärkeregler). Das fühlt sich ähnlich an wie bei einer Web-Präsentation, aber genau dafür kannst du diese Multiuser-Umgebung ja auch nutzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert