Table of Contents

Setting up ZNC: an IRC bouncer


Firewall

The following ports have to be opened in your firewall:

6697/tcp  # IRC SSL


ZNC

ZNC is an IRC network bouncer or BNC. It can detach the client from the actual IRC server, and also from selected channels. Multiple clients from different locations can connect to a single ZNC account simultaneously and therefore appear under the same nickname on IRC.


Installation

sudo apt install znc


Creating a user account

sudo useradd --create-home -d /var/lib/znc --system --shell /bin/false --comment "ZNC IRC Bouncer" --user-group znc


Creating a systemd unit file

/etc/systemd/system/znc.service
[Unit]
Description=ZNC, an advanced IRC bouncer
After=network-online.target
 
[Service]
ExecStart=/usr/bin/znc -f --datadir=/var/lib/znc
User=znc
 
[Install]
WantedBy=multi-user.target


Configuration

sudo -u znc /usr/bin/znc --datadir=/var/lib/znc --makeconf
[ ?? ] Listen on port (1025 to 65534): 6697
[ ?? ] Listen using SSL (yes/no) [no]: yes
[ ?? ] Listen using both IPv4 and IPv6 (yes/no) [yes]: yes
 
 
[ ?? ] Username (alphanumeric): user1
[ ?? ] Enter password: ******
[ ?? ] Confirm password: *****
[ ?? ] Nick [admin]: user1
[ ?? ] Alternate nick [admin_]: user1_
[ ?? ] Ident [admin]: user1
[ ?? ] Real name [Got ZNC?]: User One
 
 
[ ?? ] Set up a network? (yes/no) [yes]: yes
[ ?? ] Name [freenode]: freenode
[ ?? ] Server host [chat.freenode.net]: chat.freenode.net
[ ?? ] Server uses SSL? (yes/no) [yes]: yes
[ ?? ] Server port (1 to 65535) [6697]: 6697
[ ?? ] Server password (probably empty):
 
 
[ ?? ] Launch ZNC now? (yes/no) [yes]: no


SSL certificates

The znc.pem is a concatination of the private key and the full certficate chain. In case you use Let's Encrypt:

sudo su -c 'cat /etc/letsencrypt/live/quietlife.nl/{privkey,fullchain}.pem > /var/lib/znc/znc.pem'
Strong ciphers
/var/lib/znc/configs/znc.conf
SSLCertFile = /var/lib/znc/znc.pem
SSLProtocols = -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
SSLCiphers = AES384+EECDH:AES384+EDH:AES256+EECDH:AES256+EDH


Enabling and starting the daemon

sudo systemctl enable znc.service
sudo systemctl start znc.service


Client configuration

sudo apt install hexchat


HexChat > Network List > Add > quietlife.nl

Edit >
        Servers: quietlife.nl/+6697
        [x] Connect to this network automatically
        [x] Use SSL for all the servers on this network
        Login method: Default
        Password: <ZNC user password>
        Character set: UTF-8 (Unicode)
        
Close > Connect


Enabling SASL for NickServ authentication

From the Freenode menu, run:

/znc LoadMod sasl
/query *sasl

From the SASL menu, run:

set $username $password

(Use your Freenode NickServ credentials.)



SSL certificate renewal

Unlike Apache, nginx, Dovecot and Postfix, ZNC does not shortly run as root when started in order to read from /etc/ssl/ or /etc/letsencrypt/. So certificates have to be copied to the /var/lib/znc directory. If you use Let's Encrypt, this means that you have to renew those copies every three months.

This can be automated with a script you run as root:

#!/bin/bash
 
cat /etc/letsencrypt/live/quietlife.nl/{privkey,fullchain}.pem > /var/lib/znc/znc.pem
 
chown znc:znc /var/lib/znc/znc.pem
chmod 600 /var/lib/znc/znc.pem
 
systemctl restart znc.service