<!doctype linuxdoc system>

<article>

<title>Instalación y configuración de un servidor de IRC

<author>Diego Berrueta Muñoz, <tt><htmlurl
url="mailto:berrueta@geocities.com" name="berrueta@geocities.com"></tt> y
José Alfredo Oslé Posadas, <tt><htmlurl
url="mailto:aosle@pinon.ccu.uniovi.es" 
name="aosle@pinon.ccu.uniovi.es"></tt>

<date>Julio 1998

<abstract>
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.
</abstract>

<toc>

<sect>Nota de los autores 
<p>

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 (<it>EUITIO</it>). 

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 <it>Proyecto Lucas</it>, (<tt><htmlurl url="http://lucas.ctv.es/" 
name="http://lucas.ctv.es/"></tt>) donde se encargan de traducir las guías
de Linux al castellano, y la página de <it>INSFLUG</it> (<tt><htmlurl
url="http://www.insflug.org/" name="http://www.insflug.org/"></tt>), que
coordina la traducción de los documentos <it>HOWTO</it> y <it>FAQ</it>).

<sect>Introducción 
<p>

<sect1>¿Qué es el IRC? 
<p>

El IRC (<it>Internet Relay Chat</it>) surgió como una ampliación del
programa <it>talk</it>, 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
<it>talk</it> son las siguientes: 

<itemize>

<item> Incorpora un protocolo mucho más elaborado, independiente de la
plataforma. 

<item> Posibilidad de conversaciones en las que intervengan más de dos
participantes: el límite depende sólo de las posibilidades de los
servidores. 

<item> Organización de las charlas en forma de múltiples <it>canales</it>: 
por establecer un símil, los canales son <it>salones</it> donde se dan
cita un cierto número de usuarios. Esta posibilidad se aprovecha
generalmente para realizar canales temáticos, que son el punto de
encuentro de personas con inquietudes parecidas. 

<item> Posibilidad de conectar varias redes, para poner en comunicación
un gran número de usuarios. 

<item> Los usuarios pueden ocultar su identidad, lo que facilita
conversaciones más espontáneas, pero también puede crear riesgos de
seguridad. 

</itemize>

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 (<it>FUNET</it>), y posteriormente
en Noruega, Suiza y Estados Unidos. 

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

<sect1>¿Qué es un servidor de IRC? 
<p>

Como se ha comentado, el IRC se basa en redes de ordenadores. En estas
redes, al menos un de los ordenadores trabaja como <it>servidor</it>, 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. 

<sect1>¿Qué necesita un servidor de IRC? 
<p>

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

<itemize>
<item> Tener acceso a la red.
<item> Instalar el software apropiado.
</itemize>

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
<it>demonio</it> 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 <it>bot</it> o <it>script</it>, 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. 

<sect1>Comandos básicos de IRC 
<p>

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 <tt/&amp;/), y un
<it>topic</it>, 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 <it>nick</it> o <it>apodo</it>. 
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 <it>operador</it> (<it>Op</it>), 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. 

<itemize>
<item><tt>/HELP</tt>: permite obtener ayuda.

<item><tt>/JOIN &amp;nombre_canal, /CHANNEL &amp;nombre_canal</tt>:

introduce al usuario en el canal especificado. Si este canal no existe, se
crea (la gestión dinámica de canales es otra de las posibilidades del
IRC), y además confiere al usuario el privilegio de ser el operador del
canal. 

<item><tt>/WHO nombre_canal</tt>: muestra una lista de los usuarios del
IRC. Si se indica un nombre de canal, restringe el listado a las personas
que están presentes en ese canal. 

<item><tt>/WHOIS nick</tt>: muestra más información sobre un usuario del
que conocemos su nick. Sin embargo, por las razones ya comentadas, la
información no suele ser cierta. 

<item><tt>/TOPIC cadena</tt>: cambia el <it>topic</it> o descripción del
canal (si tenemos privilegios para poder hacerlo).

<item><tt>/NICK nuevo_nick</tt>: permite cambiar nuestro nick o apodo.

