IP-Adresse des Remote-Hosts bei xinetd

29. April 2006

Ihr Anliegen

Sie verwenden xinetd, um einen oder mehrere Dienste im Internet anzubieten. Als server verwenden Sie ein eigenes Programm, z.B. ein Shellskript. Damit wollen Sie z.B. Portknocking realisieren und wollen deshalb die IP-Adresse des Hosts feststellen, der sich zu Ihnen verbunden hat.

Die Lösung

xinetd teilt dem aufgerufenen Programm über das Environment die IP-Adresse des Remote-Hosts mit. Die Variable heißt REMOTE_HOST.

Ein Beispiel

Nehmen wir an, sie hängen an UDP Port 8888 ein Shellskript /root/test.sh. Ihre Konfiguration für xinetd sieht dann etwa so aus:


/etc/xinetd.d/test:
service test
{
        disable         = no
        type            = UNLISTED
        socket_type     = dgram
        protocol        = udp
        user            = root
        wait            = yes
        port            = 8888
        server          = /bin/bash
        server_args     = /root/test.sh
}                                                                               

Das Testskript kann wie folgt auf die Adresse zugreifen:


/root/test.sh:
#!/bin/bash
logger "xinetd: Verbindung auf Port 8888 von IP-Adresse $REMOTE_HOST"

Auch von einem C-Programm aus können Sie auf die Variable REMOTE_HOST zugreifen. Dafür gibt es die Funktion getenv():


xinettest.c:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *ip = getenv("REMOTE_HOST");
    printf("Adresse des Remote-Hosts: %s\n", ip ? ip : "(unbekannt)");    
}