Wie lassen sich xinetd-Dienste auf systemd umstellen?

Linux 3 Min. Lesezeit

xinetd ist ein alter „Super-Server“: Er überwacht die konfigurierten Ports und startet bei Eingang einer Verbindung das zugehörige Programm, das über diese Verbindung mit dem Client kommuniziert. Auf diese Weise konnten auch einfache Programme zu Netzwerkdiensten werden, die lediglich aus der Standardeingabe lesen und in die Standardausgabe schreiben.

Aus den Red-Hat-basierten Systemen wurde xinetd entfernt: Auf AlmaLinux 9 und 10 ist es weder in den System-Repositories noch im EPEL verfügbar (im Test gab der Befehl „dnf info xinetd“ auf beiden Systemen die Antwort „No matching Packages“ aus). Wenn Sie einen Dienst, der auf einem alten Server unter xinetd läuft, migrieren, müssen Sie diesen als systemd-Socket einrichten. Systemd kann dasselbe: Es überwacht den Port und startet das Programm bei jeder Verbindung.

Wir haben die Schritte auf einem AlmaLinux 10.2-System getestet; bei allen Distributionen, die systemd verwenden (Rocky Linux, Ubuntu, Debian), funktioniert dies auf dieselbe Weise.

Der xinetd-Dienst beim Start

Eine typische xinetd-Konfiguration im Verzeichnis „/etc/xinetd.d/“:

service fontosapp
{
    type        = UNLISTED
    port        = 3662
    socket_type = stream
    protocol    = tcp
    wait        = no
    user        = nobody
    server      = /usr/local/bin/fontosapp
    disable     = no
}

Der Dienst lauscht auf dem TCP-Port 3662, startet bei jeder Verbindung das Programm „/usr/local/bin/fontosapp“ als Benutzer „nobody“ und sendet die Ausgabe des Programms an den Kunden. „wait = no“ bedeutet, dass jede Verbindung einen eigenen Prozess erhält.

1. Die Socket-Datei

In systemd ist der Teil, der den Port überwacht, eine .socket-Datei, beispielsweise /etc/systemd/system/fontosapp.socket:

[Unit]
Description=Sajat alkalmazas socket

[Socket]
ListenStream=3662
Accept=yes

[Install]
WantedBy=sockets.target

Die Einstellung „Accept=yes“ entspricht der xinetd-Einstellung „wait = no“: Für jede Verbindung wird eine separate Dienstinstanz gestartet.

2. Die Dienstdatei

Die Datei „/etc/systemd/system/fontosapp@.service“ dient zum Starten des Programms. Das @ im Dateinamen ist obligatorisch: Bei der Einstellung „Accept=yes“ startet systemd für jede Verbindung eine Instanz aus dieser Vorlage, wobei der Dateiname mit dem Namen des Sockets übereinstimmen muss (fontosapp.socket → fontosapp@.service).

[Unit]
Description=Sajat alkalmazas kiszolgalo

[Service]
ExecStart=-/usr/local/bin/fontosapp
User=nobody
StandardInput=socket
  • ExecStart: Der vollständige Pfad zum Programm. Aufgrund des vorangestellten „-“ wertet systemd es nicht als Fehler, wenn das Programm mit einem Code ungleich Null beendet wird.
  • User: Entspricht der Einstellung für den xinetd-user. Wenn keine Root-Rechte erforderlich sind, geben Sie diese nicht an; das Beispiel läuft unter dem nobody-Benutzer.
  • StandardInput=socket: Die Eingabe (und standardmäßig auch die Ausgabe) des Programms erfolgt über die Netzwerkverbindung, genau wie unter xinetd.

3. Aktivierung und Start

Sie müssen nicht den Dienst, sondern den Socket aktivieren und starten:

sudo systemctl daemon-reload
sudo systemctl enable --now fontosapp.socket
systemctl status fontosapp.socket

An diesem Port überwacht anschließend systemd; im Test lautete die Ausgabe von „sudo ss -tlnp | grep 3662“ wie folgt: *:3662 … users:(("systemd",pid=1,…)).

4. Testen

Ein einfaches Testprogramm, das den Namen des Rechners und die Uhrzeit ausgibt:

#!/bin/sh
echo "Szia, $(hostname)! Ido: $(date +%T)"

Verbindung zum Port (anstelle von „nc“ mit der in Bash integrierten Option „/dev/tcp“, sodass keine Installation erforderlich ist):

exec 3<>/dev/tcp/127.0.0.1/3662; cat <&3; exec 3<&-

Im Test lautete die Antwort „Szia, vps! Ido: 23:04:07“, und der Befehl „systemctl status fontosapp.socket“ zeigte zudem die Anzahl der akzeptierten Verbindungen an („Accepted: 1; Connected: 0;“).

Wenn der Zugriff auch von außen erforderlich ist

Der Socket überwacht alle Netzwerkschnittstellen. Wenn Sie den Dienst ausschließlich auf dem lokalen Rechner nutzen, geben Sie in der Zeile „ListenStream“ die lokale Adresse ein (ListenStream=127.0.0.1:3662). Wenn der Dienst auch von außen erreichbar sein soll und „firewalld“ läuft, öffnen Sie den Port (sudo firewall-cmd --permanent --add-port=3662/tcp, anschließend sudo firewall-cmd --reload). Bei einem nicht standardmäßigen Port kann auch SELinux eine Rolle spielen, siehe: SELinux: Warum erhalte ich die Fehlermeldung „Permission denied“?

Die Verwaltung von systemd-Diensten wird im Artikel „Verwaltung von Diensten mit dem Befehl systemctl“ behandelt, während sich der Artikel „journalctl“ mit deren Protokollen befasst.

Zurück: Linux-Artikel (62)