Exploring the roots and future of Internet Relay Chat

ZNC Bouncer : installation, modules et securite

J'ai ferme mon laptop en 2003 pour aller diner. Quand je suis revenu deux heures plus tard, j'avais rate une conversation critique sur un netsplit qui avait fait tomber la moitie de notre reseau. Pas de logs. Personne ne pouvait me faire un resume parce que personne n'avait pense a logger. Le lendemain, j'ai installe mon premier bouncer. Je n'ai plus ete hors-ligne sur IRC depuis.

Pourquoi un bouncer

Un bouncer IRC est un proxy qui reste connecte a IRC pour vous 24 heures sur 24. Votre client IRC se connecte au bouncer, pas directement au serveur IRC. Quand vous fermez votre client, le bouncer reste connecte. Quand vous rouvrez votre client, le bouncer vous envoie tout ce qui s'est passe pendant votre absence.

Sans bouncer, IRC est ephemere. Si vous n'etes pas connecte, vous n'existez pas. Les messages envoyes pendant votre absence sont perdus. Avec un bouncer, IRC devient persistant. Vous voyez l'historique complet de vos canaux, les messages prives qu'on vous a envoyes, les notifications de NickServ. C'est la difference entre un telephone fixe et un mobile avec messagerie vocale.

ZNC est le bouncer IRC le plus populaire. Il est actif depuis 2004 et fait exactement ce qu'il faut sans complications inutiles. Il y a des alternatives (soju, pounce), mais ZNC a la communaute la plus grande, la meilleure documentation, et l'ecosysteme de modules le plus riche.

Installation de ZNC

# Depuis les paquets (Debian/Ubuntu) :
sudo apt install znc

# Depuis les sources (recommande pour la derniere 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

# Creer un utilisateur dedie :
sudo useradd -m -s /bin/bash znc
sudo su - znc

La version empaquetee peut etre en retard de plusieurs releases. Ce n'est pas critique — ZNC est stable — mais les nouvelles versions apportent des ameliorations en IRCv3 et en securite qui valent la peine.

Configuration initiale

ZNC a un assistant de configuration interactif :

znc --makeconf

# Il vous demande :
# - Port d'ecoute (exemple : 5000)
# - SSL pour le port : YES
# - Nom d'utilisateur admin
# - Mot de passe
# - Reseau IRC (exemple : irc.libera.chat +6697)
# - Canaux a rejoindre automatiquement

# Le resultat est sauvegarde dans ~/.znc/configs/znc.conf

# Demarrer ZNC :
znc
# ZNC tourne en arriere-plan automatiquement

# Pour voir le log en direct :
tail -f ~/.znc/znc.log

# Connecter votre client IRC au bouncer :
# En irssi :
/server add -auto -tls mon.serveur.bouncer 5000 utilisateur:password
/connect mon.serveur.bouncer

# En WeeChat :
/server add monznc mon.serveur.bouncer/5000 -ssl -password=utilisateur:password
/connect monznc
Conseil : Le format de mot de passe pour ZNC est utilisateur:password ou utilisateur/reseau:password si vous avez plusieurs reseaux configures. Ce format va dans le champ de mot de passe de votre client, pas dans le champ nick.

Modules essentiels

ZNC sans modules est un proxy basique. Avec les bons modules, il devient un outil indispensable :

  • playback : Rejoue les messages rates avec les bons timestamps. Essentiel. Sans ca, quand vous vous reconnectez, vous voyez un bloc de texte sans contexte temporel.
  • clientbuffer : Si vous vous connectez depuis plusieurs appareils (laptop + mobile), chaque client a son propre buffer. Ce que vous avez deja lu sur le mobile apparait quand meme sur le laptop.
  • controlpanel : Administre ZNC depuis IRC avec des commandes. Ajouter des reseaux, modifier la configuration, gerer les modules — tout sans toucher aux fichiers.
  • log : Sauvegarde des logs de tous les canaux en fichiers texte. Utile pour rechercher d'anciennes conversations.
  • sasl : Authentification SASL avec le serveur IRC. ZNC s'identifie aupres de NickServ automatiquement a la connexion.
  • keepnick : Si votre nick est occupe quand ZNC se reconnecte (ghost), il continue d'essayer automatiquement.
