Systemd Baustein Sockets

Aus Xinux Wiki
Version vom 17. Oktober 2026, 15:47 Uhr von Thomas.will (Diskussion | Beiträge) (Neue Seite: Baustein Socket-Aktivierung)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
Baustein ab Stufe Lernpfad
Socket-Aktivierung Stufe 2 Übersicht

Einfach erklärt

  • Bei der Socket-Aktivierung lauscht nicht der Dienst selbst auf dem Port, sondern systemd.
  • Erst wenn die erste Verbindung kommt, startet systemd den Dienst und reicht ihm die Verbindung weiter.
  • So laufen selten gebrauchte Dienste nur, wenn sie wirklich gebraucht werden. Früher hat das inetd erledigt.
  • Zu einer .socket-Unit gehört eine .service-Unit mit gleichem Namen.

Anzeigen

  • systemctl list-sockets
LISTEN                              UNIT                            ACTIVATES
0.0.0.0:111                         rpcbind.socket                  rpcbind.service
/run/cups/cups.sock                 cups.socket                     cups.service
/run/dbus/system_bus_socket         dbus.socket                     dbus.service
...
  • Beispiel cups: Der Druckdienst startet erst, wenn jemand druckt.

Beispiel: Echo-Server

  • Jede Verbindung bekommt eine eigene Instanz des Dienstes. Der Dienst ist nur cat: Was ankommt, geht zurück.
  • /etc/systemd/system/echo.socket
[Unit]
Description=Echo-Server auf Port 5555

[Socket]
ListenStream=5555
Accept=yes

[Install]
WantedBy=sockets.target
  • /etc/systemd/system/echo@.service
[Unit]
Description=Echo-Verbindung

[Service]
ExecStart=/usr/bin/cat
StandardInput=socket
DynamicUser=yes
  • systemctl daemon-reload
  • systemctl enable --now echo.socket
  • Testen:
  • nc localhost 5555
  • Jede Zeile kommt zurück. Während die Verbindung besteht:
  • systemctl list-units 'echo@*'
  UNIT                                      LOAD   ACTIVE SUB     DESCRIPTION
  echo@0-127.0.0.1:5555-127.0.0.1:41234.service loaded active running Echo-Verbindung
Option Wirkung
ListenStream=5555 TCP-Port. Auch eine Adresse geht: 127.0.0.1:5555, oder ein Pfad für einen Unix-Socket
ListenDatagram=5555 UDP
Accept=yes pro Verbindung eine Instanz von echo@.service. Für einfache Programme wie cat
Accept=no ein Dienst für alle Verbindungen, er bekommt den lauschenden Socket. Standard
StandardInput=socket die Verbindung ist Ein- und Ausgabe des Programms

Accept=no: ein Dienst für alles

  • So arbeiten die meisten echten Dienste: dbus, cups, cockpit.
  • Das Programm muss das unterstützen, es bekommt den Socket von systemd übergeben (sd_listen_fds).
  • Startet der Dienst einmal, läuft er weiter, bis er sich selbst beendet oder gestoppt wird.

Sicherheit

  • Ein aktivierter Socket ist ein offener Port, auch wenn der Dienst gerade nicht läuft. ss -lntp zeigt ihn als systemd.
  • systemctl list-sockets gehört deshalb zu jeder Prüfung: Welche Ports öffnet systemd selbst?
  • Die Härtungsoptionen aus Stufe 3 gehören in die .service, IPAddressAllow= und IPAddressDeny= gehen auch in die .socket.

Stolperfallen

  • Den Socket aktivieren, nicht den Service. Sonst lauscht der Dienst wieder selbst, oder es gibt Streit um den Port.
  • Port belegt: Läuft der Dienst schon selbst auf dem Port, kann der Socket nicht starten. Erst den Service stoppen und deaktivieren.
  • Accept=yes braucht eine Vorlage mit @ im Namen: echo@.service.
  • Stoppen: Ein gestoppter Service wird bei der nächsten Verbindung wieder gestartet. Ganz aus nur mit systemctl stop echo.socket.

Aufgaben

Grundaufgaben

  1. Lassen Sie sich alle Sockets anzeigen. Welche Dienste starten auf Ihrem System erst bei Bedarf?
  2. Bauen Sie den Echo-Server und testen Sie ihn mit nc.
  3. Öffnen Sie zwei Verbindungen gleichzeitig. Wie viele Instanzen laufen?
  4. Prüfen Sie mit ss -lntp, wer auf Port 5555 lauscht.

Für Schnelle

  1. Lassen Sie den Echo-Server nur auf 127.0.0.1 lauschen.
  2. Erlauben Sie mit IPAddressAllow= in der .socket nur das eigene Netz.
  3. Finden Sie heraus, wie ssh.socket unter Debian funktioniert und wann man es statt ssh.service nimmt.

Weiter