<item><tt>/MSG nick mensaje</tt>: envía un mensaje personal a un usuario
determinado, sin que los demás usuarios lo vean en su pantalla.

<item><tt>/SIGNOFF, /SI, /BYE, /EXIT, /QUIT</tt>: cualquiera de ellos
sirve para abandonar la conversación. Si se añade un texto detrás del
comando, será enviado como mensaje de despedida. 

<item><tt>/USERS</tt>: muestra una lista de todos los usuarios conectados
al servidor. 

<item><tt>/AWAY</tt>: se utiliza para anunciar que, sin abandonar el
servidor, vamos a estar unos minutos sin atender a la conversación. 

<item><tt>/QUERY nick</tt>: invita al usuario indicado a participar en una
conversación privada. Si el receptor responde con un comando similar, el
diálogo particular dará comienzo.

</itemize>

Los siguientes comandos los utilizan exclusivamente los operadores:

<itemize>

<item><tt>/OPER nick password</tt>: da al usuario indicado los privilegios
de operador (si la contraseña es válida). 

<item><tt>/KICK nick</tt>: expulsa al usuario indicado del servidor. 

<item><tt>/QUOTE comando</tt>: permite enviar comandos al servidor. Se
puede utilizar para matar el demonio o realizar operaciones privilegiadas. 

</itemize>

Para una lista más completa de los posibles comandos de IRC, se puede
acudir a <tt><htmlurl url="ftp://ftp.rediris.es/docs/rfc/14xx/1459" 
name="ftp://ftp.rediris.es/docs/rfc/14xx/1459"></tt>. 

<sect1>Ataques en el IRC 
<p>

Como veremos más adelante, tanto el <it>demonio</it> de IRC como el
<it>bot</it> 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 <it>colgar</it> máquinas remotas,
mediante diversos tipos de estrategias: 

<itemize>

<item><it>Flood</it>: consiste en requerir mucha información de un usuario
de manera continua (mediante <tt>version, whois, ping, dcc</tt>, etc.),
con el objeto de que la máquina atacada devuelva todas las peticiones,
llegando a poner en peligro de saturación al servidor, que procederá a
expulsarla. 

<item><it>Floodnets</it>: son grupos de usuarios coordinados mediante
<it>scripts</it>, que consiguen hacer el trabajo de <it>flood</it> más
efectivo. 

<item><it>Botnets</it>: se trata de una versión automatizada (mediante
<it>scripts</it>) del <it>flood</it>. 

<item><it>ICMP</it>: este tipo de ataques son mucho más sofisticados y
malignos. Como dato, baste decir que existe un <it>script</it> escrito en
sólo cinco líneas de <it>perl</it> y capaz de bloquear una máquina Windows
remota. 

<item><it>Smurf</it>: consiste en enviar un <it>ping</it> a la dirección
<it>broadcast</it> de una gran red, con la identidad del remitente
falseada para que apunte a la persona atacada. Las respuestas de las
máquinas de la red irán directamente a esta persona, rompiéndole la
conexión. 

</itemize>

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 <it>bot</it> capaz de detectarlos sobre la marcha y anularlos. 
Sin embargo, contra los ataques <it>ICMP</it>, 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 <it>bouncers</it>, 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: <tt><htmlurl
url="http://www.irchelp.org/irchelp/nuke/" 
name="http://www.irchelp.org/irchelp/nuke/"></tt> y <tt><htmlurl
url="http://www.esi.us.es/~roman/tacticas.html" 
name="http://www.esi.us.es/~roman/tacticas.html"></tt>. 

<sect>Demonio de IRC: <tt>ircd</tt> 
<p>

<sect1>Función de un demonio <tt>ircd</tt> 
<p>

