Собственный мессенджер в скрытой сети

Как всё начиналось

В сети, в том числе на Хабре уже были статьи про 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 -> сохранить. Всё, клиент готов общаться!

От себя

В реализации этого проекта помогла данная статья, и её автору выражаю отдельную благодарность. Также хочу сказать что это был мой первый опыт на Хабре и жду от Вас конструктивной критики, как по оформлению, так по технической части. Всем спасибо за внимание, всем успехов!

Комментарии (0)