Давно обещал поделиться гайдом в создании jabber сервера, сразу оговорюсь, что для понимания и успешной реализации написанного нужно умение, или, по крайней мере, большое желание научиться работать с командной строкой линукс. Я же постараюсь максимально доступно описать каждый шаг, приложив к каждому из них скриншот. Если в конце статьи у кого-то останутся вопросы, с радостью на них отвечу.
Все действия будут проводиться в операционной системе debian, но шаги общие почти для всего семейства линукс, за исключением whonix и tails. Итак, поехали.
В качестве серверного приложения я выбрал prosody, легковесный, не требовательный к ресурсам и один из самых популярных xmpp-серверов.
Как я уже сказал, почти все действия будут проводиться из консоли, поэтому открываем терминал и логинимся под пользователем root. Сделать это можно с помощью команды sudo -i

Первое, что нам надо сделать - создать тор-домен для нашего сервера. Для этого нужно открыть конфиг-файл тора командой gedit /etc/tor/torrc
и в конец файла добавить следующие строки:
HiddenServiceDir /var/lib/tor/jabber
- папка с ключами от домена и самим доменом;
HiddenServicePort 5222 127.0.0.1:5222
- порт для подключений клиент-сервер, регистрация и логин пользователей;
HiddenServicePort 5269 127.0.0.1:5269
- порт для подключений сервер-сервер, чтобы можно было общаться с пользователями других серверов;
HiddenServicePort 5280 127.0.0.1:5280
- порт для отправки файлов.


Запускаем тор, чтобы применить настройки и создать домен. Для этого пишем в консоли простую команду tor
. Сделать это лучше в новом окне терминала, чтобы не запускать от пользователя root.
Созданный домен записан в файле /var/lib/tor/jabber/hostname
. Команда cat /var/lib/tor/jabber/hostname
напечатает домен в консоли.

Далее, скачиваем дополнительные модули и устанавливаем зависимости jabber-сервера:
apt install prosody prosody-modules lua-dbi-sqlite3 lua-event lua-bit32 -y
- установка основных компонентов сервера;
curl https://raw.githubusercontent.com/majestrate/mod_darknet/master/mod_darknet.lua >> /usr/lib/prosody/modules/mod_darknet.lua
- скачивание модуля darknet для маршрутизации сервера через сеть тор;
curl https://hg.prosody.im/prosody-modules/raw-file/9505282ad24f/mod_omemo_all_access/mod_omemo_all_access.lua >> /usr/lib/prosody/modules/mod_omemo_all_access.lua
- скачивание модуля, позволяющего вести переписки, зашифрованные omemo.



Переходим к настройке сервера.
Prosody может обслуживать неограниченное количество серверов. Главный, глобальный конфиг файл находится в /etc/prosody/prosody.cfg.lua
. Его лучше не трогать и создать отдельный конфиг для нашего сервера в папке /etc/prosody/conf.d
, командой gedit /etc/prosody/conf.d/tor_jabber.cfg.lua
. Откроется пустой файл, в него копируем конфиг, представленный ниже (можно копировать вместе с пометками):
admins = { "tony_stark@ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion" }; -- список админов сервера. Замените tony_stark на никнейм, который вы хотите
modules_enabled = {
"roster"; "saslauth"; "tls";
"dialback"; "disco"; "posix";
"private"; "vcard"; "ping";
"register"; "admin_adhoc"; "darknet";
"pep_simple", "omemo_all_access"; "announce";
"welcome"; "watchregistrations"; "carbons";
"private"; "blocklist"; "vcard4";
"vcard_legacy"; "announce"; "groups";
}; -- список активированных модулей. Пояснения к ним можно почитать в глобальном конфиге
modules_disabled = {}; -- список деактивированных модулей. Сейчас он пуст :)
allow_registration = true; -- разрешение на регистрацию новых аккаунтов. Чтобы выключить, замените на false
darknet_only = true; -- принимать подключения только через тор
darknet_force_all = true; -- запретить любые подключения в обход тор
darknet_socks5_port = 9050; -- указываем порт, на котором работает тор-прокси
c2s_require_encryption = true; --
s2s_secure_auth = false;
authentication = "internal_hashed"; -- хранение паролей в виде хэшей.
welcome_message = "Hello, $username !"; -- приветственное сообщение, будет посылаться каждому новому юзеру
registration_watchers = { "tony_stark@ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion" }; -- на этот аккаунт будут приходить уведомления о новых регистрациях
registration_notification = "New user $username joined server $host"; -- текст уведомления о новых регистрациях
storage = "sql";
sql = { driver = "SQLite3", database = "prosody.sqlite" }; -- хранение данных аккаунтов и сообщений в базе sql
VirtualHost "ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion"; -- название сервера
ssl = {
key = "/etc/prosody/certs/ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion.key"; -- ключ шифрования
certificate = "/etc/prosody/certs/ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion.crt"; -- сертификат ключа шифрования
};
Component "upload.ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion" "http_upload" -- подключение модуль отправки файлов
disco_items = {
{ "upload.ppdzvb2vwpmwitjoui3v5tz47l3kbinvxqsm6p2im5raoitzqzejc3id.onion" }, -- делаем файлы доступными для юзеров с других серверов
}
http_upload_file_size_limit = 1024*10240 -- максимальный размер файла, 10мб
http_upload_expire_after = 60*60*24*7 -- автоудаление файлов через одну неделю

Нажимаем сохранить и закрываем файл. Теперь нужно создать ключи шифрования для сервера. Некоторые из читателей могут спросить "а зачем нужны ключи, если все соединения в торе уже зашифрованны?". И они будут правы, шифрование уже шифрованного трафика выглядит бессмысленным, но на практике проще создать ключи, чем учить сервер и клиентов работать с открытым текстом.
И так, чтобы создать ключи, в терминале от пользователя root пишем следующее:
openssl genrsa -out /etc/prosody/certs/hostname.key 2048
openssl req -new -x509 -key /etc/prosody/certs/hostname.key -out /etc/prosody/certs/hostname.crt -days 3650
chown root:prosody /etc/prosody/certs/hostname.{key,crt}
chmod 640 /etc/prosody/certs/hostname.{key,crt}
Слово hostname
заменяем на адрес тор домена, который мы сгенерировали ранее. Когда программа попросит указать личные данные, можете указать также, как на скрине, только в поле Common Name
вставить свой тор домен.

Теперь можно запустить сервер. Это можно сделать разными командами, кому что больше нравится:
prosodyctl start
service prosody start
systemctl start prosody
Используйте только одну из них.
Запуск должен быть всегда от имени пользователя root. Т.к. в консоли мы уже залогинены, как root, с этим проблем не будет, но в остальных случаях команду нужно выполнять вместе с sudo
Чтобы остановить сервер, замените слово start
на stop
Готово! Теперь вы можете подключиться к своему серверу. Но, т.к. аккаунтов на сервере еще нет, то во время подключения нужно поставить галочку на "Создать новый аккаунт".
В следующей статье поговорим о том, как создавать многопользовательские конференции, чаты, где более двух человек.
Приятного общения!