Kako storitve xinetd prestavim na systemd?

Linux Branje: 2 min

xinetd je star „superstrežnik”: posluša na nastavljenih vratih, in ko prispe povezava, zažene pripadajoči program, ki prek povezave komunicira z odjemalcem. Tako so lahko omrežne storitve postali tudi preprosti programi, ki le berejo s standardnega vhoda in pišejo na standardni izhod.

Iz sistemov na osnovi Red Hat je xinetd izginil: v AlmaLinux 9 in 10 ni na voljo ne v sistemskih repozitorijih ne v EPEL (v preizkusu je dnf info xinetd v obeh vrnil odgovor „No matching Packages”). Če s starega strežnika seliš storitev, ki teče pod xinetd, jo moraš nastaviti kot vtičnico systemd. Systemd zna isto: na vratih posluša on in za vsako povezavo zažene program.

Korake smo preizkusili v sistemu AlmaLinux 10.2; enako deluje v vsaki distribuciji s systemd (Rocky Linux, Ubuntu, Debian).

Izhodiščna storitev xinetd

Tipična nastavitev xinetd v imeniku /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
}

Posluša na vratih TCP 3662, za vsako povezavo kot uporabnik nobody zažene program /usr/local/bin/fontosapp in izpis programa pošlje odjemalcu. wait = no pomeni, da vsaka povezava dobi ločen proces.

1. Datoteka vtičnice

V systemd je del, ki posluša na vratih, datoteka .socket, na primer /etc/systemd/system/fontosapp.socket:

[Unit]
Description=Sajat alkalmazas socket

[Socket]
ListenStream=3662
Accept=yes

[Install]
WantedBy=sockets.target

Accept=yes ustreza nastavitvi xinetd wait = no: za vsako povezavo se zažene ločen primerek storitve.

2. Datoteka storitve

Del, ki zažene program, je datoteka /etc/systemd/system/fontosapp@.service. @ v imenu je obvezen: ob Accept=yes systemd iz te predloge za vsako povezavo zažene primerek, ime datoteke pa se mora ujemati z imenom vtičnice (fontosapp.socket → fontosapp@.service).

[Unit]
Description=Sajat alkalmazas kiszolgalo

[Service]
ExecStart=-/usr/local/bin/fontosapp
User=nobody
StandardInput=socket
  • ExecStart: celotna pot programa. Zaradi - na začetku systemd ne šteje za napako, če program konča s kodo, ki ni nič.
  • User: ustreznik nastavitve xinetd user. Če pravice root niso potrebne, jih ne dodeli; primer teče z uporabnikom nobody.
  • StandardInput=socket: vhod programa (in privzeto tudi izhod) bo omrežna povezava, kot pod xinetd.

3. Omogočanje in zagon

Omogočiti in zagnati je treba vtičnico, ne storitve:

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

Na vratih nato posluša systemd; v preizkusu je bil izpis sudo ss -tlnp | grep 3662 *:3662 … users:(("systemd",pid=1,…)).

4. Preizkus

Preprost testni program, ki izpiše ime računalnika in čas:

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

Povezava z vrati (namesto nc z vgrajeno možnostjo bash /dev/tcp, tako ni treba ničesar nameščati):

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

V preizkusu je bil odgovor Szia, vps! Ido: 23:04:07, systemctl status fontosapp.socket pa je pokazal tudi število sprejetih povezav (Accepted: 1; Connected: 0;).

Če mora biti dosegljiva tudi od zunaj

Vtičnica posluša na vseh omrežnih vmesnikih. Če storitev uporabljaš le znotraj računalnika, v vrstico ListenStream vpiši lokalni naslov (ListenStream=127.0.0.1:3662). Če mora biti dosegljiva tudi od zunaj in teče firewalld, odpri vrata (sudo firewall-cmd --permanent --add-port=3662/tcp, nato sudo firewall-cmd --reload). Pri nestandardnih vratih se lahko vmeša tudi SELinux, glej: SELinux: zakaj dobim napako „Permission denied”?

O upravljanju storitev systemd govori članek Upravljanje storitev z ukazom systemctl, o njihovih dnevnikih pa članek o journalctl.

Nazaj: Linux – članki (76)