Articulo de referencia

inetd

inetd ( demonio de servicio de Internet ) es un demonio superservidor en muchos sistemas Unix que proporciona servicios de Internet . Para cada servicio configurado, escucha las...

inetd ( demonio de servicio de Internet ) es un demonio superservidor en muchos sistemas Unix que proporciona servicios de Internet . Para cada servicio configurado, escucha las solicitudes de los clientes conectados. Las solicitudes se atienden mediante la creación de un proceso que ejecuta el ejecutable apropiado, pero los servicios simples como echo son atendidos por el propio inetd. Apareció por primera vez en 4.3BSD , [ 1 ] generalmente se encuentra en . inetd se basa en el patrón de activador (de servicio) [ 2 ]./usr/sbin/inetd

Función

A menudo denominado superservidor , inetd escucha en puertos específicos utilizados por servicios de Internet como FTP , POP3 y telnet . Cuando llega un paquete TCP o UDP con un número de puerto de destino determinado, inetd inicia el programa servidor apropiado para gestionar la conexión. Para servicios que no se espera que operen con cargas elevadas, este método utiliza la memoria de forma más eficiente, ya que los servidores específicos se ejecutan solo cuando es necesario. Además, en el modo de gestión de servicios "nowait" de inetd, no se requiere código de red en los programas específicos del servicio, ya que inetd conecta el flujo de red directamente a la entrada y salida estándar del proceso creado. Para protocolos con tráfico frecuente, como HTTP y POP3, puede ser preferible el modo de operación "wait" de inetd o un servidor dedicado que intercepte el tráfico directamente.

Configuración

La lista de servicios que se atenderán se encuentra en un archivo de configuración, generalmente /etc/inetd.conf. Una interfaz gráfica de usuario (GUI) para administrar el archivo de configuración es un accesorio opcional. El demonio puede necesitar una señal para volver a leer su configuración. Por ejemplo, telnet se puede configurar de la siguiente manera (línea tomada de una máquina con AIX versión 5.1):

telnet stream tcp6 nowait root /usr/sbin/telnetd telnetd -a

La primera palabra, telnet, es el nombre oficial del servicio. Se resuelve utilizando la base de datos del sistema para asignar números de puerto y protocolos a nombres de servicio. En este caso, /etc/servicesdebería contener:

telnet 23/tcp

La segunda y la tercera palabra describen el tipo de socket y el protocolo subyacente, respectivamente. /etc/protocolsSe consulta la base de datos.

La cuarta palabra es el interruptor wait/nowait. Un servidor de un solo hilo espera que inetd espere hasta que termine de leer todos los datos. De lo contrario, inetd permite que el servidor se ejecute y crea nuevos procesos concurrentes para las nuevas solicitudes.

La quinta palabra es el nombre de usuario, extraído de la /etc/passwdbase de datos, con el que debe ejecutarse el programa de servicio.

Finalmente, se especifican la ruta y los argumentos de un programa externo. Como es habitual, el primer argumento es el nombre del programa. En el ejemplo, se le indica a inetd que ejecute el programa /usr/sbin/telnetdcon los argumentos de línea de comandos telnetd -a. inetd conecta automáticamente el socket a stdin, stdout y stderr del programa servidor.

Generalmente, los sockets TCP se gestionan mediante la creación de un servidor independiente para manejar cada conexión simultáneamente. Los sockets UDP generalmente se gestionan mediante una única instancia de servidor que procesa todos los paquetes en ese puerto.

Algunos servicios sencillos, como echo , son gestionados directamente por inetd, sin necesidad de iniciar un servidor externo.

Creación de un servicio inetd

Este es un servicio inetd sencillo, escrito en C. Espera un argumento de línea de comandos que contenga el nombre de un archivo de registro y, a continuación, registra todas las cadenas enviadas a través del socket en dicho archivo. Tenga en cuenta que este es un programa de ejemplo muy inseguro.

