inetd ( i nter net service d aemon) es un demonio de super-servidor 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 inetd atiende servicios simples como echo . Los ejecutables externos, que se ejecutan a pedido, pueden ser de uno o varios subprocesos. Apareciendo por primera vez en 4.3BSD , [1] generalmente se encuentra en ./usr/sbin/inetd
Función
A menudo llamado super-servidor , inetd escucha en puertos designados utilizados por servicios de Internet como FTP , POP3 y telnet . Cuando llega un paquete TCP o paquete UDP con un número de puerto de destino en particular, inetd lanza el programa de servidor apropiado para manejar la conexión. Para los servicios que no se espera que se ejecuten con cargas elevadas, este método utiliza la memoria de manera 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 ningún código de red en los programas específicos del servicio, ya que inetd conecta el flujo de red directamente a stdin y stdout del proceso generado. Para los protocolos que tienen tráfico frecuente, como HTTP y POP3, puede ser preferible el modo de operación "espera" de inetd o un servidor dedicado que intercepte el tráfico directamente.
Configuración
La lista de servicios que serán atendidos se proporciona en un archivo de configuración, generalmente /etc/inetd.conf
. Una 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 que ejecuta AIX versión 5.1):
secuencia telnet tcp6 ahoraait 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 servicios. En este caso, /etc/services
debe contener:
telnet 23 / tcp
La segunda y tercera palabras describen el tipo de socket y el protocolo subyacente, respectivamente. Se /etc/protocols
consulta la base de datos.
La cuarta palabra es el interruptor esperar / ahora. Un servidor de un solo subproceso espera que inetd espere hasta que termine de leer todos los datos. De lo contrario, inetd permite que el servidor se ejecute y genera nuevos procesos concurrentes para nuevas solicitudes.
La quinta palabra es el nombre de usuario, de la /etc/passwd
base de datos, con el que debe ejecutarse el programa de servicio.
Finalmente, se dan la ruta y los argumentos de un programa externo. Como de costumbre, el primer argumento es el nombre del programa. En el ejemplo, se le dice 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 del servidor.
Generalmente, los sockets TCP se manejan generando un servidor separado para manejar cada conexión al mismo tiempo. Los sockets UDP generalmente son manejados por una sola instancia de servidor que maneja todos los paquetes en ese puerto.
Algunos servicios simples, como echo , son manejados directamente por inetd, sin generar un servidor externo.
Creando un servicio inetd
Este es un servicio inetd sencillo, escrito en C . Espera un argumento de línea de comando que contenga un nombre de archivo para un archivo de registro y luego registra todas las cadenas enviadas a través del socket en el archivo de registro. Tenga en cuenta que este es un programa de ejemplo muy inseguro.
#include #include int main ( int argc , char ** argv ) { const char * fn = argv [ 1 ]; ARCHIVO * fp = fopen ( fn , "a +" ); if ( fp == NULL ) exit ( EXIT_FAILURE ); char str [ 4096 ]; / * inetd nos pasa su información en stdin. * / while ( fgets ( str , sizeof str , stdin )) { fputs ( str , fp ); enjuague ( fp ); } fclose ( fp ); return 0 ; }
El ejemplo usa funciones stdio y responde al tráfico de red que ingresa por stdin. En este caso, queremos que todos los mensajes se registren en un solo archivo, por lo que solo queremos que se ejecute una instancia del servicio para atender todas las solicitudes. Esto significa que UDP es el protocolo correcto para usar. Primero, se debe seleccionar un número de puerto no utilizado. En esta muestra, 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 esperar root / usr / local / bin / errlogd errlogd /tmp/logfile.txt
Esto le dice a inetd que ejecute el /usr/local/bin/errlogd
programa, con la línea de comando: errlogd /tmp/logfile.txt
(consulte la página de manual de inetd.conf para obtener información sobre los otros 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 conectará 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 esperar , le dice a inetd que solo use una instancia del servidor para manejar todas las solicitudes.
Nota: la funcionalidad del ejemplo anterior generalmente se implementa mediante el uso de syslog y un proceso como syslogd. syslogd normalmente se iniciaría en paralelo con inetd, no como un servicio de inetd.
reemplazos 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 especialmente tienen muchas opciones y Mac OS X (comenzando con Mac OS X v10.2 ) usa xinetd . A partir de la versión Mac OS X v10.4 , Apple ha fusionado la funcionalidad de inetd en launchd .
Los servicios proporcionados por inetd se pueden omitir por completo. Esto se está volviendo más común cuando las máquinas se dedican a una sola función. Por ejemplo, un servidor HTTP podría configurarse para ejecutar httpd y no tener otros puertos abiertos. Un firewall dedicado podría no tener servicios iniciados.
systemd admite servicios inetd y amplía la activación de socket más allá de la mensajería IP ( AF INET +6) para incluir AF UNIX , AF NETLINK y más. [2] [3]
Preocupaciones de seguridad
Si bien el concepto de inetd como despachador de servicios no es intrínsecamente inseguro, la larga lista de servicios que inetd brindaba tradicionalmente hizo que los expertos en seguridad informática se detuvieran. Había que considerar la posibilidad de que un servicio tuviera un defecto explotable, o simplemente se abusara del servicio. Los servicios innecesarios que se deshabilitan y "desactivan por defecto" se convirtieron en el mantra. No es raro encontrar una /etc/inetd.conf
con casi todos los servicios comentados en una distribución Unix moderna.
Ver también
Referencias
- ^ - Manual del administrador del sistema FreeBSD
- ^ http://0pointer.de/blog/projects/socket-activation.html
- ^ http://0pointer.de/blog/projects/systemd.html
enlaces externos
- : 'super-servidor' de Internet - FreeBSD System Manager's Manual