Your requirement

You use xinetd to provide one or more services on the Internet. As the server you use your own program, e.g., a shell script. With this you want to realise e.g., Portknocking and therefore you want to find out the IP address of the host which has connected to you.

The solution

xinetd communicates the IP address of the remote host to the called program via the environment. This variable is called REMOTE_HOST.

An example

Let’s assume you attach a shell script /root/test.sh to UDP port 8888. Your configuration for xinetd will look something like this:

/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
}                           

The test script can access the address as follows:

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

You can also access the REMOTE_HOST variable from a C program. The getenv() function is available for this purpose:

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

Linux knowledge

Questi articoli sono stati scritti dal fondatore di Checkmk molti anni fa.
Tuttavia, sono ancora validi e quindi li conserviamo sul nostro sito web.
Da allora Mathias ha sviluppato il software di monitoraggio che oggi è Checkmk.

Scopri di più