Exploring the roots and future of Internet Relay Chat

ZNC Bouncer: instalacion, modulos y seguridad

Cerre mi laptop en 2003 para ir a cenar. Cuando volvi dos horas despues, me habia perdido una conversacion critica sobre un netsplit que habia tumbado la mitad de nuestra red. No habia logs. Nadie me podia pasar el resumen porque nadie habia pensado en logear. Al dia siguiente instale mi primer bouncer. No he estado offline en IRC desde entonces.

Que es un bouncer y por que necesitas uno

Un bouncer IRC es un proxy que se queda conectado a IRC por ti las 24 horas. Tu cliente IRC se conecta al bouncer, no directamente al servidor IRC. Cuando cierras tu cliente, el bouncer sigue conectado. Cuando vuelves a abrir tu cliente, el bouncer te envia todo lo que paso mientras no estabas.

Sin bouncer, IRC es efimero. Si no estas conectado, no existes. Los mensajes que se envian mientras estas offline se pierden. Con un bouncer, IRC se vuelve persistente. Ves el historial completo de tus canales, los mensajes privados que te enviaron, las notificaciones de NickServ. Es como la diferencia entre un telefono fijo y un movil con buzon de voz.

ZNC es el bouncer IRC mas popular. Lleva activo desde 2004 y hace exactamente lo que necesitas sin complicaciones innecesarias. Hay alternativas (soju, pounce), pero ZNC tiene la comunidad mas grande, la mejor documentacion, y el ecosistema de modulos mas rico.

Instalacion de ZNC

# Desde paquetes (Debian/Ubuntu) — facil pero version posiblemente vieja:
sudo apt install znc

# Desde fuente (recomendado para tener la ultima version):
sudo apt install build-essential libssl-dev libperl-dev \
  libicu-dev pkg-config python3-dev swig

git clone https://github.com/znc/znc.git
cd znc
git submodule update --init --recursive
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install

# Crear usuario dedicado:
sudo useradd -m -s /bin/bash znc
sudo su - znc

Si instalas desde paquetes, la version puede estar atrasada varios releases. No es un drama — ZNC es estable y las versiones viejas funcionan — pero las nuevas traen mejoras en IRCv3 y seguridad que vale la pena tener.

Configuracion inicial

ZNC tiene un wizard de configuracion interactivo. Ejecutalo como el usuario znc:

znc --makeconf

# Te pregunta:
# - Puerto de escucha (ejemplo: 5000)
# - SSL para el puerto: YES
# - Nombre de usuario admin
# - Password
# - Red IRC a conectar (ejemplo: irc.libera.chat +6697)
# - Canales a unirse automaticamente

# El resultado se guarda en ~/.znc/configs/znc.conf

Una vez configurado, arranca ZNC:

znc
# ZNC corre en background automaticamente
# Para ver el log en vivo:
tail -f ~/.znc/znc.log

Para conectar tu cliente IRC al bouncer:

# En irssi:
/server add -auto -tls mi.servidor.bouncer 5000 usuario:password
/connect mi.servidor.bouncer

# En WeeChat:
/server add miznc mi.servidor.bouncer/5000 -ssl -password=usuario:password
/connect miznc
Consejo: El formato de password para ZNC es usuario:password o usuario/red:password si tienes multiples redes configuradas. Este formato va en el campo de password de tu cliente, no en el nick.

Modulos esenciales

ZNC sin modulos es un proxy basico. Con modulos, se convierte en algo mucho mas util. Los que yo cargo siempre:

  • playback: Reproduce los mensajes que perdiste con timestamps correctos. Esencial. Sin esto, cuando reconectas ves un bloque de texto sin contexto temporal.
  • clientbuffer: Si te conectas desde multiples dispositivos (laptop + movil), cada cliente tiene su propio buffer. Sin esto, lo que ya leiste en el movil no aparece en el laptop.
  • controlpanel: Permite administrar ZNC desde el propio IRC con comandos. Anadir redes, modificar configuracion, gestionar modulos — todo sin tocar archivos de configuracion.
  • log: Guarda logs de todos los canales en archivos de texto. Util para buscar conversaciones antiguas.
  • webadmin: Interfaz web para administrar ZNC. Comodo pero no imprescindible si te manejas bien con controlpanel.
  • sasl: Autenticacion SASL con el servidor IRC. Permite que ZNC se autentique con NickServ automaticamente al conectar, antes de unirse a ningun canal.
  • keepnick: Si tu nick esta ocupado cuando ZNC reconecta (por un ghost), sigue intentando recuperarlo automaticamente.
# Cargar modulos desde IRC:
/msg *status LoadMod playback
/msg *status LoadMod clientbuffer
/msg *status LoadMod controlpanel
/msg *status LoadMod log
/msg *status LoadMod sasl
/msg *status LoadMod keepnick

# Ver modulos cargados:
/msg *status ListMods

TLS y seguridad

ZNC debe usar TLS en dos niveles: entre tu cliente y el bouncer, y entre el bouncer y el servidor IRC.

