Собственный мессенджер в скрытой сети
Как всё начиналось
В сети, в том числе на Хабре уже были статьи про XMPP+I2P, но в них поднимали prosody, который хотя и легкий, но лично мне его функционала не хватало, впрочем сравнение XMPP серверов уже отдельная тема. К тому же, с Openfire, лично я, знаком лучше, нравится он мне больше, да и необходимый мне минимум в виде обмена сообщениями и файлами в сети I2P выполнить смог.
Подготовка
Разворачивать сервер будем на чистом Ubuntu 22.04, поэтому сначала нужно подготовить среду:
Сразу добавляем репозиторий I2PD и обновляем пакеты
sudo add-apt-repository ppa:purplei2p/i2pd
sudo apt-get update
sudo apt-get upgrade
Устанавливаем I2PD
sudo apt install i2pd
Далее нужно установить Java на наш сервер:
sudo apt install default-jre
проверить установку можно с помощью команды
java -v
Терминал должен выдать:
openjdk version "11.0.20.1" 2023-08-24
OpenJDK Runtime Environment (build 11.0.20.1+1-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.20.1+1-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
-
Теперь необходимо установить сам Openfire:
для этого нужно перейти на официальный сайт Openfire в раздел Загрузки и переходим по ссылке для загрузки .deb пакета (или использовать wget)
wget -O https://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_4.7.5_all.deb
устанавливаем и запускаем Openfire
sudo dpkg -i openfire_4.7.5_all.deb
systemctl enable openfire
Настройка
Сначала запустим i2pd, чтобы к моменту, когда он понадобится, была достаточная скорость соединения
systemctl enable i2pd
Можно переходить к настройка нашего XMPP сервера. Открываем браузер и переходим по адресу http://127.0.0.1:9090 - откроется web-интерфейс настройки. Выбираем язык.
Указываем домен, порты консоли администратора, шифрование. (для корректной работы рекомендую указывать домен .i2p)
Настраиваем базу данных. В моём случае большой нагрузки на сервер не планируется, поэтому я оставил встроенную базу, но если хотите, можно подключить и свою.
Настраиваем политику хранения данных пользователей и групп
И учетную запись администратора
Устанавливаем необходимые плагины, чтобы потом сразу прописать для них туннели (Плагины -> Доступные плагины):
Я установил Bookmarks и HTTP File Uploads для обмена ссылками и файлами соответственно.
Прописываем туннели для сервера в /etc/i2pd/tunnels.conf (у меня так)
[IRC-ILITA]
type = client
address = 127.0.0.1
port = 6668
destination = irc.ilita.i2p
destinationport = 6667
keys = irc-keys.dat
[openfire-c2s]
type = server
host = 127.0.0.1
port = 5222
inport = 5222
keys = openfire.dat
[openfire-c2s-s]
type = server
host = 127.0.0.1
port = 5223
inport = 5223
keys = openfire.dat
[openfire-http]
type = server
host = 127.0.0.1
port = 7070
inport = 7070
keys = openfire.dat
[openfire-https]
type = server
host = 127.0.0.1
port = 7443
inport = 7443
keys = openfire.dat
[openfire-components]
type = server
host = 127.0.0.1
port = 5275
inport = 5275
keys = openfire.dat
[openfire-components-s]
type = server
host = 127.0.0.1
port = 5276
inport = 5276
keys = openfire.dat
[openfire-text]
type = server
host = 127.0.0.1
port = 5262
inport = 5262
keys = openfire.dat
[openfire-text-s]
type = server
host = 127.0.0.1
port = 5263
inport = 5263
keys = openfire.dat
[openfire-file-proxy]
type = server
host = 127.0.0.1
port = 7777
inport = 7777
keys = openfire.dat
[nginx]
type = server
host = 127.0.0.1
port = 80
inport = 80
keys = openfire.dat
#[IRC-IRC2P]
#type = client
#address = 127.0.0.1
#port = 6669
#destination = irc.postman.i2p
#destinationport = 6667
#keys = irc-keys.dat
#[SMTP]
#type = client
#address = 127.0.0.1
#port = 7659
#destination = smtp.postman.i2p
#destinationport = 25
#keys = smtp-keys.dat
#[POP3]
#type = client
#address = 127.0.0.1
#port = 7660
#destination = pop.postman.i2p
#destinationport = 110
#keys = pop3-keys.dat
# see more examples at https://i2pd.readthedocs.io/en/latest/user-guide/tunnels/
Перезагружаем туннели в веб-консоли i2pd
Теперь нужно зарегистрировать домен, чтобы при регистрации клиента не нужно было писать Base32 строку. Для этого переходим в Веб-консоль I2PD -> I2P туннели -> любой туннель -> Строка регистрации адреса, в поле "Домен" вводим желаемый домен и нажимаем кнопку "Сгенерировать" и "Отправить".
Для удобства можно поднять веб-сервер, чтобы потом легче было добавлять адрес в адресную книгу роутера (я поднял nginx со страничкой приветствия по умолчанию)
Почти конец. Создаем на сервере пользователей, устанавливаем политики, подкручиваем настройки, в общем соль-перец по вкусу. Главное, если устанавливаете плагины, которые требуют новый порт, не забудьте прописать его в tunnels.conf, по образцу, указанному выше. Предупрежу, что настроить VoIP не получится, так как для STUN/TURN сервера необходимы внешние IP-адреса, а мы в I2P, где иная адресация, если у Вас получилось, исправьте меня, с удовольствием улучшу и свой сервер. А пока продолжим.
Настройка клиента
В качестве клиента я использовал Psi+, как наиболее гибкий и известный.
Переходим в настройки -> приложение -> настройки прокси-сервера -> изменить тип: "HTTP-Connect", сервер: 127.0.0.1, порт: 4444 -> создать -> сохранить
Далее добавляем аккаунт. Настройки -> аккаунты -> добавить: вводим имя -> XMPP адрес: имя_пользователя@домен_сервера.i2p, пароль -> во вкладку Соединение: прокси -сервер: выбираем созданный нами сервер, ставим галочку на "Вручную указать адрес сервера и порт:" - указываем домен, порт по умолчанию 5222 -> сохранить. Всё, клиент готов общаться!
От себя
В реализации этого проекта помогла данная статья, и её автору выражаю отдельную благодарность. Также хочу сказать что это был мой первый опыт на Хабре и жду от Вас конструктивной критики, как по оформлению, так по технической части. Всем спасибо за внимание, всем успехов!