# Charger les modules depuis 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

# Voir les modules charges :
/msg *status ListMods

TLS et securite

ZNC doit utiliser TLS a deux niveaux : entre votre client et le bouncer, et entre le bouncer et le serveur IRC.

# Cote client (listener) :
# Dans znc.conf, le listener doit avoir ssl=true :
# 
#   Port = 5000
#   SSL  = true
# 

# ZNC genere un certificat auto-signe dans ~/.znc/znc.pem

# Pour utiliser Let's Encrypt :
cat /etc/letsencrypt/live/votredomaine/privkey.pem \
    /etc/letsencrypt/live/votredomaine/fullchain.pem \
    > ~/.znc/znc.pem
chmod 600 ~/.znc/znc.pem

# Cote serveur IRC, le + devant le port indique TLS :
# Server = irc.libera.chat +6697

Securisez votre installation :

  • Changez le port par defaut. Le 5000 est connu comme "port ZNC". Utilisez quelque chose de moins evident.
  • Mettez un mot de passe fort. ZNC stocke les mots de passe hashes, mais si quelqu'un devine le votre, il a acces a votre identite IRC.
  • Activez fail2ban pour le port ZNC. Trois echecs, ban temporaire de l'IP.
Attention : Le fichier znc.pem contient votre cle privee TLS. Si quelqu'un l'obtient, il peut usurper votre bouncer. Permissions 600 (lecture seule pour le proprietaire) obligatoires.

Reseaux multiples

# Depuis IRC avec controlpanel :
/msg *controlpanel AddNetwork votrenick Libera
/msg *controlpanel AddServer votrenick Libera irc.libera.chat +6697
/msg *controlpanel AddChan votrenick Libera #canal1

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

# Pour connecter a un reseau specifique :
# Password: votrenick/Libera:votrepassword
# Ou: votrenick/OFTC:votrepassword

Chaque reseau a ses propres canaux, son propre nick (qui peut etre different sur chaque reseau), et ses propres modules. Le module SASL se configure par reseau car chaque reseau a ses propres identifiants NickServ.

Maintenance

  • Logs : Si le module log est actif, les fichiers grandissent avec le temps. Configurez logrotate ou nettoyez periodiquement.
  • Certificats TLS : Si vous utilisez Let's Encrypt, regenerez znc.pem quand le certificat se renouvelle. Un cron hebdomadaire suffit.
  • Mises a jour : ZNC publie des mises a jour de securite occasionnellement. Surveillez leur GitHub.
# Systemd service pour ZNC :
# /etc/systemd/system/znc.service
[Unit]
Description=ZNC IRC Bouncer
After=network.target

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

[Install]
WantedBy=multi-user.target

Questions frequentes

ZNC ou soju ?

soju est un bouncer plus moderne, ecrit en Go, avec support natif d'IRCv3 chathistory. Si votre client supporte chathistory (Senpai, Goguma), soju offre une experience plus propre. Si vous utilisez irssi ou WeeChat, ZNC a une meilleure compatibilite et plus de documentation.

Combien de RAM utilise ZNC ?

Tres peu. Une instance de ZNC avec 5 reseaux et 50 canaux utilise entre 20-40 Mo de RAM. C'est un des services les plus legers que vous pouvez faire tourner sur un serveur.

Peut-on utiliser ZNC avec Discord ?

Pas directement. ZNC est un bouncer IRC. Discord utilise un protocole proprietaire. Des bridges comme bitlbee permettent d'acceder a Discord depuis un client IRC via ZNC, mais l'experience est limitee et les bridges cassent regulierement quand Discord modifie son API.