FreeBSD kézikönyv
Előző | Fejezet 29. Hálózati szerverek | Következő

# 29.2. Az inetd “szuperszerver”

Készítette: Chern Lee. A FreeBSD 6.1-RELEASE változatához igazította: A FreeBSD Dokumentációs Projekt.

## 29.2.1. Áttekintés

Az inetd(8) démont gyakran csak “internet szuperszerverként” nevezik, mivel a helyi szolgáltatások kapcsolatainak kezeléséért felelős. Amikor az inetd fogad egy csatlakozási kérelmet, akkor eldönti róla, hogy ez melyik programhoz tartozik és elindít egy példányt belőle, majd átadja neki a socketet (az így meghívott program a szabvány bemenetéhez, kimenetéhez és hibajelzési csatornájához kapja meg a socket leíróit). Az inetd használatával úgy tudjuk csökkenteni a rendszerünk terhelését, hogy a csak alkalmanként meghívott szolgáltatásokat nem futtatjuk teljesen független önálló módban.

Az inetd démont elsősorban más démonok elindítására használjuk, de néhány triviális protokollt közvetlenül is képes kezelni, mint például a chargen, auth és a daytime.

Ebben a fejezetben az inetd beállításának alapjait foglaljuk össze mind parancssoros módban, mind pedig az `/etc/inetd.conf` konfigurációs állományon keresztül.

## 29.2.2. Beállítások

Az inetd működése az rc(8) rendszeren keresztül inicializálható. Az `inetd_enable` ugyan alapból a `NO` értéket veszi fel, vagyis tiltott, de a sysinstall használatával már akár a telepítés során bekapcsolható attól függően, hogy a felhasználó milyen konfigurációt választott. Ha tehát a:

    inetd_enable="YES"

vagy

    inetd_enable="NO"

sort tesszük az `/etc/rc.conf` állományba, akkor azzal az inetd démont indíthatjuk el vagy tilthatjuk le a rendszer indítása során. Az

    # /etc/rc.d/inetd rcvar

paranccsal lekérdezhetjük a pillanatnyilag érvényes beállítást.

Emellett még az inetd démonnak az `inetd_flags` változón keresztül különböző parancssori paramétereket is át tudunk adni.

## 29.2.3. Parancssori paraméterek

Hasonlóan a legtöbb szerverhez, az inetd viselkedését is befolyásolni tudjuk a parancssorban átadható különböző paraméterekkel. Ezek teljes listája a következő:

`inetd` `[-d] [-l] [-w] [-W] [-c maximum] [-C arány] [-a cím | név] [-p állomány] [-R arány] [-s maximum] [konfigurációs állomány]`

Ezek a paraméterek az `/etc/rc.conf` állományban az `inetd_flags` segítségével adhatóak meg az inetd részére. Alapértelmezés szerint az `inetd_flags` értéke `-wW -C 60`, ami az inetd által biztosított szolgáltatások TCP protokollon keresztüli wrappelését kapcsolja be, illetve egy IP-címről nem engedi a felkínált szolgáltatások elérését percenként hatvannál többször.

A kezdő felhasználók örömmel nyugtázhatják, hogy ezeket az alapbeállításokat nem szükséges módosítaniuk, habár a későbbiekben majd fény derül arra, hogy a kiszolgálás gyakoriságának szabályozása remek védekezést nyújthat túlzottan nagy mennyiségű kapcsolódási kérelem ellen. A megadható paraméterek teljes listája az inetd(8) man oldalán olvasható.

-c `maximum`

  Az egyes szolgáltatásokhoz egyszerre felépíthető kapcsolatok alapértelmezett maximális számát adja meg. Alapból ezt a démont nem korlátozza. A `max-child` beállítással ez akár szolgáltatásonként külön is megadható.

-C `arány`

  Korlátozza, hogy egyetlen IP-címről alapból hányszor hívhatóak meg az egyes szolgáltatások egy percen belül. Ez az érték alapból korlátlan. A `max-connections-per-ip-per-minute` beállítással ez szolgáltatásonként is definiálható.

