Zum Inhalt springen
Aktuell ausgebucht
· 5 Min. Lesezeit

Meine Entwicklungsumgebung: ein Server ohne offene Ports

Wie der Server eingerichtet ist, auf dem ich entwickle: nur über ein privates Netz erreichbar, SSH und Terminal-Sessions ohne offene Ports, Updates im Autopilot, und ein Prompt zum Kopieren, mit dem du dasselbe Schritt für Schritt aufsetzt.

KI-Zusammenfassung anfordern

Ich entwickle nicht auf meinem Laptop. Gearbeitet wird auf einem kleinen Cloud-Server mit Ubuntu, und Laptop, Tablet und Smartphone sind nur Fenster dorthin. Projekte, Terminals und laufende Programme bleiben auf dem Server. Ich kann den Laptop also an einem Ort zuklappen und an einem anderen Gerät genau dort weitermachen, wo ich aufgehört habe.

Auf so einem Server liegen Code, Zugangstokens und alles, was zum Deployen nötig ist. Deshalb folgt die Einrichtung einer einzigen Idee: Aus dem offenen Internet ist er gar nicht erst zu sehen. Hier steht, wie das Schicht für Schicht aussieht. Am Ende findest du einen Prompt zum Kopieren, mit dem dich ein Assistent durch dasselbe Setup auf deinem eigenen Server führt.

1. Das Netz: nur privat

Der Server hängt in einem privaten Netz, aufgebaut mit Tailscale. Jedes Gerät, von dem aus ich arbeite, ist in diesem Netz und erreicht den Server über eine verschlüsselte Verbindung, egal wo es gerade ist. Für alle anderen gibt es dort nichts, womit sie reden könnten.

  • Die Firewall (ufw) weist alles ab, was aus dem Internet kommt, und lässt nur Verkehr durch, der über das private Netz ankommt.
  • Die Firewall des Hosting-Anbieters vor dem Server hat ebenfalls keine eingehenden Regeln. Selbst ein Fehler auf dem Server würde also keine Tür öffnen.
  • Überhaupt keine offenen Ports. Kein SSH, kein Webserver, nichts lauscht auf der öffentlichen Adresse. Ein Port, den es nicht gibt, lässt sich nicht angreifen, egal welche Sicherheitslücke als Nächstes auftaucht.
  • Nur Geräte, die wirklich genutzt werden, bleiben im privaten Netz, denn jedes Gerät darin kann den Server erreichen.

2. SSH: nur Schlüssel, nur private Adresse

SSH gibt es weiterhin für die Momente, in denen es gebraucht wird, aber gut abgeschlossen:

  • Es lauscht nur auf der Adresse im privaten Netz, nicht auf der öffentlichen.
  • Passwörter sind aus. Rein kommt man nur mit Schlüssel, und Root kann sich gar nicht anmelden.
  • X11- und TCP-Forwarding sind aus, damit ein gestohlener Login nicht zum Tunnel woandershin wird.
  • Auf der Tailscale-Seite verlangt SSH regelmäßig eine frische Bestätigung des Logins.

3. Terminals: Sessions, die weiterlaufen

Im Alltag nutze ich kein nacktes SSH, sondern Rex, einen Terminal-Multiplexer. Er hält meine Sessions, Tabs und Panes auf dem Server. Verbinde ich mich von einem anderen Gerät, ist alles noch da: der laufende Build, der offene Editor, der Verlauf.

Rex läuft als Login-Server: Ein kleiner Dienst auf dem Server prüft, wer sich verbindet, und startet die Session unter dem eigenen Linux-Konto dieser Person. Auch er ist nur über das private Netz erreichbar, per Tailscale Serve, und nur meine eigene Tailscale-Identität kommt rein.

Warum ein Multiplexer das Herzstück dieses Setups ist und wie ich damit von iPhone und iPad aus arbeite, steht in Terminal-Multiplexer.

4. Updates: immer die neueste stabile Version

Gerade auf einem Entwicklungsserver sollten sich keine alten Versionen ansammeln:

  • Sicherheitsupdates installieren sich selbst, jeden Tag (unattended-upgrades).
  • Alles andere bleibt auf dem neuesten stabilen Release: die Systempakete, Node.js und npm, Bun und der Terminal-Server, jeweils aus der offiziellen Paketquelle.
  • Nach Updates prüfe ich, welche Programme noch die alte Version ausführen, und starte sie neu. Ein Update schützt erst, wenn der neue Code auch wirklich läuft.
  • Was niemand nutzt, ist aus. Ein Beispiel ist Multipath TCP, eine Kernel-Funktion für Geräte mit mehreren Verbindungen gleichzeitig, etwa ein Smartphone mit WLAN und Mobilfunk. Ein Server im Rechenzentrum hat eine Verbindung und hat nichts davon. Abgeschaltet fällt Code weg, in dem irgendwann eine Lücke stecken könnte.

