inetd ( demonio de servicios 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 que se conectan. Las solicitudes se atienden generando un proceso que ejecuta el ejecutable apropiado, pero los servicios simples como echo son atendidos por el propio inetd. Los ejecutables externos, que se ejecutan a pedido, pueden ser de un solo subproceso o de varios . Apareció por primera vez en 4.3BSD , [1] generalmente se encuentra en . inetd se basa en el patrón (service) activator [2] /usr/sbin/inetd
A menudo llamado superservidor , inetd escucha en puertos designados 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 particular, inetd lanza el programa de servidor apropiado para manejar la conexión. Para los servicios que no se espera que se ejecuten con altas cargas, este método usa la memoria de manera más eficiente, ya que los servidores específicos se ejecutan solo cuando es necesario. Además, en el modo "nowait" de administración de servicios de inetd, no se requiere código de red en los programas específicos del servicio, ya que inetd engancha el flujo de red directamente a stdin y stdout del proceso generado. Para protocolos que tienen 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.
La lista de servicios que se van a atender se proporciona en un archivo de configuración, normalmente /etc/inetd.conf
. Una GUI para gestionar 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 que ejecuta AIX versión 5.1):
secuencia telnet 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/services
debe contener:
telnet23/tcp
La segunda y tercera palabras describen el tipo de socket y el protocolo subyacente respectivamente. /etc/protocols
Se consulta la base de datos.
La cuarta palabra es el interruptor esperar/no esperar. Un servidor de un solo subproceso espera que inetd espere hasta que termine de leer todos los datos. De lo contrario, inetd deja que el servidor se ejecute y genera nuevos procesos simultáneos para nuevas solicitudes.
La quinta palabra es el nombre de usuario, de la /etc/passwd
base de datos, bajo el cual debe ejecutarse el programa de servicio.
Por último, se proporcionan 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 inicie el programa /usr/sbin/telnetd
con los argumentos de la 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 que se encarga de cada conexión simultáneamente. Los sockets UDP suelen gestionarse mediante una única instancia de servidor que gestiona todos los paquetes en ese puerto.
Algunos servicios simples, como echo , son manejados directamente por inetd, sin generar un servidor externo.
Este es un servicio inetd simple, escrito en C. Espera un argumento de línea de comandos que contenga un nombre de archivo para un archivo de registro y luego registra todas las cadenas enviadas a través del socket al archivo de registro. 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 ]; ARCHIVO * fp = fopen ( fn , "a+" ); si ( fp == NULL ) salir ( ERROR_SALIDA ); char str [ 4096 ]; /* inetd nos pasa su información en stdin. */ while ( fgets ( str , sizeof str , stdin )) { fputs ( str , fp ); fflush ( fp ); } fclose ( fp ); return 0 ; }
El ejemplo utiliza funciones stdio y responde al tráfico de red que llega a través de la entrada estándar. En este caso, queremos que todos los mensajes se registren en un solo archivo, por lo que solo queremos que una instancia del servicio se ejecute para atender todas las solicitudes. Esto significa que UDP es el protocolo correcto que se debe utilizar. Primero, se debe seleccionar un número de puerto no utilizado. En este ejemplo, se utilizará 9999. La /etc/services
entrada se verá así:
ErrorLogger 9999/udp
Y la entrada /etc/inetd.conf
se 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/errlogd
programa, con la línea de comandos: errlogd /tmp/logfile.txt
(consulte la página del manual inetd.conf para obtener información sobre los otros argumentos). El primer argumento contiene el nombre de 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 solo use una instancia del servidor para manejar todas las solicitudes.
Nota: la funcionalidad del ejemplo anterior generalmente se implementa utilizando syslog y un proceso como syslogd. syslogd normalmente se iniciaría en paralelo con inetd, no como un servicio inetd.
En los últimos años, debido a las limitaciones de seguridad en el diseño original de inetd, ha sido reemplazado por xinetd , rlinetd, ucspi-tcp y otros en muchos sistemas. Las distribuciones de Linux en particular tienen muchas opciones y Mac OS X (a partir de Mac OS X v10.2 ) utiliza xinetd . A partir de la versión Mac OS X v10.4 , Apple ha fusionado la funcionalidad de inetd en launchd .
Los servicios que proporciona inetd se pueden omitir por completo. Esto se está volviendo más común en los casos en que las máquinas se dedican a una sola función. Por ejemplo, un servidor HTTP se puede configurar para que solo ejecute httpd y no tenga otros puertos abiertos. Un firewall dedicado podría no tener servicios iniciados.
systemd admite 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]
Si bien el concepto de inetd como despachador de servicios no es inherentemente inseguro, la larga lista de servicios que inetd proporcionaba tradicionalmente hizo reflexionar a los expertos en seguridad informática. Se debía considerar la posibilidad de que un servicio tuviera una falla explotable o que simplemente se abusara del mismo. La desactivación y el "desactivado por defecto" de servicios innecesarios se convirtió en el mantra. No es raro encontrar un /etc/inetd.conf
con casi todos los servicios comentados en una distribución Unix moderna.