-R `arány`

  Megadja, hogy egy szolgáltatást egy perc alatt mennyiszer lehet meghívni. Ez az érték alapértelmezés szerint 256. A 0 megadásával eltöröljük ezt a típusú korlátozást.

-s `maximum`

  Annak maximumát adja meg, hogy egyetlen IP-címről egyszerre az egyes szolgáltatásokat mennyiszer tudjuk elérni. Alapból ez korlátlan. Szolgáltatásonként ezt a `max-child-per-ip` paraméterrel tudjuk felülbírálni.

## 29.2.4. Az `inetd.conf` állomány

Az inetd beállítását az `/etc/inetd.conf` konfigurációs állományon keresztül végezhetjük el.

Amikor az `/etc/inetd.conf` állományban módosítunk valamit, az inetd démont a következő paranccsal meg kell kérnünk, hogy olvassa újra:

Példa 29-1. Az inetd konfigurációs állományának újraolvasása

    # /etc/rc.d/inetd reload

A konfigurációs állomány minden egyes sora egy-egy démont ír le. A megjegyzéseket egy “#” jel vezeti be. Az `/etc/inetd.conf` állomány bejegyzéseinek formátuma az alábbi:

    szolgáltatás-neve
    socket-típusa
    protokoll
    {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
    felhasználó[:csoport][/bejelentkezési-osztály]
    szerver-program
    szerver-program-paraméterei

Az IPv4 protokollt használó ftpd(8) démon bejegyzése például így néz ki:

    ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l

szolgáltatás-neve

  Ez az adott démon által képviselt szolgáltatást nevezi meg, amelynek szerepelnie kell az `/etc/services` állományban. Ez határozza meg, hogy az inetd milyen porton figyelje a beérkező kapcsolatokat. Ha egy új szolgáltatást hozunk létre, akkor azt először az `/etc/services` állományba kell felvennünk.

csatlakozás-típusa

  Ennek az értéke `stream`, `dgram`, `raw`, vagy `seqpacket` lehet. A `stream` típust használja a legtöbb kapcsolat-orientált TCP démon, miközben a `dgram` típus az UDP szállítási protokollt alkalmazó démonok esetében használatos.

protokoll

  Valamelyik a következők közül:

  Protokoll | Magyarázat
  --- | ---
  tcp, tcp4 | TCP IPv4
  udp, udp4 | UDP IPv4
  tcp6 | TCP IPv6
  udp6 | UDP IPv6
  tcp46 | TCP IPv4 és v6
  udp46 | UDP IPv4 és v6

{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

  A `wait|nowait` beállítás mondja meg, hogy az inetd démonból meghívott démon saját maga képes-e kezelni kapcsolatokat. A `dgram` típusú kapcsolatok esetében egyértelműen a `wait` beállítást kell használni, miközben a `stream` esetén, ahol általában több szálon dolgozunk, a `nowait` megadása javasolt. A `wait` hatására általában egyetlen démonnak adunk át több socketet, míg a `nowait` minden sockethez egy újabb példányt indít el.

  Az inetd által indítható példányokat a `max-child` megadásával korlátozhatjuk. Ha tehát például az adott démon számára legfeljebb példány létrehozását engedélyezzük, akkor a `nowait` után `/10` beállítást kell megadnunk. A `/0` használatával korlátlan mennyiségű példányt engedélyezhetünk.

  A `max-child` mellett még további két másik beállítás jöhet számításba az egyes démonok által kezelhető kapcsolatok maximális számának korlátozásában. A `max-connections-per-ip-per-minute` az egyes IP-címekről befutó lekezelhető kapcsolatok percenkénti számát szabályozza, így például ha itt a tizes értéket adjuk meg, akkor az adott szolgáltatáshoz egy IP-címről percenként csak tízszer férhetünk hozzá. A `max-child-per-ip` az egyes IP-címekhez egyszerre elindítható példányok számára ír elő egy korlátot. Ezek a paraméterek segítenek megóvni rendszerünket az erőforrások akaratos vagy akaratlan kimerítésétől és a DoS (Denial of Service) típusú támadásoktól.

  Ebben a mezőben a `wait` vagy `nowait` valamelyikét kötelező megadni. A `max-child`, `max-connections-per-ip-per-minute` és `max-child-per-ip` paraméterek ellenben elhagyhatóak.

  A `stream` típusú több szálon futó démonok a `max-child`, `max-connections-per-ip-per-minute` vagy `max-child-per-ip` korlátozása nélkül egyszerűen csak így adhatóak meg: `nowait`.

  Ha ugyanezt a démont tíz kapcsolatra lekorlátozzuk, akkor a következőt kell megadnunk: `nowait/10`.

  Amikor pedig IP-címenként 20 kapcsolatot engedélyezünk percenként és mindössze 10 példányt, akkor: `nowait/10/20`.

  Az iménti beállítások a fingerd(8) démon alapértelmezett paramétereinél is megtalálhatóak:

      finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

  Végezetül engedélyezzük 100 példányt, melyek közül IP-címenként 5 használható: `nowait/100/0/5`.

felhasználó

  Ezzel azt a felhasználót adjuk meg, akinek a nevében az adott démon futni fog. Az esetek túlnyomó részében a démonokat a `root` felhasználó futtatja. Láthatjuk azonban, hogy biztonsági okokból bizonyos démonok a `daemon` vagy a legkevesebb joggal rendelkező `nobody` felhasználóval futnak.

szerver-program

  A kapcsolat felépülésekor az itt teljes elérési úttal megadott démon indul el. Ha ezt a szolgáltatást maga az inetd belsőleg valósítja meg, akkor ebben a mezőben az `internal` értéket adjuk meg.

szerver-program-paraméterei

  Ez a `szerver-program` beállítással együtt működik, és ebben a mezőben a démon meghívásakor alkalmazandó paramétereket tudjuk rögzíteni, amelyet a démon nevével kezdünk. Ha a démont a parancssorból a ``sajátdémon` -d` paranccsal hívnánk meg, akkor a ``sajátdémon` -d` lesz `szerver-program-paraméterei` beállítás helyes értéke is. Természetesen, ha a démon egy belsőleg megvalósított szolgáltatás, akkor ebben a mezőben is az `internal` fog megjelenni.

## 29.2.5. Védelem

Attól függően, hogy a telepítés során mit választottunk, az inetd által támogatott szolgáltatások egyes része talán alapból engedélyezett is. Amennyiben egy adott démont konkrétan nem használunk, akkor érdemes megfontolni a letiltását. A kérdéses démon sorába tegyünk egy “#” jelet az `/etc/inetd.conf` állományba, majd olvastassuk újra az inetd beállításait. Egyes démonok, mint például az fingerd használata egyáltalán nem ajánlott, mivel a támadók számára hasznos információkat tudnak kiszivárogtatni.

Más démonok nem ügyelnek a védelemre, és a kapcsolatokhoz rendelt lejárati idejük túlságosan hosszú vagy éppen nincs is. Ezzel a támadónak lehetősége van lassú kapcsolatokkal leterhelni az adott démont, ezáltal kimeríteni a rendszer erőforrásait. Ha úgy találjuk, hogy túlságosan sok az ilyen kapcsolat, akkor jó ötletnek bizonyulhat a démonok számára a `max-connections-per-ip-per-minute`, `max-child` vagy `max-child-per-ip` korlátozások elrendelése.

Alapértelmezés szerint a TCP kapcsolatok wrappelése engedélyezett. A hosts_access(5) man oldalon találhatjuk meg az inetd által meghívható különféle démonok TCP-alapú korlátozásainak lehetőségeit.

## 29.2.6. Egyéb lehetőségek

A daytime, time, echo, discard, chargen és auth szolgáltatások feladatainak mindegyikét maga az inetd is képes ellátni.

Az auth szolgáltatás a hálózati keresztül azonosítást teszi lehetővé és bizonyos mértékig beállítható. A többit egyszerűen csak kapcsoljuk ki vagy be.

A témában az inetd(8) man oldalán tudunk még jobban elmerülni.

Előző | Tartalom | Következő
Hálózati szerverek | Fel | A hálózati állományrendszer (NFS)

Ha kérdése van a FreeBSD-vel kapcsolatban, a következő címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.