5. GitHub und Deploys: enge Zugänge

Der Server spricht mit GitHub über einen Fine-grained Token, der nur die Repositories erreicht, an denen ich dort arbeite. Git läuft über HTTPS mit diesem Token, nicht mit einem breiten Schlüssel, der alles öffnet.

Deployt wird gar nicht vom Server aus: Cloudflare ist mit dem GitHub-Repository verbunden und veröffentlicht diese Seite, sobald etwas auf main landet. Der Server braucht also nie Zugangsdaten für die Live-Seite.

6. Selbst aufsetzen: ein Prompt zum Kopieren

Ein KI-Assistent mit Zugriff auf das Terminal deines Servers kann dich durch dasselbe Setup führen. Kopiere diesen Prompt, fülle aus, was in eckigen Klammern steht, und füge ihn ein. Er erklärt jeden Schritt, bevor er ihn ausführt, und sperrt dich unterwegs nicht aus.

Du hilfst mir, einen sicheren Entwicklungsserver einzurichten. Ich bin
per SSH auf einem frischen Ubuntu-Server (Version: [z. B. 24.04]) bei
einem Cloud-Anbieter ([Name des Anbieters]) angemeldet. Mein
Linux-Benutzer ist [Benutzername] und hat sudo.

Ziel: ein Server OHNE offene Ports. Ich erreiche ihn nur über ein
privates Tailscale-Netz, von diesen Geräten: [Laptop/Smartphone/Tablet].

Geh die Schritte unten einzeln durch. Für jeden Schritt:
- erkläre in einfachen Worten, was er macht und warum,
- zeig mir die genauen Befehle, bevor du sie ausführst,
- warte auf mein OK,
- prüfe danach, ob es geklappt hat.
Tu nichts, was mich aussperren könnte, bevor wir bestätigt haben, dass
der Zugang über Tailscale funktioniert. Schlägt ein Schritt fehl,
halte an und erkläre, was passiert ist.

1. System aktualisieren und automatische Sicherheitsupdates
   (unattended-upgrades) einschalten.
2. Tailscale installieren, meinem Tailnet beitreten und prüfen, dass
   ich den Server von einem anderen Gerät über seine
   Tailscale-Adresse erreiche.
3. SSH absichern: nur auf den Tailscale-Adressen lauschen, nur
   Schlüssel, keine Passwörter, kein Root-Login, kein X11- und kein
   TCP-Forwarding. Meine aktuelle Session bleibt offen, während wir
   einen zweiten Login testen.
4. Firewall (ufw) einrichten: eingehenden Verkehr standardmäßig
   ablehnen, alles auf dem Interface tailscale0 erlauben. Danach zeigen,
   dass nichts auf der öffentlichen Adresse lauscht (ss -tulpn).
5. Erklären, wie ich die Firewall meines Cloud-Anbieters auf keine
   eingehenden Regeln stelle.
6. Optional Tailscale SSH mit Check-Modus einschalten.
7. Den Terminal-Multiplexer Rex installieren, damit meine Sessions
   Verbindungsabbrüche überleben: Rex als Login-Server, nur über
   Tailscale Serve erreichbar, und nur meine eigene
   Tailscale-Identität kommt rein.
8. Meine Entwicklungswerkzeuge aus den offiziellen Quellen in der
   neuesten stabilen Version installieren: [z. B. git, Node.js, Bun,
   GitHub CLI].
9. GitHub-Zugang mit einem Fine-grained Token einrichten, beschränkt
   auf die Repositories, die ich brauche, mit git über HTTPS.
10. Kernel-Funktionen abschalten, die ein Server nicht braucht,
    angefangen mit Multipath TCP (net.mptcp.enabled = 0, gespeichert
    in /etc/sysctl.d/).
11. Zum Schluss eine kurze Checkliste, was eingerichtet ist, und die
    Befehle, mit denen ich später prüfen kann, ob alles aktuell ist.

Jedes Setup ist ein bisschen anders: ein anderer Anbieter, andere Werkzeuge, mehr Leute, die Zugriff brauchen. Wenn du Hilfe beim Aufsetzen einer solchen Entwicklungsumgebung für dein Team möchtest, melde dich.