En una arquitectura centralizada como es la <it>arquitectura
cliente-servidor</it> se distinguen precisamente estas dos partes: 
<it>cliente</it>, que es el que demanda un servicio; y el
<it>servidor</it>, 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 <it>demonios</it> (<it>daemons</it> 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 <it>ircd</it> y los clientes serán los programas que los
usuarios utilicen para <it>engancharse</it> a este servidor. 

<sect1>Descripción de <tt>ircd-hybrid</tt> 
<p>

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

<sect1>Obtención e instalación 
<p>

Algunas distribuciones como <it>Debian</it> 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 <tt><htmlurl
url="mailto:ircd-hybrid@vol.com" name="ircd-hybrid@vol.com"></tt>.

El primer paso es descomprimir el paquete con el comando:

<tscreen><verb>
tar xvzf ircd.tar.gz
</verb></tscreen>

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

Algunos de los ficheros más importantes son:

<itemize>

<item><tt>INSTALL</tt>: describe los pasos a realizar para la instalación.

<item><tt>README.FIRST, README.hybrid, README.small_nets</tt>: como
siempre, conviene leerlos antes de proceder a la instalación. 

<item><tt>Opers.txt</tt>: describe los comandos para el operador del
servidor IRC. 

<item><tt>Doc/</tt>: este directorio contiene documentación sobre IRC.
</itemize>

<sect1>Configuración previa a la compilación 
<p>

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 <it>script</it> <tt>./configure</tt>.

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 <it>Efnet</it>, acortaremos un poco los
recursos reservados por el <it>ircd</it> para que consuma menos memoria.

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

<tscreen><verb>
#define HARD_FDLIMIT    256
#define INIT_MAXCLIENTS 150
</verb></tscreen>

También quitaremos la línea

<tscreen><verb>
#define DO_IDENTD
</verb></tscreen>

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

El fichero <tt>src/list.c</tt> define el tamaño de algunas tablas mediante
símbolos del preprocesador. Pondremos el valor 64 a las variables
<tt>LINK_PREALLOCATE</tt> y <tt>CLIENTS_PREALLOCATE</tt>, 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
<tt>Makefile</tt> resultante de ejecutar el <it>script</it>
<tt>./configure</tt>, para que la línea que especifica los parámetros que
usará el compilador <tt>gcc</tt> quede de la siguiente forma: 

<tscreen><verb>
# Default CFLAGS
CFLAGS= -g -O2 -DCPU=586 -m486
</verb></tscreen>

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

<sect1>Compilación 
<p>

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

<tscreen><verb>
make
</verb></tscreen>

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

<tscreen><verb>
make install
</verb></tscreen>

<sect1>El fichero <tt>ircd.conf</tt> 
<p>

Ahora se configura el servidor de IRC. Esto se hace editando el fichero
<tt>/usr/local/ircd/ircd.conf</tt>, 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: 

<itemize>

<item><tt>A</tt>: información sobre los administradores:

<enum>
<item>Compañía
<item>Localización
<item>Dirección de contacto
</enum>

<item><tt>M</tt>: información sobre el servidor:

<enum>
<item>Nombre del host
<item>Dirección IP (opcional)
<item>Nombre del servidor IRC
<item>Puerto (generalmente, 6667).
</enum>

<item><tt>K</tt>: restricciones de acceso a usuarios o redes completas:

<enum>
<item>Nombre del host.
<item>Horario.
<item>Nombre de usuario.
</enum>

<item><tt>C</tt> y <tt>N</tt>: conexiones a otros servidores de IRC.

<item><tt>R</tt>: establece restricciones a través de un programa externo
de validación. 

<item><tt>D</tt>: otra forma de impedir conexiones a redes enteras,
mostrando un comentario. 

<item><tt>E</tt>: excepciones a la línea <tt>K</tt>.

<item><tt>F</tt>: super-excepción (similar a la anterior, pero se salta
los límites de clases de usuarios). 

<item><tt>Y</tt>: define una clase de usuario:

<enum>
<item>Número de clase.
<item>Frecuencia de ping (segundos).
<item>Usuarios por IP.
<item>Número máximo de enlaces.
<item>Tamaño de la cola de envío.
</enum>

<item><tt>I</tt>: permite el acceso a algunas máquinas:

<enum>
<item>Dominio o dirección IP.
<item>Password del cliente.
<item>No documentado (generalmente '*').
<item>No documentado.
<item>Número de clase asociada.
</enum>

<item><tt>o</tt>: define operadores locales (recomendado):

<enum>
<item>usuario@host.
<item>Clave encriptada.
<item><it>Nick</it> del operador.
<item>No documentado (generalmente 0).
<item>No documentado (generalmente 0).
</enum>

<item><tt>O</tt>: define operadores globales.
<item><tt>P</tt>: configura puertos adicionales.
</itemize>

Tras las modificaciones oportunas, nuestro fichero <tt>ircd.conf</tt> es:

<tscreen><verb>
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
</verb></tscreen>

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

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

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

<sect1>Ejecución del demonio 
<p>

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

<tscreen><verb>
/usr/local/ircd/ircd
</verb></tscreen>

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

<tscreen><verb>
ircd stream tcp wait irc /etc/ircd ircd -i
</verb></tscreen>

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.

<!-- sugerencia del revisor: ¿y desde inittab? -->

<sect>El <it>bot</it> de gestión del servidor 
<p>

<sect1> Función de un <it>bot</it> de gestión del servidor
<p>

La función de un <it>bot</it> o <it>script</it> de gestión del servidor es
ampliar las posibilidades del IRC, y a la vez permitir un cierto control sobre
los usuarios. El <it>bot</it> 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:

<itemize>
<item>Envío de mensajes periódicos a ciertos canales.
<item>Impedir la entrada de usuarios no deseados.
<item>Reconocer a los administradores del servidor y cederles el poder.
<item>Aumentar la seguridad general del servidor.
<item>Impedir que los usuarios puedan expulsarse entre ellos.
</itemize>

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

<itemize>
<item><it>Eggdrop</it>: posiblemente el más conocido, pero también el más
complejo de instalar y mantener. Requiere TCL.
<item><it>Uworld</it>.
<item><it>Cservice</it>.
<item><it>Argobot</it>.
</itemize>

<sect1><it>Argobot</it> 
<p>

El <it>Argobot</it> es un <it>bot</it> relativamente sencillo escrito por el
español Jesús Cea Avión (<tt><htmlurl url="http://www.argo.es/~jcea"
name="http://www.argo.es/~jcea"></tt>), 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 <it>Eggdrop</it>. Como ventaja añadida, ocupa muy poca memoria y es muy
eficiente. Es un <it>bot</it> multicanal capaz de:

<itemize>
<item>Proteger los modos de un canal.
<item>Dar y quitar los privilegios de operador de forma manual y automática.
<item>Enviar mensajes (<it>notices</it>) a los usuarios recién llegados a
un canal.
<item>Controlar el acceso y configuración de modos y permisos
independientemente para cada canal.
<item>Acceder a redes que exigen claves.
</itemize>

Otras características del Argobot son:

<itemize>
<item>Se distribuye con el código fuente completo (escrito en lenguaje C), y
que además puede compilarse bajo UNIX o en plataformas Windows.
<item>Utiliza un fichero de configuración.
<item>Lleva registros (ficheros <it>log</it>) de toda la actividad que se
produce en el servidor.
<item>Puede reconfigurarse sin necesidad de detener su actividad, es decir,
puede modificarse su configuración y cargar de nuevo el <it>bot</it> sin que
los usuarios adviertan ningún cambio ni interrupción del servicio.
</itemize>

<sect1>Instalación 
<p>

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

Si optamos por obtener el <it>Argobot</it> por Internet, descubriremos que
apenas incluye unos pocos ficheros (código fuente C), y como única
documentación un fichero <tt>README</tt> 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 <it>Argobot</it> se suministra en forma de un fichero <tt>.tgz</tt>, que una
vez descomprimido (en nuestro caso, en el directorio
<tt>/usr/src/argobot/</tt>) da lugar a cuatro ficheros:

<itemize>
<item><tt>argobot.c</tt>: fichero principal del código fuente.
<item><tt>argo_parser.c</tt>: código fuente que interpreta el fichero de
configuración.
<item><tt>argobot.conf</tt>: fichero de configuración.
<item><tt>argobot.log</tt>: mantiene un registro de los comandos enviados
al bot.
</itemize>

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

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

<sect1>Edición del código fuente 
<p>

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 <it>bot</it>:

<itemize>

<item>Si vamos a ejecutar el <it>bot</it> como <it>root</it> (es el método
recomendado), nos aseguraremos de que está definido <tt>SEGURIDAD</tt> (con la
sentencia <tt>#define SEGURIDAD</tt>), y que las macros <tt>UID</tt> y
<tt>GID</tt> tienen valores apropiados. Si además vamos a hacer un
<it>CHROOT</it> (que es una medida adicional de seguridad), definiremos el
directorio que debe tomar como raíz con la sentencia <tt>&num;define CHROOT
&lt;directorio&gt;</tt>.
<item>Si vamos a ejecutar el <it>bot</it> como un usuario distinto a
<it>root</it>, debemos eliminar el símbolo <tt>SEGURIDAD</tt> (con la
sentencia <tt>&num;undef SEGURIDAD</tt>).
</itemize>

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

<sect1>Compilación 
<p>

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

<tscreen><verb>
gcc -Wall -g argobot.c -o argobot
chown root argobot
chgrp root argobot
</verb></tscreen>

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

<sect1>Configuración 
<p>

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

El fichero <tt>argobot.conf</tt> 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:

<itemize>

<item><tt>IRCnick &lt;nick&gt;</tt>: indica cuál es el <it>nick</it> que debe
emplear el <it>bot</it> para identificarse como operador ante el nodo IRC.

<item><tt>IRCpasswd &lt;password&gt;</tt>: complementa al comando anterior,
indicando la clave necesaria para adquirir los privilegios de operador.

<item><tt>nick &lt;nick&gt;</tt>: especifica el <it>nick</it> bajo el que
aparecerá el <it>bot</it> a los usuarios.

<item><tt>server &lt;servidor&gt;</tt>: sirve para indicar el servidor a
que va a conectarse.

<item><tt>port &lt;puerto&gt;</tt>: indica el puerto al que se va a
conectar (generalmente, el 6667).

<item><tt>passwd &lt;password&gt;</tt>: clave que será enviada al servidor
al principio de la conexión, con lo que se podrá acceder a otras redes que
necesiten claves.

<item><tt>away &lt;mensaje&gt;</tt>: mensaje que se muestra a los usuarios
al entrar.

<item><tt>nick_collide &lt;mensaje&gt;</tt>: mensaje enviado a aquellos
usuarios que estén utilizando el <it>nick</it> indicado en el comando
<tt>nick</tt>. Inmediatamente después, se les expulsará mediante un
<it>kick</it>.

<item><tt>umbral_kline &lt;valor&gt;</tt>: indica cuántos intentos de
conexión se permitirán antes de poner una <it>línea k</it> local. El valor
más corriente es cinco. Esto es una medida de protección contra los usuarios
que tengan una actitud sospechosa.

<item><tt>timeout_klines &lt;valor&gt;</tt>: indica cuántos segundos
permanecerá activa una <it>línea k</it> local. El valor más aconsejable es en
torno a 900 (es decir, 15 minutos).

<item><tt>timeout_whowas &lt;valor&gt;</tt>: indica cada cuántos segundos
hay que comprobar la presencia de <it>clones</it> (usuarios que están
presentes bajo varios <it>nicks</it>, lo que suele ser síntoma de actividades
peligrosas). Es conveniente un valor en torno a cinco.

<item><tt>timer &lt;offset&gt; &lt;periodo&gt; &lt;comando&gt;</tt>:
se utiliza para enviar comandos periódicos al servidor de IRC, que se
repetirán cada cierto número de segundos. El <it>offset</it> indica el retraso
del primer envío.

<item><tt>set &lt;alias&gt; &lt;máscara&gt; [clave]</tt>: define un
usuario. El nombre de referencia (interno al <it>Argobot</it> será el
<it>alias</it>, y se aplicará a aquel usuario que satisfaga las condiciones de
la <it>máscara</it>, que tiene la forma <tt>nick!usuario@dominio</tt> (se
admiten comodines).

<item><tt>group &lt;nombre_grupo&gt; &lt;alias&gt; [&lt;alias&gt;...]</tt>:
define un grupo de usuarios, cuyo nombre será el indicado, y al que
pertenecerán los usuarios indicados a continuación.

<item><tt>join &lt;canal&gt; [clave]</tt>: indica al <it>bot</it> que
debe gestionar el canal indicado, entrando con la clave proporcionada, que
es opcional. Si utilizamos la clave <tt>GOD</tt>, se forzará la entrada del
<it>bot</it>. NOTA: dado que el carácter '#' se emplea para indicar
comentarios, no debe escribirse en el campo <it>canal</it>. Por tanto, si
escribimos <tt>linux</tt>, estamos refiriéndonos al canal <tt>#linux</tt>.
</itemize>

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

<itemize>

<item><tt>autoop &lt;grupo&gt;</tt>: cualquier usuario del grupo indicado
será automáticamente dotado de los privilegios de operador cuando entre en
el canal.

<item><tt>privil &lt;grupo&gt;</tt>: declara privilegiados a los miembros del
grupo indicado, lo que les permitirá enviar comandos al <it>bot</it>.

<item><tt>mode_default &lt;modos&gt;</tt>: indica el modo por defecto del
canal.

<item><tt>mode_disallow &lt;modos&gt;</tt>: prohibe algunos modos en el
canal.

<item><tt>log &lt;fichero&gt;</tt>: almacena toda la actividad del canal
en un fichero. Se incluyen marcas temporales cada diez minutos.

<item><tt>notice &lt;texto&gt;</tt>: indica un mensaje que será enviado
a todos los usuarios que entren en el canal.

<item><tt>allow_any_ban</tt>: permite a los operadores del canal hacer
prácticamente todo, lo que no es muy aconsejable.
</itemize>

Para nuestro sistema, el fichero <tt>argobot.conf</tt> es el siguiente:

<tscreen><verb>
#
# 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
</verb></tscreen>

<sect1>Ejecución 
<p>

Para ejecutar el <it>bot</it>, basta con escribir (preferiblemente como
<it>root</it>):

<tscreen><verb>
cd /usr/src/argobot
./argobot
</verb></tscreen>

Si iniciamos <it>Argobot</it> 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 <it>Argobot</it>
en segundo plano y redireccionando la salida:

<tscreen><verb>
nohup argobot &
</verb></tscreen>

Esto nos evitará ver todos los mensajes por la pantalla, pero los enviará
a un fichero llamado <tt>nohup.out</tt> 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 <it>agujero negro</it>:

<tscreen><verb>
ln -s /dev/null nohup.out
</verb></tscreen>

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

<tscreen><verb>
/MSG _argobot &lt;clave&gt; &lt;comando&gt; &lt;canal&gt; [nick]
</verb></tscreen>

Donde <it>comando</it> puede ser:

<itemize>
<item><tt>op</tt>: da privilegios de operador al usuario indicado.
<item><tt>deop</tt>: quita los privilegios de operador al usuario indicado.
<item><tt>invite</tt>: invita a un usuario a un canal.
</itemize>

<sect>Cliente de IRC
<p>

<sect1>Función de un cliente de IRC 
<p>

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 <it>mIRC</it>, que nosotros elegimos para hacer las primeras
pruebas y asegurarnos de que el <it>demonio</it> 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:

<itemize>

<item><it>Kirc</it> (<tt><htmlurl url="ftp://ftp.kde.org/"
name="ftp://ftp.kde.org/"></tt>): el más antiguo cliente en el entorno
<it>KDE</it>.  Tiene un entorno gráfico muy cuidado, pero carece de algunas
características básicas.

<item><it>Ksirc</it> (<tt><htmlurl url="http://www.ksirc.org/"
name="http://www.ksirc.org/"></tt>): también para el <it>KDE</it> y resultado
de la evolución de un cliente en modo texto (el <it>Sirc</it>). Está todavía en
fase de desarrollo.  

<item><it>Keric</it> (<tt><htmlurl
url="http://www.indonesia-undernet.org/keirc"
name="http://www.indonesia-undernet.org/keirc"></tt>): otro más que funciona
bajo <it>KDE</it> y es uno de los más prometedores, aunque aún está muy lejos
de poder ofrecer una versión completamente estable.

<item><it>BitchX</it> (<tt><htmlurl url="http://www.bitchx.com/"
name="http://www.bitchx.com/"></tt>): el cliente en modo texto preferido por los
usuarios de Linux.

<item><it>ScrollZ</it> (<tt><htmlurl url="http://www.scrollz.com/"
name="http://www.scrollz.com/"></tt>): tiene características similares al
<it>BitchX</it>, y es el más veterano de todos, lo que le permite alcanzar una
buena velocidad y un gran nivel de optimización (menor consumo de recursos).

<item><it>YagIRC</it> (<tt><htmlurl
url="http://www.sicom.fi/~ikioma/yagirc.html"
name="http://www.sicom.fi/~ikioma/yagirc.html"></tt>). Cliente para el entorno
<it>GNOME</it>, bastante reciente y capaz de mostrar un interfaz en modo texto
o en modo gráfico.
</itemize>

<sect1>Descripción de <it>BitchX</it> 
<p>

Entre sus características están:

<itemize>
<item>Varias conversaciones en el mismo canal.
<item>Múltiples servidores.
<item>Autocompletado de <it>nicks</it>.
<item>Soporte para <it>scripts</it>.
<item>Cliente de FTP incorporado.
<item>Nuevas características exclusivas, como son: cliente de correo
integrado y un reproductor de CDs musicales.
</itemize>

<sect1>Obtención e instalación 
<p>

El <it>BitchX</it> puede conseguirse en <tt><htmlurl
url="http://www.bitchx.com/" name="http://www.bitchx.com/"></tt>, 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 <it>tar</it> en el
directorio <tt>/usr/local/BitchX/</tt>, obtendremos directamente los
ejecutables, puesto que se distribuye con los fuentes ya compilados.

<sect1>Configuración 
<p>

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

<itemize>
<item><tt>IRCNICK</tt>: establece el <it>nick</it> por defecto.
<item><tt>IRCUSER</tt>: establece el nombre de usuario por defecto.
<item><tt>IRCNAME</tt>: permite escribir el nombre real del usuario.
<item><tt>IRCSERVER</tt>: nombre del servidor a utilizar.
<item><tt>IRCPORT</tt>: puerto a utilizar.
</itemize>

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

<sect1>Ejecución 
<p>

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

<sect>Anexo: El INSFLUG <label id="Insflug">
<p>

El <it/INSFLUG/ forma parte del grupo internacional <it>Linux Documentation
Project</it>, 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 <em/COMOs/ y <em/PUFs/ (<bf/P/reguntas de <bf/U/so
<bf/F/recuente, las <it/FAQs/. <tt/:)/ ), etc.

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

En ella encontrará siempre las <bf/últimas/ versiones de las traducciones
«oficiales»:  <tt><htmlurl url="http://www.insflug.org" 
name="www.insflug.org"></tt>. 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 (<it/mirror/)
del Insflug más cercanos a Vd., e información relativa a otros recursos en
castellano.

En <tt><htmlurl url="http://www.insflug.org/insflug/creditos.php3"
name="http://www.insflug.org/insflug/creditos.php3"></tt> cuenta con una
detallada relación de las personas que hacen posible tanto esto como las
traducciones.

¡Diríjase a <tt><htmlurl
url="http://www.insflug.org/colaboracion/index.php3"
name="http://www.insflug.org/colaboracion/index.php3"></tt> si desea
unirse a nosotros!.

«Cartel» Insflug, <tt><htmlurl url="mailto:cartel@insflug.org"
name="cartel@insflug.org"></tt>. 

</article>
