Imprimir

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:

  1. como demonio autónomo (standalone).
  2. como esclavo del superservidor inetd.

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 superservidor 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>
  • service: nombre del servicio, según se especifica en /etc/services.
  • sock_type: tipo de socket. Puede ser stream, dgram, raw, rdm o seqpacket. Conexión de bajo nivel. Normalmente los servicios TCP utilizan stream y los UDP dgram.
  • proto: protocolo, según se especifica en /etc/protocols. Puede ser tcp o udp.
  • flags: wait o nowait. La opción nowait le indica a inetd que no espere a que termine el proceso en ejecución y arranque otro proceso en caso de que haya otra conexión entrante. Por el contrario, wait le indica a inetd que espere a que termine el proceso en ejecución antes de aceptar otra conexión en dicho puerto.
  • user: usuario que será el propietario del servicio. Sirve para especificar los privilegios con los que se ejecutará el servidor.
  • server_path: ruta del programa que se ejecuta.
  • args: argumentos que se pasan al programa.

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:

  • /etc/services: contiene la lista de servicios, puertos y protocolos. Su sintaxis es:
    <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
  • /etc/protocols: contiene una relación de protocolos IP con un número de orden. Una pequeña parte de /etc/protocols es:
    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

El limitador de TCP tcpd

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:

  • acceso permitido si hay una coincidencia en /etc/hosts.allow
  • acceso denegado si hay una coincidencia en /etc/hosts.deny
  • si no ha habido ninguna coincidencia el acceso será permitido.

/etc/hosts.allow y /etc/hosts.deny contienen permisos de acceso. Su sintaxis es:

<demonio>: <IP>: <opcion1>: <opcion2>
  • demonio: puede ser el demonio a lanzar, como por ejemplo ftpd, o ALL para referirnos a todos los demonios.
  • IP: puede ser una IP, un nombre de dominio, un rango de IPs (80.58.61.250/24) o un comodín, que pueden ser:
    • ALL: cualquier dirección entrante.
    • LOCAL: cualquier nombre que no tenga un "."
    • UNKNOWN: máquinas de las que no se conoce su nombre o su IP.
    • KNOWN: máquinas de las que se conoce tanto su nombre como su IP.
    • PARANOID: máquinas en las que su nombre no coincide con su IP.
  • opcion1 y opcion2 pueden ser:
    • allow: aceptar la conexión.
    • deny: denegar la conexión.
    • spawn: ejecuta un comando cada vez que se establece una conexión.
    • twist: como spawn pero cortando la conexión tras ejecutar el comando.

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:

  • añadiremos a /etc/hosts.allow las líneas:
    ALL: 127.0.0.1
    ALL: 192.168.1.0/24
  • añadiremos a /etc/hosts.deny las líneas:
    ALL: 0.0.0.0/0
    ALL: PARANOID
    ALL: ALL

Servidor Hola mundo

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.

2 Comentarios en “Servidores de red en Linux”

  • LIZETHRAS dice:

    ¿cuántas clases de direcciones 1p hay?
    y ¿cual es el rango de direcciones?
    y el significado de los dominios.

  • andy dice:

    hola que tal ando busquando como denegar el pop3 pero solo para un dominio espero y me puedas ayudar chao chao

Deja un comentario