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)");    
}

Wissensbank Linux

Diese Artikel wurden vom Gründer von Checkmk vor vielen Jahren geschrieben. Sie sind immer noch gültig und haben deshalb weiterhin ihr Zuhause auf dieser Webseite. Mathias hat in der Zwischenzeit die Monitoringlösung Checkmk entwickelt

Mehr zu Checkmk