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