sábado, 31 de mayo de 2008

Sockets en shellscript con xinetd

Existe la posibilidad de crear aplicaciones sencillas "tipo servidor" con scripts de shell. Vamos a ver un ejemplo en el que se configurará el daemon xinetd para abrir un socket y poner un programa a la escucha. En nuestro caso el programa en cuestión será un script, aunque podría utilizarse cualquier otro lenguaje de programación.

Configurando Xinetd:
Generalmente disponcremos de un archivo de configuración de xinetd similar al siguiente:

$ cat /etc/xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d

Este indica la inclusión de los scripts situados en /etc/xinet.d/.

ls -lh /etc/xinetd.d/
total 100K
-rw-r--r-- 1 root root 563 nov 19 17:53 chargen
-rw-r--r-- 1 root root 580 nov 19 17:53 chargen-udp
-rw-r--r-- 1 root root 419 nov 19 17:53 daytime
-rw-r--r-- 1 root root 438 nov 19 17:53 daytime-udp
-rw-r--r-- 1 root root 341 nov 19 17:53 echo
-rw-r--r-- 1 root root 360 nov 19 17:53 echo-udp
-rw-r--r-- 1 root root 318 jun 23 2002 finger
-rw-r--r-- 1 root root 370 sep 1 2002 imap
-rw-r--r-- 1 root root 365 sep 1 2002 imaps
-rw-r--r-- 1 root root 453 sep 1 2002 ipop2
-rw-r--r-- 1 root root 359 sep 1 2002 ipop3
-rw-r--r-- 1 root root 275 jul 5 2002 ntalk
-rw-r--r-- 1 root root 335 sep 1 2002 pop3s
-rw-r--r-- 1 root root 361 jun 24 2002 rexec
-rw-r--r-- 1 root root 378 jun 24 2002 rlogin
-rw-r--r-- 1 root root 431 jun 24 2002 rsh
-rw-r--r-- 1 root root 317 jun 25 2002 rsync
-rw-r--r-- 1 root root 312 nov 19 17:53 servers
-rw-r--r-- 1 root root 314 nov 19 17:53 services
-rw-r--r-- 1 root root 392 ago 11 2002 sgi_fam
-rw-r--r-- 1 root root 263 jul 5 2002 talk
-rw-r--r-- 1 root root 305 jul 23 2002 telnet
-rw-r--r-- 1 root root 497 nov 19 17:53 time
-rw-r--r-- 1 root root 518 nov 19 17:53 time-udp
-rw-r--r-- 1 root root 276 ago 16 2002 vsftpd

Editando cualquiera de estos archivos puede verse la estructura que siguen los scripts. Para nuestro propósito debemos crear uno de estos scritps, por ejemplo el siguiente:

service nuevoservicio
{
port = 6666
socket_type = stream
wait = no
user = nobody
server = /usr/local/bin/NuestroServidor.sh
log_on_success += USERID
log_on_failure += USERID
disable = no
}

El puerto escogido para la escucha debe estar especificado en el archivo /etc/services, en nuestro caso, el puerto 6666, no está especificado, por lo tanto añadimos la siguiente línea a /etc/services:

nuevoservicio 6666/tcp   # Nuestro servicio de prueba

Sencillo, ¿no?.

Ahora solo necesitamos crear el script "NuestroServidor.sh" y colocarlo en /usr/local/bin.

Podemos probar con el clásico:

#!/bin/bash

echo "Hello World!"

Para que el servidor funcione correctamente debemos asegurarnos de que dispone de permisos de ejecución para todos los usuarios.

finalmente reiniciamos xinetd:

$ /etc/rc.d/init.d/xinetd restart
Parando xinetd: [ OK ]
Iniciando xinetd: [ OK ]

Podemos probar con:

$ telnet localhost 6666
Trying 127.0.0.1...
Connected to hackerbox (127.0.0.1).
Escape character is '^]'.
Hello World!
Connection closed by foreign host.

El programa llamado por xinetd podría haberse desarrollado en cualquier otro lenguaje de programación: C, Perl ... Lo interesante de esta forma de hacerlo es que permite la creación de servicios simples en un tiempo récord. Aunque no se debe olvidar que en estos sistemas la seguridad no es uno de sus fuertes. Con cuidado!

2 comentarios:

Anónimo dijo...

Me parece muy interesante tu blog, felicidades, yo voy a intentar poco a poco ir dandole un cambio al mio y tratar un poco de estos temas, así por lo menos sirve de algo :).
Un saludo.

Anónimo dijo...

Estoy buscando gente para un proyecto que tengo en mente desde hace ya algo de tiempo, que es la de una "base de datos" basada en chat, foro, wiki, blog, plataforma educativa y escritorio web para el uso, aprendizaje y desarrollo de HTML, webs y todo lo que se le relacione. ¿Te gustaría formar parte? Mi web es www.solohtml.es y mi web personal es www.abdonjesusbp.es. Estoy buscando gente que le de un lavado de cara a la información que en ella muestro, es decir, que meta info en la wiki, que pida info para crear cursos, que impulse la creatividad de la web, que proponga cambios ...
Por cierto, si aceptas te ofrezco un subdominio, un blog WordPress(es mejor que blogger), un espacio web y la creación usuario con derechos adminiistrativos en todas las aplicaciones. Espero respuesta en mi mail;)
PD:
¡Ah!, se me olvidadaba. Buen blog:)