SelfLinux Internet xinetd Abschnitt 6 | SelfLinux-0.13.0

| xinetd | Autoren Formatierung GFDL

#### 6 Ports an Adressen binden: Das Attribut bind

Mittels diesem Attribut kann man einen Dienst an eine IP Adresse binden. Besitzt der Rechner sowieso nur eine Adresse, ist dies nicht sehr sinnig. Ein Rechner allerdings, der einerseits an einem lokalen Netzwerk, andereseits an das Internet angebunden ist, besitzt mindestens zwei Adressen.

Angenommen, eine Firma möchte einen FTP Server für ihre Angestellten installieren, etwa, damit diese auf interne Dokumente zugreifen und diese lesen können. Desweiteren sollen Kunden mittels FTP auf die Firmenprodukte zugreifen können. bind ist wie geschaffen für diesen Fall. Es werden zwei FTP Dienste definiert. Diese müssen allerdings von xinetd unterschieden werden können. Dazu wird das Attribut id verwendet. Durch dieses wird ein Dienst eindeutig identifiziert. Sollte ein Dienst dem Attribut keinen Wert zuweisen, so wird standardmäßig der Dienstname als Wert verwendet.

    service ftp
    {
      id           = ftp-public
      wait         = no
      user         = root
      server       = /usr/sbin/in.ftpd
      server_args  = -l
      instances    = 4
      nice         = 10
      only_from    = 0.0.0.0/0 #allows every client
      bind         = 212.198.253.142 #public IP address for this server
    }

    service ftp
    {
      id           = ftp-private
      socket_type  = stream
      wait         = no
      user         = root
      server       = /usr/sbin/in.ftpd
      server_args  = -l
      only_from    = 192.168.1.0/24 #only for internal use
      bind         = 192.168.1.1  #local IP address for this server (charly)
    }

Durch den Einsatz von bind kann das jeweilige Daemonprogramm angesprochen werden, abhängig von der Zieladresse der Pakete. Will ein Client im lokalen Netzwerk auf interne Daten zugreifen, so muss er die lokale Adresse (bzw. den assoziierten Rechnernamen) des FTP Servers verwenden. In der Protokolldatei steht dann:

    00/9/17@16:47:46: START: ftp-public pid=26861 from=212.198.253.142
    00/9/17@16:47:46: EXIT: ftp-public status=0 pid=26861 duration=30(sec)
    00/9/17@16:48:19: START: ftp-internal pid=26864 from=192.168.1.1
    00/9/17@16:48:19: EXIT: ftp-internal status=0 pid=26864 duration=15(sec)

Der erste Teil stammt vom Befehl ftp 212.198.253.142, während der zweite Teil vom Aufruf von charly auf sich selbst resultiert: ftp 192.168.1.1.

Was passiert aber nun, falls ein Rechner keine zwei statischen IP Adressen hat? Dies ist zum Beispiel bei PPP Verbindungen oder beim Einsatz von DHCP der Fall. Es wäre besser, könnten Dienste an Netzwerkschnittstellen selbst, anstatt an Adressen gebunden werden. Dies jedoch ist bei xinetd noch nicht in Sicht und stellt ein wirkliches Problem dar. Das Design eines C Modules beispielsweise, dass auf ein Netzwerkinterface oder eine Adresse zugreifen soll, ist stark vom jeweiligen Betriebssystem abhängig, und da xinetd auf vielen Plattformen arbeiten soll, ist dies problematisch. Unter Verwendung eines Skriptes kann das Problem gelöst werden:

    #!/bin/sh

    PUBLIC_ADDRESS=`/sbin/ifconfig $1 | grep "inet addr" | awk '{print $2}'| awk -F: '{print $2}'`
    sed s/PUBLIC_ADDRESS/"$PUBLIC_ADDRESS"/g /etc/xinetd.base > /etc/xinetd.conf

Dieses Skript liest die gewünschte Konfiguration aus der Datei /etc/xinetd.base aus, wobei PUBLIC_ADDRESS als Platzhalter für die dynamische Adresse steht und nimmt die entsprechenden Änderungen in /etc/xinetd.conf vor. Hierbei wird PUBLIC_ADDRESS durch die Adresse ersetzt, die dem Interface zugeordnet ist, welches dem Skript als Parameter übergeben wird. Der Aufruf des Skriptes hängt von der Art der Verbindung ab: Am einfachsten ist es, den Aufruf in die jeweilige ifup-* Datei einzutragen und xinetd neu zu starten.

#### 7 Umleiten eines Dienstes auf einen anderen Rechner

xinetd kann auch als ein transparenter Proxy verwendet werden (jedenfalls beinahe, wie später zu sehen sein wird) und zwar mittels dem Attribut redirect. Dieses erlaubt es, eine Anfrage an einen Dienst an einen anderen Rechner und einem bestimmten Port weiterzuleiten.

    telnet service
    {
      flags  = REUSE
      socket_type = stream
      wait  = no
      user  = root
      server = /usr/sbin/in.telnetd
      only_from = 192.168.1.0/24
      redirect = 192.168.1.15 23
    }

Dabei passiert folgendes:

user@linux $ telnet charly Trying 192.168.1.1... Connected to charly. Escape character is '^]'. Digital UNIX (sabrina) (ttyp1) login:

Es scheint, als ob eine Verbindung mit dem Rechner charly aufgebaut worden ist. Tatsächlich aber befindet sich sabrina auf der anderen Seite der Verbindung (eine Alpha Maschine, auch an Digital UNIX zu erkennen). Die Weiterleitung kann recht nützlich, aber auch gefährlich sein.