devzone.org.ua/post/vstanovlennia-ta-nalashtuvannia-irc-baunsera-znc-v-linux.md
2026-02-03 01:48:33 +02:00

218 lines
No EOL
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Встановлення та налаштування IRC-баунсера ZNC в Linux
> [IRC](https://uk.wikipedia.org/wiki/IRC) - це один з найстарших протоколів багатокористувацького чату, який досі живий і більше того - користується чималою популярністю в колах досвідчених користувачів, які з тих чи інших причин відмовляються від сучасних рішень типу [Matrix](https://uk.wikipedia.org/wiki/Matrix_(протокол)), через неординарну зміну політики централізованих компаній.
> \
> \
> Протокол IRC особливо популярний в колах адміністраторів альтернативних мереж, зокрема [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom) та [I2P](https://devzone.org.ua/post/vstanovlennia-routera-i2p-z-pidkliuchenniam-cherez-yggdrasil): при певних налаштуваннях, йому властивий високий рівень конфіденційності, а частково розподілена екосистема дозволяє розгортати стійкі до цензури федерації.
> \
> \
> Не дивлячись на свою оманливу простоту, IRC є доволі масивним комбайном зі старих і сучасних програмних рішень і чесно кажучи, я вивчаю користування цим засобом зв'язку вже не перший рік. Нижче - нотатка стосовно одного з таких кроків.
Баунсер (англ. _bouncer_) - це спеціальний клієнт IRC, який запускається на сервері 24/7 з метою постійного перебування його онлайн та ретрансляції історії повідомлень локальному клієнтові, що підключається до нього замість прямого підключення до цільового сервера IRC. Такий собі спадковий костиль, адже для протоколу IRC не передбачається збереження історії чату і без баунсера потрібно десь окремо читати логи (якщо такі надаються сервером).
В деяких випадках, баунсер на стороні сервера може бути корисним в плані підключення до різних мереж, зокрема I2P, Yggdrasil та інших, якщо ваш клієнт не підтримує гнучкі налаштування проксі для кожного з каналів, а на сервері є розгорнута для того інфраструктура.
## Встановлення
Тут я не заморочувався та поставив ZNC з репозиторію однією командою:
``` bash
apt install znc
```
### Створення системного користувача
Спочатку забув та запустив конфігуратор від root, про що мені делікатно цей менеджер нагадав :)
``` bash
useradd -m znc
```
### Створення базової конфігурації
Перед запуском ZNC, від користувача `znc`, потрібно створити для нього файл конфігурації:
``` bash
znc --makeconf
```
Тут я зупинятись не буду, оскільки менеджер надає прості питання, відповіді на які у кожного свої:
* користувача вказав як `znc`, нижче він буде використовуватись у якості прикладу
* порт я спочатку вказав з групи `666*` але згодом змінив на `888*` оскільки політиці безпеки FireFox щось там не сподобалось і я не міг відкрити Web UI (інтерфейси HTTP/IRC також можна забіндити окремо, якщо клієнтові буде потрібен стандартний порт типу `6667`)
Згенерований файл конфігурації буде доступний десь в `/home/znc/.znc/configs/znc.conf` але напряму він як правило не редагується. Всі налаштування ZNC виконуються через веб-панель або командний рядок чату, про що згодом.
### Фаєрвол / iptables
Оскільки баунсери як правило пускаються на віддаленому сервері, для доступу до його API та веб-адмінки, потрібно відкрити відповідний порт:
``` bash
ufw delete allow from aaa.aaa.aaa.aaa to bbb.bbb.bbb.bbb port 888* proto tcp
```
* `aaa.aaa.aaa.aaa` - клієнтський IP (десктоп, мобільний пристрій і т.д.)
* `bbb.bbb.bbb.bbb` - адреса IP сервера ZNC, що вказувався під час виконання `znc --makeconf`
* `888*` - актуальний порт, що вказувався під час виконання `znc --makeconf`
* зверніть увагу: в адмінці ZNC також є опція "_Authentication_" > "_Allowed IPs_" (`*`)
### Сервіс systemd
В стандартному (для Armbian) сервісі я видалив аргумент запуску `--datadir` та вказав `User=znc`:
``` /lib/systemd/system/znc.service
[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
```
* `systemctl restart znc` - запуск
* `systemctl enable znc` - автозапуск при старті системи
* `systemctl status znc` - перевірка статусу
## Підключення ZNC до серверів IRC
Після запуску сервера ZNC, потрібно налаштувати сервери, на які ми підписані. Це можна зробити декількома способами.
### Налаштування підключення засобами IRC
Адмініструвати підключення можна через віддалений клієнт, засобами командного рядка чату:
```
/znc AddNetwork <network>
```
Усі доступні опції можна отримати командою:
```
/znc Help
```
### Налаштування підключення засобами Web UI
Переходимо за адресою веб-адмінки (`http://host:port/mods/global/webadmin/edituser`) меню "_Edit User_" > "_Networks_" > "_Add a network_":
![Додавання нової мережі в ZNC](https://devzone.org.ua/storage/posts/2025/11/05/iFJk5CLyPQHRb81XtRiCAcZug1Qnm1aLmkKoGA1k.png)
Послідовно заповнюємо форму:
* *Network Info* - назва каналу, свого роду ID, який буде використовуватись для підключення клієнта IRC до ZNC
* *Nick*, *AltNick*, *Ident*, *RealName*, *BindHost* - інформація для цільових серверів IRC
* *Servers of this IRC network* - тут пишемо хост/порт потрібного нам сервісу: наприклад якщо це Libera, то вказуємо тільки [її сервери](https://libera.chat/guides/connect)
Далі, звертаємо увагу на активні модулі, зокрема стандартно відмічений "simple_away" - він повідомлятиме про статус вашого клієнтського відключення. Вимикаємо, якщо бажаєте бути "постійно онлайн" для інших:
![Модуль "simple_away" в ZNC](https://devzone.org.ua/storage/posts/2025/11/05/xo7B0eQ1QxIdJyVu7hV7gpGEepMtlCo8DvUGtOFk.png)
Коли форму заповнено, зберігаємо налаштування кнопкою внизу сторінки:
![Збереження налаштувань ZNC](https://devzone.org.ua/storage/posts/2025/11/05/4zrsDzC74VeZzz7evSAJc4bWWGNgeNLL3jk8eGnK.png)
* Після збереження форми, можна вказати канали у розділі "_Channels_" (їх також можна додати згодом через клієнт)
Таким чином, додаємо стільки "мереж" та їх серверів - скільки потрібно для поточного користувача. На прикладі моєї конфігурації для спільнот Yggdrasil, список виглядає так:
![Приклад списку мереж Yggdrasil в ZNC](https://devzone.org.ua/storage/posts/2025/11/05/5bDgcYdWGuI55zfAeasSmDv3SHLKdN5aed1ZmG8K.png)
### Підключення ZNC до серверів IRC через проксі HTTP/SOCKS
Користувачів Tor/I2P - тут чекає не приємний сюрприз: станом на зараз, рішення "з коробки" немає, хоча подібний [запит](https://github.com/znc/znc/issues/143) було створено ще в далекому 2012 році.
Для вирішення цієї проблеми, на офіційному сайті є [інструкція на прикладі проксування через Tor](https://wiki.znc.in/Tor#.onion_Resolution). Особисто для себе, обрав спосіб з proxychains:
``` bash
apt install proxychains4
```
Я читаю IRC-канали I2P та Yggdrasil, в стандартному файлі конфігурації `/etc/proxychains4.conf`, вказав тільки два рядки:
``` /etc/proxychains4.conf
# ігнорувати проксі для IRC-серверів Yggdrasil
# по аналогії можна вказати 0400::/7 для Mycelium
localnet 0200::/7
[ProxyList]
# пересилати решту пакетів на проксі I2P
# у вас тут можуть бути протокол і порт SOCKS
http 127.0.0.1 4444
```
* Debian - `/etc/proxychains4.conf`
* Fedora - `/etc/proxychains.conf`
Додатково, в системному сервісі змінив рядок запуску `ExecStart` наступним чином:
``` /lib/systemd/system/znc.service
ExecStart=/usr/bin/proxychains /usr/bin/znc -f
```
* `systemctl daemon-reload` - застосовуємо оновлення конфігурації systemd
* `systemctl restart znc` - перезапускаємо баунсер ZNC
Щоб одночасно користуватись декількома проксі (наприклад, I2P і Tor) ланцюжків `proxychains` не достатньо. Я пробував вказувати послідовність через опцію `dynamic_chain` але схоже, вона працює не так як я це інтуїтивно розумію. Колись, не розібравшись, взагалі [поставив окремий баунсер soju](https://devzone.org.ua/post/vstanovlennia-ta-bazove-nalashtuvannia-irc-baunsera-soju), але в ньому є аналогічна проблема з підтримкою проксі з коробки і якщо анонімних мереж більше двох, то піднімати по баунсеру на кожну - вже нагадує цирк і марнотратство ресурсів сервера.
Згодом, проблему динамічної маршрутизації підмереж я вирішив додаванням до `proxychains` ще одного, маршрутного сервера на базі `privoxy`:
``` bash
apt install privoxy
```
В конфігурації `/etc/privoxy/config` нічого не змінював, лише додав в кінець файлу два рядки:
``` /etc/privoxy/config
forward .i2p 127.0.0.1:4444
forward-socks5t .onion 127.0.0.1:9150 .
```
* послідовність правил `forward` тут важлива: якщо спробувати (як радить ШІ) додати на початок або в кінець ланцюга `forward / .` - тоді щонайменше у версії privoxy `4.0.0-2` ця опція перехопить на себе взагалі усі запити в пріоритеті, а без неї все працює: не релевантний домену трафік піде напряму (в моєму випадку - на Yggdrasil, коли у вас це може бути Інтернет)
* у разі будь разі будь яких проблем з підключенням, у тому ж файлі конфігурації, зверніть увагу на опцію `debug`, зокрема коди `4096` і `128` (файл журналів стандартно знаходиться в `/var/log/privoxy/logfile`)
* порт `9150` - стандартний для роутера [Arti](https://devzone.org.ua/post/vstanovlennia-onion-routera-arti-z-pidkliuchenniam-do-merezi-tor-cherez-yggdrasil), не переплутайте з класичним `9050`
Після цього, у файлі `/etc/proxychains4.conf` замість проксі в прикладі, вказуємо:
``` /etc/proxychains4.conf
[ProxyList]
http 127.0.0.1 8118
```
* важливо вказати саме `http` бо сервер `privoxy` працює саме на цьому протоколі
* порт і хост на прикладі - стандартні (як і `::1`)
## Підключення клієнтів IRC до ZNC
В конфігурації з баунсером, клієнти підключаються до ZNC, а не серверів IRC на пряму. Налаштування залежатимуть від клієнта, яким ви користуєтесь, не плутайте їх з проксі!
### Halloy
> [Halloy](https://halloy.chat) - відносно сучасний клієнт IRC, написаний мовою Rust. Наразі користуюсь саме ним, через особисту цікавість до фреймворку Iced, хоча назвати його супер-зручним та функціональним теж не можу: на момент написання матеріалу він не підтримує проксування на окремі сервери а також має трохи загальмований інтерфейс без контекстних меню та інших підручних наворотів.
Приклад підключення Halloy до ZNC наведено в офіційній [документації](https://halloy.chat/guides/connect-with-znc.html?highlight=bounc#connect-with-znc):
``` config.toml
[servers.libera]
nickname = "<znc-user>/<znc-network>"
server = "znc.example.com"
password = "<your-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
```
* `znc-user` - логін до сервера ZNC, не плутати з системним користувачем чи логіном до IRC!
* `znc-network` - ID / назва каналу
* додатково я вказав тільки порт (`port = 888*`) і вимкнув TLS (`use_tls = false`)
## Посилання
* [ZNC на GitHub](https://github.com/znc/znc)