# Para el lado del cliente (listener):
# En znc.conf, el listener debe tener ssl=true:
# <Listener l>
#   Port = 5000
#   SSL  = true
# </Listener>

# ZNC genera un certificado autofirmado en:
# ~/.znc/znc.pem

# Para usar Let's Encrypt en su lugar:
cat /etc/letsencrypt/live/tudominio/privkey.pem \
    /etc/letsencrypt/live/tudominio/fullchain.pem \
    > ~/.znc/znc.pem
chmod 600 ~/.znc/znc.pem

# Para el lado del servidor IRC, usa el + antes del puerto:
# Server = irc.libera.chat +6697
# El + indica TLS

Harden tu instalacion:

  • Cambia el puerto por defecto. El 5000 es conocido como "puerto de ZNC". Usa algo menos obvio.
  • Pon una contrasena fuerte. ZNC almacena las contrasenas hasheadas, pero si alguien adivina tu password tiene acceso a tu identidad IRC.
  • Activa fail2ban para el puerto de ZNC. Tres intentos fallidos, ban temporal de la IP.
  • Si usas webadmin, ponlo detras de un reverse proxy con HTTPS. No expongas el webadmin directamente a Internet sin cifrado.
Atencion: El archivo znc.pem contiene tu clave privada TLS. Si alguien lo obtiene, puede suplantar tu bouncer. Permisos 600 (solo lectura para el propietario) son obligatorios. Revisalo periodicamente.

Multiples redes

Una de las ventajas de ZNC es que puedes conectarte a multiples redes IRC desde una sola instancia. Configura cada red por separado:

# Desde IRC con controlpanel:
/msg *controlpanel AddNetwork tunick Libera
/msg *controlpanel AddServer tunick Libera irc.libera.chat +6697
/msg *controlpanel AddChan tunick Libera #canal1

/msg *controlpanel AddNetwork tunick OFTC
/msg *controlpanel AddServer tunick OFTC irc.oftc.net +6697
/msg *controlpanel AddChan tunick OFTC #canal2

# Para conectar a una red especifica desde tu cliente:
# Password: tunick/Libera:tupassword
# O: tunick/OFTC:tupassword

Cada red tiene sus propios canales, su propio nick (puede ser diferente en cada red), y sus propios modulos. El modulo SASL, por ejemplo, se configura por red porque cada red tiene sus propias credenciales de NickServ.

Mantenimiento

ZNC es bastante autonomo una vez configurado. Lo que debes vigilar:

  • Logs: Si el modulo log esta activo, los archivos crecen con el tiempo. Un canal activo puede generar varios MB por mes. Configura logrotate o limpia periodicamente.
  • Certificados TLS: Si usas Let's Encrypt, recuerda regenerar znc.pem cuando se renueve el certificado. Un cron semanal basta.
  • Actualizaciones: ZNC publica actualizaciones de seguridad ocasionalmente. Suscribete a su lista de correo o revisa su GitHub periodicamente.
  • Disco: Ademas de los logs, ZNC guarda el estado de los buffers en disco. En instalaciones con muchos canales y mucho trafico, esto puede consumir espacio. Revisa ~/.znc/ de vez en cuando.
# Systemd service para ZNC:
# /etc/systemd/system/znc.service
[Unit]
Description=ZNC IRC Bouncer
After=network.target

[Service]
Type=forking
User=znc
ExecStart=/usr/local/bin/znc
ExecReload=/usr/local/bin/znc --foreground &
Restart=on-failure

[Install]
WantedBy=multi-user.target

Si ZNC se cae (raro pero posible), systemd lo reinicia automaticamente. Cuando vuelve a arrancar, se reconecta a todas las redes configuradas y se reune a todos los canales. Los mensajes que llegaron durante la caida se pierden — ZNC no puede recibir lo que no estuvo conectado para escuchar. Para minimizar ese gap, el restart automatico es clave.

Preguntas frecuentes

ZNC o soju?

soju es un bouncer mas moderno, escrito en Go, con soporte nativo de IRCv3 chathistory. Si tu cliente soporta chathistory (como Senpai o Goguma), soju ofrece una experiencia mas limpia. Si usas irssi o WeeChat, ZNC tiene mejor compatibilidad y mas documentacion. Para la mayoria de los usuarios, ZNC sigue siendo la opcion mas segura.

Puedo usar ZNC con Discord?

No directamente. ZNC es un bouncer IRC. Discord usa un protocolo propietario. Existen bridges como bitlbee que permiten acceder a Discord desde un cliente IRC a traves de ZNC, pero la experiencia es limitada y los bridges se rompen frecuentemente cuando Discord cambia su API.

Cuanta RAM usa ZNC?

Poco. Una instancia de ZNC con 5 redes y 50 canales usa entre 20-40 MB de RAM. Es uno de los servicios mas ligeros que puedes correr en un servidor. El consumo crece principalmente con el tamano de los buffers en memoria.