Los servidores son demonios (programas que se ejecutan en segundo plano) que escuchan los puertos de red, y pueden ser muy simples (ver más abajo el 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:
- como demonio autónomo (standalone).
- 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 en Linux
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. |
¿cuántas clases de direcciones 1p hay?
y ¿cual es el rango de direcciones?
y el significado de los dominios.
hola que tal ando busquando como denegar el pop3 pero solo para un dominio espero y me puedas ayudar chao chao
por que se comparan a los servidores con demonios?????