#include <stdio.h> #include <stdlib.h>int main ( int argc , char ** argv ) { const char * fn = argv [ 1 ]; FILE * fp = fopen ( fn , "a+" ); if ( fp == NULL ) exit ( EXIT_FAILURE );char str [ 4096 ]; /* inetd nos pasa su información por stdin. */ while ( fgets ( str , sizeof str , stdin )) { fputs ( str , fp ); fflush ( fp ); } fclose ( fp ); return 0 ; }

El ejemplo utiliza funciones de stdio y responde al tráfico de red que llega a través de stdin. En este caso, queremos que todos los mensajes se registren en un único archivo, por lo que solo necesitamos una instancia del servicio en ejecución para atender todas las solicitudes. Esto significa que UDP es el protocolo correcto. Primero, se debe seleccionar un número de puerto no utilizado. En este ejemplo, se utilizará el puerto 9999. La /etc/servicesentrada se verá así:

errorLogger 9999/udp

Y la entrada /etc/inetd.confse verá así:

errorLogger dgram udp espera raíz /usr/local/bin/errlogd errlogd /tmp/logfile.txt

Esto le indica a inetd que ejecute el /usr/local/bin/errlogdprograma, con la línea de comandos: errlogd /tmp/logfile.txt(consulte la página man de inetd.conf para obtener información sobre los demás argumentos). El primer argumento contiene el nombre del archivo que se utilizará para el archivo de registro: /tmp/logfile.txt. inetd ejecutará el servicio cuando sea necesario y adjuntará el puerto 9999 a los flujos de entrada y salida, y todas las cadenas enviadas a ese puerto se registrarán en el archivo. Al especificar wait , le indica a inetd que utilice solo una instancia del servidor para manejar todas las solicitudes.

Nota: la funcionalidad del ejemplo anterior se suele implementar mediante syslog y un proceso como syslogd. Normalmente, syslogd se inicia en paralelo con inetd, no como un servicio de inetd.

reemplazos de inetd

En los últimos años, debido a las limitaciones de seguridad en el diseño original de inetd, este ha sido reemplazado por xinetd , rlinetd, ucspi-tcp y otros en muchos sistemas. Las distribuciones de Linux, en particular, ofrecen muchas opciones, y Mac OS X (a partir de la versión 10.2 ) utiliza xinetd . A partir de la versión 10.4 de Mac OS X , Apple integró la funcionalidad de inetd en launchd .

Los servicios que proporciona inetd pueden omitirse por completo. Esto es cada vez más común en máquinas dedicadas a una sola función. Por ejemplo, un servidor HTTP podría configurarse para ejecutar únicamente httpd y no tener ningún otro puerto abierto. Un cortafuegos dedicado podría no tener ningún servicio iniciado.

systemd admite los servicios inetd y amplía la activación de sockets más allá de la mensajería IP ( AF INET +6) para incluir AF UNIX , AF NETLINK y más. [ 3 ] [ 4 ]

Seguridad

Si bien el concepto de inetd como gestor de servicios no es inherentemente inseguro, la larga lista de servicios que tradicionalmente ofrecía generó dudas entre los expertos en seguridad informática. Era necesario considerar la posibilidad de que un servicio tuviera una vulnerabilidad explotable o que simplemente se abusara de él. Deshabilitar los servicios innecesarios y dejarlos desactivados por defecto se convirtió en la norma. No es raro encontrar un archivo /etc/inetd.confcon casi todos los servicios comentados en una distribución Unix moderna.

Véase también

Referencias

  1. Manual del administrador del sistema FreeBSDinetd(8)  
  2. Lección 21: Servicios de Android e IPC local (parte 17) , 4 de noviembre de 2013 , consultado el 23 de octubre de 2023
  3. "Systemd para desarrolladores I" .
  4. "Repensando PID 1" .
  • inetd(8): 'super-servidor' de internet Manual del administrador del sistema FreeBSD   
Obtenido de " https://en.wikipedia.org/w/index.php?title=Inetd&oldid=1353549345 "