- Estréllate y Arde - https://www.estrellateyarde.org -
Servidores de red en Linux
Los servidores de red son demonios (programas que se ejecutan en segundo plano) que escuchan los puertos de red, y pueden ser muy simples (servidor Hola mundo).
¿Y qué son los puertos de red? El mecanismo para conectar con un programa concreto de una máquina a través de la red.
Para conectar con un servidor de red es necesario un cliente que entienda ese protocolo. El cliente universal es el comando telnet: además de ser un cliente Telnet (protocolo que permite abrir un shell remoto), actúa como cliente universal y puede conectar con cualquier servidor remoto apuntando al puerto correspondiente.
Un servidor de red puede funcionar de dos maneras:
inetd, el superservidor de Internet, es un demonio especializado en controlar las conexiones entrantes. Se ejecuta durante el inicio con el script /etc/init.d/inetd, queda en segundo plano y escucha determinados puertos de red por si llega alguna petición de conexión. Cuando una máquina intenta conectarse por uno de ellos, inetd lanza el servidor correspondiente para que controle el puerto afectado.
inetd se emplea porque en algunos casos, en vez de mantener en ejecución el servidor como demonio autónomo es preferible que sea inetd quien lo arranque si es necesario. Además, inetd permite aplicar mecanismos de seguridad adicional: en vez de arrancar el servidor solicitado directamente puede lanzar el limitador tcpd pasándole el nombre del servidor como argumento, para que tcpd verifique los permisos de acceso.
Por tanto, cuando en una máquina hay un puerto en el que escucha alguien, ese alguien será o bien un demonio autónomo o bien inetd.
El archivo de configuración de inetd es /etc/inetd.conf: en este archivo se especifica qué programa debe ser ejecutado cuando se recibe una petición para un servicio determinado. Su sintaxis es:
<service> <sock_type> <proto> <flags> <user> <server_path> <args>
Por ejemplo, para ejecutar el servidor ftpd desde inetd, añadiremos la siguiente línea al fichero /etc/inetd.conf:
# Servidor ftpd
ftp stream tcp nowait root /usr/sbin/ftpd ftpd
En el archivo /etc/inetd.conf se hace referencia a los archivos /etc/services y /etc/protocols:
<nombre_servicio> <puerto>/<protocolo> <alias>
Una pequeña parte del contenido de /etc/services es:
netstat 15/tcp ftp-data 20/tcp ftp 21/tcp ssh 22/tcp # SSH Remote Login Protocol ssh 22/udp telnet 23/tcp smtp 25/tcp mail whois 43/tcp nicname finger 79/tcp www 80/tcp # WorldWideWeb HTTP www 80/udp # HyperText Transfer Protocol pop3 110/udp pop-3
ip 0 IP # internet protocol, pseudo protocol number tcp 6 TCP # transmission control protocol udp 17 UDP # user datagram protocol ipv6 41 IPv6 # Internet Protocol, version 6
A veces, inetd no arranca el servidor solicitado directamente sino el programa tcpd pasándole el nombre del servidor pedido como argumento. Por ejemplo, para que inetd lance tcpd en vez de ejecutar el servidor ftpd, incluiremos en /etc/inetd.conf la línea:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
Con esta línea le decimos a inetd que cuando una aplicación solicite ftp, ejecute el comando /usr/sbin/tcpd pasándole como argumentos in.ftpd -l -a.
tcpd es un limitador de TCP (TCP wrappers), un programa de control de acceso que permite controlar el acceso a un servicio lanzado por inetd. tcpd, antes de ejecutar el servidor solicitado, comprueba /etc/hosts.allow y /etc/hosts.deny (en ese orden), concluyendo la consulta cuando encuentra la primera coincidencia. Veamos cómo trabaja tcpd:
/etc/hosts.allow y /etc/hosts.deny contienen permisos de acceso. Su sintaxis es:
<demonio>: <IP>: <opcion1>: <opcion2>
Por ejemplo, para impedir todas las conexiones excepto las procedentes de localhost (127.0.0.1) y de la red local (192.168.1.0/24) haremos lo siguiente:
ALL: 127.0.0.1
ALL: 192.168.1.0/24
ALL: 0.0.0.0/0
ALL: PARANOID
ALL: ALL
Un programa servidor que utilice inetd puede ser muy simple. Tiene que enviar y recibir datos utilizando una conexión TCP a través de la entrada y salida estándar.
El servidor más sencillo es Hola mundo. El archivo /usr/local/bin/helloserver solamente tiene dos líneas y su contenido es:
#!/bin/sh echo "Hola, mundo."
Para permitir que este programa acceda a la red sólo hay que añadir la siguiente línea en /etc/inetd.conf:
helloserver stream tcp nowait user /usr/local/bin/helloserver
El nombre simbólico del servicio será helloserver, por lo que tendremos que añadir una entrada para el puerto asociado a helloserver en /etc/services:
helloserver 50000/tcp
Por último, haremos que el superservidor tenga noticia de estos cambios, haciendo:
# /etc/init.d/inetd restart
Ahora helloserver se ejecutará como un servicio TCP por medio de inetd:
$ telnet localhost 50000 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is 'ˆ]'. Hola, mundo. Connection closed by foreign host.
Article printed from Estréllate y Arde: https://www.estrellateyarde.org
URL to article: https://www.estrellateyarde.org/discover/servidores-de-red-en-linux
Click here to print.
Copyright © 2010 Estrellate y Arde