Instalación y configuración de un servidor de IRC

Diego Berrueta Muñoz, berrueta@geocities.com y José Alfredo Oslé Posadas, aosle@pinon.ccu.uniovi.es

Julio 1998
Este documento describe los pasos y el software necesarios para crear un servidor de IRC con Linux: el demonio de IRC, el bot de gestión del servidor y un programa cliente de IRC.

1. Nota de los autores

Este documento es el resultado de un trabajo realizado para el curso "Administración de un sistema UNIX con Linux", impartido en el verano de 1998 en la Escuela Universitaria de Ingeniería Técnica en Informática de Oviedo (EUITIO).

Los autores quieren aclarar que no son, ni pretenden ser, expertos en IRC. Por eso, este documento puede contener errores. Esperamos que sepan perdonarlos y nos los comuniquen.

Para obtener más información sobre Linux, no olvide visitar la página web del Proyecto Lucas, ( http://lucas.ctv.es/) donde se encargan de traducir las guías de Linux al castellano, y la página de INSFLUG ( http://www.insflug.org/), que coordina la traducción de los documentos HOWTO y FAQ).

2. Introducción

2.1 ¿Qué es el IRC?

El IRC (Internet Relay Chat) surgió como una ampliación del programa talk, tratando de superar sus limitaciones. Se trata de un sistema de conversación en tiempo real a través de redes de ordenadores y, por supuesto, de Internet. Las principales diferencias con el talk son las siguientes:

El IRC nació hace diez años, cuando el finlandés Jarkko Oikarinen escribió el primer programa para poder efectuar conversaciones con una estructura cliente-servidor. Su expansión fue muy rápida, puesto que pronto se implantó en la red nacional finlandesa (FUNET), y posteriormente en Noruega, Suiza y Estados Unidos.

La primera gran red de IRC fue EFNet (1990), y después surgieron otras como Undernet ( http://www.undernet.org), IRCNet, DALNet, StarChat, StarLink, NewLet. También existen redes para las personas de habla hispana, como RedLatina, IRC-Hispano ( http://www.irc-hispano.org) o la más reciente, Esnet ( http://www.esnet.org). Algunas de estas redes son de grandes magnitudes: por ejemplo, en Undernet existen más de diez mil canales.

2.2 ¿Qué es un servidor de IRC?

Como se ha comentado, el IRC se basa en redes de ordenadores. En estas redes, al menos un de los ordenadores trabaja como servidor, y sus funciones son recoger todos los mensajes enviados por los usuarios y reenviarlos. Por tanto, los mensajes no son enviados directamente del emisor al destinatario, sino que pasan por el servidor.

Esta filosofía de funcionamiento permite al administrador del servidor ejercer un cierto control: por ejemplo, puede impedir el acceso a determinados usuarios, ampliar las posibilidades de conversación comunicando varios servidores o limitar las posibilidades de los usuarios. Además, hace que todos los usuarios se conecten, en principio, en igualdad de condiciones, excepto el administrador, por supuesto.

2.3 ¿Qué necesita un servidor de IRC?

Para que un sistema UNIX pueda hacer las funciones de un servidor de IRC, es suficiente con lo siguiente:

Dando por supuesto el primer apartado, vamos a puntualizar más en el segundo. ¿Qué tipo de software se requiere? En principio, para el establecimiento de un servicio básico, es suficiente con ejecutar un demonio de IRC, que se encargará de las tareas descritas en el apartado anterior. Sin embargo, esto proporcionará un servicio precario: para un gestión eficiente y automática de la red de IRC, se hace necesario un bot o script, que se encargue de la gestión de usuarios y canales sin intervención por parte del administrador.

Con el fin de poder monitorizar y administrar la red, es conveniente que el servidor disponga también de un software cliente de IRC.

2.4 Comandos básicos de IRC

Antes de describir los comandos, es necesario conocer cuál es, a grandes rasgos, la filosofía del funcionamiento del IRC. Como ya ha quedado dicho, las conversaciones se organizan en canales, que a su vez se identifican por un nombre (generalmente comienza con el símbolo &), y un topic, que es una breve descripción de los temas a los que está dedicado el canal.

Para poder dar coherencia a las conversaciones, los usuarios también están identificados por un nombre, que se llama nick o apodo. Con el fin de poder mostrar una información más explícita sobre el usuario, muchas redes exigen introducir el nombre completo y dirección de correo electrónico para poder acceder; sin embargo, la mayoría de usuarios aprovecha estos campos para introducir algún comentario más o menos gracioso.

Cuando un usuario está dentro de un canal, cualquier texto que escriba y que no sea reconocido como un comando, será enviado a todos los demás usuarios que forman parte del canal, y se indicará el apodo del usuario emisor. De la misma forma, la recepción de mensajes es automática; simplemente aparecen en la pantalla cuando son enviados.

Dentro de un canal existe al menos un usuario que tiene más privilegios que el resto. Se conoce como operador (Op), y tiene, entre otros, el poder de expulsar a otros usuarios del canal.

Un usuario puede estar presente en varios canales, aunque para poder disfrutar plenamente de esta posibilidad, es necesario tener un software cliente potente y manejable.

Los comandos que se van a describir ahora son los más elementales que debe conocer un usuario para participar en las conversaciones. Estos comandos son enviados por el cliente al servidor, quien se encarga de reaccionar de forma adecuada ante ellos.

Los siguientes comandos los utilizan exclusivamente los operadores:

Para una lista más completa de los posibles comandos de IRC, se puede acudir a ftp://ftp.rediris.es/docs/rfc/14xx/1459.

2.5 Ataques en el IRC

Como veremos más adelante, tanto el demonio de IRC como el bot de gestión de los canales dedican una parte importante de su funcionalidad a impedir la entrada de algunos usuario en las redes de IRC. ¿Por qué es tan importante poder hacer esto?

La razón es que existen usuarios con grandes conocimientos sobre el IRC, y que muestran una actitud beligerante respecto a las más desprevenidos, los usuarios noveles. Aprovechándose de las grietas del sistema, son capaces de expulsar a otros usuarios e incluso colgar máquinas remotas, mediante diversos tipos de estrategias:

Al crear un servidor de IRC, se debe poner mucha atención en la prevención de ataques. Los ataques por saturación son relativamente fáciles de evitar mediante un bot capaz de detectarlos sobre la marcha y anularlos. Sin embargo, contra los ataques ICMP, la mejor manera de defenderse es utilizar la última versión del núcleo y los parches.

Para dificultar aún más el seguimiento de los atacantes, éstos suelen emplear bouncers, que son demonios colocados en una tercera máquina y que se limitan a redirigir todos los paquetes que les lleguen. De esta forma, el pirata puede actuar sin temor a que descubran su IP.

Se puede consultar más información sobre estos temas (ataques, defensas y monitorización) en las siguientes direcciones: http://www.irchelp.org/irchelp/nuke/ y http://www.esi.us.es/~roman/tacticas.html.

3. Demonio de IRC: ircd

3.1 Función de un demonio ircd

En una arquitectura centralizada como es la arquitectura cliente-servidor se distinguen precisamente estas dos partes: cliente, que es el que demanda un servicio; y el servidor, que es el que lo oferta. En la máquina servidor coexistirán tantos programas esperando a la escucha de nuevas peticiones como servicios diferentes se oferten.

Estos programas, denominados demonios (daemons en la terminología inglesa) son programas que están en ejecución, cargados en memoria, y que están encargados de responder a las peticiones que hacen los programas clientes, que generalmente están ubicados en otras máquinas, pero que pueden ejecutarse también en la propia máquina servidor. Por tanto, siempre hay una correspondencia directa entre el programa o demonio del servidor y el programa cliente de la máquina cliente.

En nuestro caso particular de IRC, el servidor será la máquina que ejecute el demonio ircd y los clientes serán los programas que los usuarios utilicen para engancharse a este servidor.

3.2 Descripción de ircd-hybrid

A la hora de instalar un servidor de IRC hay que elegir un demonio de ircd. Existen algunos como el irdu, utilizado en la red Undernet, o el más básico, ircd, sin modificación alguna. Pero nosotros hemos escogido el ircd-hybrid versión 5.2p1 por ser el más completo. Es el usado en la red Efnet.

3.3 Obtención e instalación

Algunas distribuciones como Debian incluyen este software entre sus paquetes básicos. Si utilizamos otra distribución, se puede recurrir al FTP o contactar con sus autores en la dirección ircd-hybrid@vol.com.

El primer paso es descomprimir el paquete con el comando:

tar xvzf ircd.tar.gz

Los ficheros descomprimidos los alojaremos en el directorio /usr/src/ircd-hybrid-5.2p1/.

Algunos de los ficheros más importantes son:

3.4 Configuración previa a la compilación

Como sugiere la documentación, es preciso revisar algunos ficheros donde se definen varios parámetros, por lo que será necesario compilar el programa. Sin embargo, el primer paso es adaptar los ficheros de configuración y compilación a nuestro sistema. Esto lo haremos ejecutando el script ./configure.

A continuación, editaremos parte del código fuente (por motivos de optimización): puesto que nuestra red no va a tener las pretensiones de afluencia de usuarios que tiene Efnet, acortaremos un poco los recursos reservados por el ircd para que consuma menos memoria.

El primer fichero que cambiaremos será include/config.h, que define muchas de las directrices de comportamiento del servidor. Modificaremos dos líneas define de esta forma:

#define HARD_FDLIMIT    256
#define INIT_MAXCLIENTS 150

También quitaremos la línea

#define DO_IDENTD

para que no chequee constantemente la identidad de todo aquel que entre, ralentizando los accesos al servidor.

El fichero src/list.c define el tamaño de algunas tablas mediante símbolos del preprocesador. Pondremos el valor 64 a las variables LINK_PREALLOCATE y CLIENTS_PREALLOCATE, lo que es suficiente para una red donde no se prevee un acceso mayor a 60 usuarios.

El último paso antes de la compilación es editar el fichero Makefile resultante de ejecutar el script ./configure, para que la línea que especifica los parámetros que usará el compilador gcc quede de la siguiente forma:

# Default CFLAGS
CFLAGS= -g -O2 -DCPU=586 -m486

Los dos últimos parámetros son opcionales, y sirven para optimizar el código generado para máquinas Pentium/AMD.

3.5 Compilación

Una vez hechos todos los ajustes pertinentes, se puede proceder a la compilación propiamente dicha, con el comando:

make

La compilación transcurrirá durante unos minutos, tras los cuales, si no se ha producido ningún error, sólo faltará crear el directorio /usr/local/ircd/, donde se instalarán los ficheros ejecutables gracias a la orden:

make install

3.6 El fichero ircd.conf

Ahora se configura el servidor de IRC. Esto se hace editando el fichero /usr/local/ircd/ircd.conf, que se estructura en diferentes líneas, identificadas con una letra, y que contienen parámetros separados por el signo ':'. Algunas de las líneas más importantes son:

Tras las modificaciones oportunas, nuestro fichero ircd.conf es:

M:maquina.euitio.uniovi.es:156.35.98.138:IRC EUITIO:6667
A:Universidad de Oviedo EUITIO:Asturias:SysAdm <root@maquina.euitio.uniovi.es>
Y:0:90:3:2:100000
Y:1:90:3:20:100000
I:*.euitio.uniovi.es::*::1
I:156.35.53.*::*::1
Y:3:90:1:100:100000
I:NOMATCH::*@*PPP*::3
I:NOMATCH::*@*slip*::3
o:root@maquina.euitio.uniovi.es:mAJif8plpvVls:Operador:0:0
# Fin del fichero
# No especificamos nada en las líneas
# - C, N, L y N: porque no nos conectamos a ningún otro servidor
# - K, R, D, E y F: porque no establecemos restricciones tan fuertes
# - P: porque no tenemos más puertos

Nota: para obtener el campo clave encriptada de la línea o, hay que utilizar la herramienta mkpasswd, ubicada en el directorio tools, que toma una cadena de texto y la devuelve encriptada.

Podemos verificar la correcta sintaxis del fichero de configuración ircd.conf mediante la utilización de la herramienta tools/chkconf.

También podemos modificar el fichero ircd.motd para establecer el mensaje del día que aparecerá a los usuarios que establezcan contacto con el servidor.

3.7 Ejecución del demonio

Por motivos de seguridad, no es posible lanzar el demonio como root, así que, o bien se lanza a mano como usuario irc, simplemente con:

/usr/local/ircd/ircd

o añadiendo la siguiente línea en el fichero /etc/inetd.conf:

ircd stream tcp wait irc /etc/ircd ircd -i

para que arranque automáticamente cada vez que se inicie el equipo servidor. Sin embargo, este segundo método no lo hemos podido confirmar porque, aparentemente, no ha funcionado.

4. El bot de gestión del servidor

4.1 Función de un bot de gestión del servidor

La función de un bot o script de gestión del servidor es ampliar las posibilidades del IRC, y a la vez permitir un cierto control sobre los usuarios. El bot se introduce como un usuario más, pero adquiere el poder del operador, lo que le permite administrar de manera eficiente los canales. Entre sus posibilidades están:

Existen multitud de bots disponibles. Entre los más importantes, podemos destacar:

4.2 Argobot

El Argobot es un bot relativamente sencillo escrito por el español Jesús Cea Avión ( http://www.argo.es/~jcea), aunque algunas grandes redes hispanas de IRC están adoptándolo. Soporta todas las características antes enunciadas, pero sin profundizar en ellas, de forma que no resulta tan grande y complejo como Eggdrop. Como ventaja añadida, ocupa muy poca memoria y es muy eficiente. Es un bot multicanal capaz de:

Otras características del Argobot son:

4.3 Instalación

El Argobot se puede conseguir en la página web de su creador ( http://www.argo.es/~jcea/irc/argobot.htm). Existen multitud de versiones, algunas desarrolladas específicamente para alguna gran red, y además se pueden conseguir una veintena de parches que corrigen algunos defectos y añaden nuevas características.

Si optamos por obtener el Argobot por Internet, descubriremos que apenas incluye unos pocos ficheros (código fuente C), y como única documentación un fichero README muy breve. Para paliar esta deficiencia, su autor a puesto toda la documentación disponible a través de Internet, en forma de páginas web. Es necesario, por tanto, descargar estas páginas y leerlas detenidamente.

El Argobot se suministra en forma de un fichero .tgz, que una vez descomprimido (en nuestro caso, en el directorio /usr/src/argobot/) da lugar a cuatro ficheros:

Es importante comprobar que este último fichero se ha creado realmente. Debido a algunas configuraciones de tar, es posible que no se genere este fichero (porque está vacío), lo que provocará errores al intentar ejecutar el Argobot. En este caso, es necesario crear el fichero manualmente (con la orden touch, por ejemplo), y darle los permisos apropiados.

Nota: si queremos utilizar una de las características más avanzadas del Argobot, como es la propagación de líneas K (sólo tiene sentido en redes de varios servidores), será necesario seguir las instrucciones relativas a los permisos y el fichero ircd.conf.

4.4 Edición del código fuente

Antes de compilar, es conveniente comprobar que el código fuente esta bien adaptado a nuestro sistema. Las modificaciones que debemos hacer dependen de la forma en la que vamos a ejecutar el bot:

Además de estas modificaciones, podemos definir el símbolo VERBOSE para que se impriman en la pantalla todos los mensajes que el servidor envía al Argobot. Otro símbolo interesante es CONTROL_FLOOD, que por defecto está activado, pero que deberemos eliminar si el nodo al que conectamos está preparado para controlar los ataques por flood.

4.5 Compilación

Como ya se ha indicado, el Argobot puede ser compilado bajo múltiples plataformas. En Linux, es suficiente con hacer:

gcc -Wall -g argobot.c -o argobot
chown root argobot
chgrp root argobot

La primera instrucción realiza la compilación, generando el fichero argobot. Con las dos siguientes, establecemos los propietarios de este fichero.

4.6 Configuración

La tarea de configuración se limita al fichero argobot.conf, aunque también es necesario crear una nueva cuenta de usuario para el operador del servidor IRC.

El fichero argobot.conf es un fichero de texto que contiene líneas con comandos. Al hacer la instalación, se genera un fichero de ejemplo, pero lo más conveniente es modificarlo para adaptarlo a nuestras necesidades. Los comandos son:

Puede haber tantos comandos join como sean necesarios. Para cada uno de ellos, se pueden indicar opciones específicas para el canal, mediante los siguientes comandos:

Para nuestro sistema, el fichero argobot.conf es el siguiente:

#
# Parámetros globales
#

# Nick utilizado a la hora de identificarse como IRCop, así como
# para el WHOIS
IRCnick ArgoBot

# Password correspondiente al nick anterior
IRCpasswd miclave
# Nick bajo el cual debe aparecer el bot
nick _ArgoBOT
passwd miclave

# Nombre del dominio al que se va a conectar el bot
server maquina.euitio.uniovi.es
port 6667

# Mensaje que aparece en el away del bot
away Bot de control de maquina.euitio.uniovi.es. No respondemos \
de los fallos.

# Mensaje enviado con el KILL a cualquier usuario que esté utilizando el
# nick definido en el comando NICK anterior
nick_collide Escoge otro Nick, por favor

# Las siguientes líneas configuran distintos aspectos de la seguridad
umbral_kline 5  # Máximo número de intentos (desconectado)
timeout_klines 15  # 15 minutos
timeout_whowas 5 # Tiempo entre whowas

#
#
# Grupos de usuarios
#
#

# Define el grupo de usuarios al que pertenecen todos
set todos *!*@*      # Comodines
group todos todos

# Define el grupo de IRCops
set diego *!diego@maquina.euitio.uniovi.es
set alfredo *!alfredo@maquina.euitio.uniovi.es
group IRCops diego alfredo

# Define el grupo de proveedores
group proveedores diego alfredo

# Canal ayuda-esnet
group ayuda-esnet diego alfredo

#
#
# Canales
#
#

join linux GOD
autoop IRCops
mode_default ntm
mode_disallow silpko
notice Canal dedicado a los amantes del Linux. \
Prohibido a Bill Gates.
timer 60 60 privmsg #linux :Mensaje enviado al canal linux de forma \
automática
timer 60 9999 topic #linux :Canal para los autenticos entendidos en \
informática y sistemas operativos.

# Pone un modo para reducir el consumo de ancho de banda
timer 60 600 mode _argobot :+d

4.7 Ejecución

Para ejecutar el bot, basta con escribir (preferiblemente como root):

cd /usr/src/argobot
./argobot

Si iniciamos Argobot de esta manera, imprimirá por la pantalla toda la actividad que registre (como entradas y salidas de usuarios), lo que puede ser conveniente por motivos de depuración, pero resulta innecesario durante una ejecución normal. Por tanto, es muy frecuente ejecutar el Argobot en segundo plano y redireccionando la salida:

nohup argobot &

Esto nos evitará ver todos los mensajes por la pantalla, pero los enviará a un fichero llamado nohup.out situado en el directorio actual. El problema es que este fichero puede crecer muy rápidamente, de manera que en grandes redes se suele enlazar con el dispositivo nulo, para convertirlo en un agujero negro:

ln -s /dev/null nohup.out

Durante la ejecución de una sesión de IRC, los usuarios autorizados pueden enviar mensajes al bot para cambiar su funcionamiento. Para realizar esta tarea, se emplea el comando MSG del IRC:

/MSG _argobot <clave> <comando> <canal> [nick]

Donde comando puede ser:

5. Cliente de IRC

5.1 Función de un cliente de IRC

La función de un cliente de IRC es conectarse al servidor y filtrar la información disponible para cada usuario. Además, debe encargarse de enviar los mensajes y comandos que escribe el usuario mediante el protocolo de IRC.

El cliente habitualmente reside en la máquina del usuario y se conecta al servidor a través de un puerto (generalmente el 6667). Existen clientes de IRC para todas las plataformas, dado que no es necesario que la plataforma cliente coincida con la del servidor. En los sistemas Windows, el cliente más popular es el mIRC, que nosotros elegimos para hacer las primeras pruebas y asegurarnos de que el demonio estaba funcionando correctamente. Una vez confirmado el buen funcionamiento del servidor, instalamos un cliente para Linux. Para esta plataforma, la oferta es muy grande. Los más conocidos son:

5.2 Descripción de BitchX

Entre sus características están:

5.3 Obtención e instalación

El BitchX puede conseguirse en http://www.bitchx.com/, desde donde se pueden conseguir varios ficheros: uno de ellos contiene el paquete básico y los demás son accesorios opcionales.

Tras descomprimir y desempaquetar el fichero con la orden tar en el directorio /usr/local/BitchX/, obtendremos directamente los ejecutables, puesto que se distribuye con los fuentes ya compilados.

5.4 Configuración

No contiene ningún fichero de configuración, sino que las opciones se establecen mediante variables de entorno. Las principales son:

Es conveniente dar valor a estas variables en los scripts de arranque o bien en el fichero ~/.profile de cada usuario del sistema.

5.5 Ejecución

El ejecutable se llama BitchX-tcl, pero resulta conveniente crear un enlace simbólico llamado irc situado en un directorio que forme parte del path para simplificar el trabajo de los usuarios.

6. Anexo: El INSFLUG

El INSFLUG forma parte del grupo internacional Linux Documentation Project, encargándose de las traducciones al castellano de los Howtos, así como de la producción de documentos originales en aquellos casos en los que no existe análogo en inglés, centrándose, preferentemente, en documentos breves, como los COMOs y PUFs (Preguntas de Uso Frecuente, las FAQs. :) ), etc.

Diríjase a la sede del Insflug para más información al respecto.

En ella encontrará siempre las últimas versiones de las traducciones «oficiales»: www.insflug.org. Asegúrese de comprobar cuál es la última versión disponible en el Insflug antes de bajar un documento de un servidor réplica.

Además, cuenta con un sistema interactivo de gestión de fe de erratas y sugerencias en línea, motor de búsqueda específico, y más servicios en los que estamos trabajando incesantemente.

Se proporciona también una lista de los servidores réplica (mirror) del Insflug más cercanos a Vd., e información relativa a otros recursos en castellano.

En http://www.insflug.org/insflug/creditos.php3 cuenta con una detallada relación de las personas que hacen posible tanto esto como las traducciones.

¡Diríjase a http://www.insflug.org/colaboracion/index.php3 si desea unirse a nosotros!.

«Cartel» Insflug, cartel@insflug.org.