Bei der großen Anzahl von möglichen Servern, die auf einem Rechner laufen müssten, damit alle Internetdienste immer bereit sind, wäre es schnell soweit, dass der Speicher mit untätigen Servern überfüllt wäre. Damit das vermieden wird, gibt es einen „Superserver“, der alle möglichen Portnummern abhört und bei Anfrage einen entsprechenden Server startet. Damit kann es ermöglicht werden, dass nur die Server laufen, die gerade arbeiten, obwohl alle Dienste verfügbar sind.

Der zuständige Daemon heißt inetd und wird in der Datei /etc/inetd.conf konfiguriert. Der Aufbau dieser Datei ist verhältnismäßig einfach, meist sind alle notwendigen Einträge schon vorhanden. Sie müssen nur jeweils auskommentiert werden, wenn sie nicht erwünscht sind. Das Format der Datei ist folgendermaßen organisiert: So bedeutet die folgende Zeile also:

  ftp     stream  tcp     nowait  root    /usr/sbin/in.ftpd       in.ftpd

Wenn eine Nachfrage nach dem Service ftp ankommt, (über den Sockettyp stream, mit dem Protokoll TCP) wird unter der UserID root das Programm /usr/sbin/in.ftpd mit dem Parameter in.ftpd gestartet und mit der Anfrage verbunden.

Die nötigen Portnummern bezieht der Inetd aus der Datei /etc/services. Neben dem oben gezeigten Beispiel gibt es noch eine spezielle Form des Aufrufs über den inetd. In der Datei inetd.conf finden sich oft auch Zeilen wie die folgenden:

  klogin        stream  tcp     nowait  root    /usr/sbin/tcpd  rlogind -k
  eklogin       stream  tcp     nowait  root    /usr/sbin/tcpd  rlogind -k -x
  kshell        stream  tcp     nowait  root    /usr/sbin/tcpd  rshd -k

Hier scheint auf den ersten Blick immer das gleiche Programm aufgerufen zu werden, nämlich /usr/sbin/tcpd. Erst als dessen Parameter kommen die eigentlichen Server an die Reihe. In der Tat ist es so, dass hier der TCP-Daemon (tcpd) aufgerufen wird, der erst die Server aufruft. Das klingt auf den ersten Blick unsinnig, aber es ermöglicht eine Einstellung, wer diesen Service benutzen darf.

Der tcpd überprüft anhand der Dateien /etc/hosts.allow und /etc/hosts.deny ob der jeweilige Host bzw. User überhaupt berechtigt ist, diesen Dienst in Anspruch zu nehmen.

Die Überprüfung erfolgt auf eine etwas eigenwillige Weise:

  • Existiert ein passender Eintrag in der Datei /etc/hosts.allow, so wird Zugriff gegeben. Wenn nicht, dann
  • Existiert ein passender Eintrag in der Datei /etc/hosts.deny, so wird kein Zugriff gegeben. Wenn nicht, dann
  • wird Zugriff gegeben.

Das Format beider Dateien ist in der Handbuchseite hosts_access(5) genauestens dargestellt, es handelt sich um Zeilen des Formats:

  Serverliste : Clientliste [: Shellkommando]
  • Serverliste ist eine Liste von Servern (Programmnamen), oder Wildcards.
  • Clientliste ist eine Liste von einem oder mehreren Hostnamen, IP-Adressen, Suchmustern oder Wildcards,
  • Shellkommando ist ein Kommando, das die lokale Shell ausführt, wenn der Dienst angefordert wurde und der Eintrag ausschlaggebend für seine Ausführung oder Nichtausführung war. Damit kann etwa eine Warnmeldung an root gegeben werden, wenn jemand versucht auf einen verbotenen Service zuzugreifen.

Als Suchmuster kommen zwei einfache Verfahren in Frage:

  1. Beginnt ein Suchmuster mit einem Punkt (z.B. .mydomain.de), so gelten alle Hostnamen als Treffer, deren Ende mit dem Muster übereinstimmt also etwa hal.mydomain.de
  2. Endet ein Suchmuster mit einem Punkt (z.B. 192.168.200.), so gelten alle Namen und Adressen als Treffer, deren erster Teil mit dem Muster übereinstimmt.

Als Wildcards können unter anderem folgende Werte verwendet werden:

ALL

Die universelle Wildcard, alles gilt…

LOCAL

Alle Hostnamen ohne Punkt (also lokale Namen) gelten.

UNKNOWN

Passt auf alle Usernamen, die unbekannt sind und alle Hosts, deren Namen oder Adressen nicht bekannt sind. Wird gerne in /etc/hosts.deny verwendet.

KNOWN

Passt auf alle Hosts und User, die bekannt sind

EXCEPT

Ist ein Operator, um zwei Listen auszuschließen (Liste1 EXCEPT Liste2) also etwa ALL EXCEPT UNKNOWN

Das Shellkommando sollte grundsätzlich mit einem & beendet werden, weil sonst auf seine vollständige Abarbeitung gewartet wird, bevor ein Service evt. gestartet wird. Je nach Kommando kann das natürlich dauern…

Als zusätzliche Platzhalter in Shellkommandos können folgende Konstrukte verwendet werden:

%a

Die IP-Adresse des anfordernden Hosts

%A

Die IP-Adresse des aufgerufenen Servers

%c

Clientinformationen – User@Host oder User@IP-Adresse oder nur IP-Adresse des Anrufers, je nach dem, wieviel Informationen zur Verfügung stehen.

%d

Der Name des Daemon-Prozesses, der angefordert wurde.

%h

Name (oder falls nicht vorhanden IP-Adresse) des Clients

%H

Name (oder falls nicht vorhanden IP-Adresse) des Servers

%p

Die ProzessID des Daemon-Prozesses

%s

Serverinformationen – Daemon@Hostname oder Daemon@Adresse oder nur Daemon, je nach dem, wieviel Informationen zur Verfügung stehen.

%u

Der Username des Anrufers oder „unknown“

%%

Das %-Zeichen