Встановлення та налаштування IRC-баунсера ZNC в Linux

IRC - це один з найстарших протоколів багатокористувацького чату, який досі живий і більше того - користується чималою популярністю в колах досвідчених користувачів, які з тих чи інших причин відмовляються від сучасних рішень типу Matrix, через неординарну зміну політики централізованих компаній.

>

Протокол IRC особливо популярний в колах адміністраторів альтернативних мереж, зокрема Yggdrasil та I2P: при певних налаштуваннях, йому властивий високий рівень конфіденційності, а частково розподілена екосистема дозволяє розгортати стійкі до цензури федерації.

>

Не дивлячись на свою оманливу простоту, IRC є доволі масивним комбайном зі старих і сучасних програмних рішень і чесно кажучи, я вивчаю користування цим засобом зв'язку вже не перший рік. Нижче - нотатка стосовно одного з таких кроків.

Баунсер (англ. bouncer) - це спеціальний клієнт IRC, який запускається на сервері 24/7 з метою постійного перебування його онлайн та ретрансляції історії повідомлень локальному клієнтові, що підключається до нього замість прямого підключення до цільового сервера IRC. Такий собі спадковий костиль, адже для протоколу IRC не передбачається збереження історії чату і без баунсера потрібно десь окремо читати логи (якщо такі надаються сервером).

В деяких випадках, баунсер на стороні сервера може бути корисним в плані підключення до різних мереж, зокрема I2P, Yggdrasil та інших, якщо ваш клієнт не підтримує гнучкі налаштування проксі для кожного з каналів, а на сервері є розгорнута для того інфраструктура.

Встановлення

Тут я не заморочувався та поставив ZNC з репозиторію однією командою:

apt install znc

Створення системного користувача

Спочатку забув та запустив конфігуратор від root, про що мені делікатно цей менеджер нагадав :)

useradd -m znc

Створення базової конфігурації

Перед запуском ZNC, від користувача znc, потрібно створити для нього файл конфігурації:

znc --makeconf

Тут я зупинятись не буду, оскільки менеджер надає прості питання, відповіді на які у кожного свої:

Згенерований файл конфігурації буде доступний десь в /home/znc/.znc/configs/znc.conf але напряму він як правило не редагується. Всі налаштування ZNC виконуються через веб-панель або командний рядок чату, про що згодом.

Фаєрвол / iptables

Оскільки баунсери як правило пускаються на віддаленому сервері, для доступу до його API та веб-адмінки, потрібно відкрити відповідний порт:

ufw delete allow from aaa.aaa.aaa.aaa to bbb.bbb.bbb.bbb port 888* proto tcp

Сервіс systemd

В стандартному (Armbian) сервісі я видалив аргумент запуску `--datadir` та змінив користувача на `znc`:

[Unit]
Description=ZNC, an advanced IRC bouncer
Documentation=man:znc(1)
After=network-online.target

[Service]
ExecStart=/usr/bin/znc -f
User=znc
PrivateTmp=true
NonBlocking=yes
ProtectSystem=full
ProtectHome=no
PrivateDevices=true
LimitNOFILE=1024

[Install]
WantedBy=multi-user.target

Підключення ZNC до серверів IRC

Після запуску сервера ZNC, потрібно налаштувати сервери, на які ми підписані. Це можна зробити декількома способами.

Налаштування підключення засобами IRC

Адмініструвати підключення можна через віддалений клієнт, засобами командного рядка чату:

/znc AddNetwork 

Усі доступні опції можна отримати командою:

/znc Help

Налаштування підключення засобами Web UI

Переходимо за адресою веб-адмінки "http://host:port/mods/global/webadmin/edituser" зокрема "Edit User" > "Networks" > "Add a network":

Додавання нової мережі в ZNC (скріншот)

Послідовно заповнюємо форму:

Далі, звертаємо увагу на активні модулі, зокрема стандартно відмічений "simple_away" - він повідомлятиме про статус вашого клієнтського відключення. Вимикаємо, якщо бажаєте бути "постійно онлайн" для інших:

Модуль "simple_away" в ZNC (скріншот)

Коли форму заповнено, зберігаємо налаштування кнопкою внизу сторінки:

Збереження налаштувань ZNC (скріншот)

Таким чином, додаємо стільки "мереж" та їх серверів - скільки потрібно для поточного користувача. На прикладі моєї конфігурації для спільнот Yggdrasil, список виглядає так:

Приклад списку мереж Yggdrasil в ZNC (скріншот)

Підключення ZNC до серверів IRC через проксі HTTP/SOCKS

На користувачів Tor/I2P - тут чекає не приємний сюрприз: станом на зараз, рішення "з коробки" немає, хоча подібний запит було створено ще в далекому 2012 році:

Для вирішення цієї проблеми, на офіційному сайті є інструкція на прикладі проксування через Tor:

Особисто для себе - обрав спосіб з proxychains:

apt install proxychains4

Я користуюсь IRC-каналами I2P та Yggdrasil, в стандартному файлі конфігурації, вказав тільки два рядка:

# ігнорувати проксі для IRC-серверів Yggdrasil
# по аналогії можна вказати 0400::/7 для Mycelium
localnet 0200::/7

[ProxyList]
# пересилати решту пакетів на проксі I2P
# у вас тут можуть бути протокол і порт SOCKS
http 127.0.0.1 4444

Додатково, в системному сервісі змінив рядок запуску ExecStart наступним чином:

ExecStart=/usr/bin/proxychains /usr/bin/znc -f

В інших випадках, конфігурація залежатиме від конкретних серверів IRC та їх мереж.

Підключення клієнтів IRC до ZNC

В конфігурації з баунсером, клієнти підключаються до ZNC, а не серверів IRC на пряму. Налаштування залежатимуть від клієнта, яким ви користуєтесь, не плутайте їх з проксі!

Halloy

Halloy (https://halloy.chat) - відносно сучасний клієнт IRC, написаний мовою Rust. Наразі користуюсь саме ним, через особисту цікавість до фреймворку Iced, хоча назвати його супер-зручним та функціональним теж не можу: на момент написання матеріалу він не підтримує проксування на окремі сервери а також має трохи загальмований інтерфейс без контекстних меню та інших підручних наворотів.

Приклад підключення Halloy до ZNC наведено в офіційній документації:

[servers.libera]
nickname = "/"
server = "znc.example.com"
password = ""

# Depending on your ZNC setup you may need to apply these extra settings:

# Does your znc use a self-signed or expired certificate? See:
# https://halloy.chat/configuration/servers.html#dangerously_accept_invalid_certs

# Does your znc listen on a different port? See:
# https://halloy.chat/configuration/servers.html#port

Посилання

Дивіться також

Встановлення та базове налаштування IRC-баунсера soju в Linux
Веб-адаптація цього матеріалу з коментарями на DevZone