Systemd Baustein Sockets
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
- Lassen Sie sich alle Sockets anzeigen. Welche Dienste starten auf Ihrem System erst bei Bedarf?
- Bauen Sie den Echo-Server und testen Sie ihn mit nc.
- Öffnen Sie zwei Verbindungen gleichzeitig. Wie viele Instanzen laufen?
- Prüfen Sie mit ss -lntp, wer auf Port 5555 lauscht.
Für Schnelle
- Lassen Sie den Echo-Server nur auf 127.0.0.1 lauschen.
- Erlauben Sie mit IPAddressAllow= in der .socket nur das eigene Netz.
- Finden Sie heraus, wie ssh.socket unter Debian funktioniert und wann man es statt ssh.service nimmt.