Новая жизнь для XMPP. Делаем мессенджер, который не получится заблокировать

  • Tutorial


Идея сделать независимый от корпораций P2P мессенджер не нова, однако разработка нового протокола и клиентских приложений для него достаточно дорогой и долгий процесс. А что, если использовать старый добрый XMPP, в котором уже все давно продумано и запилено?


Но это же не настоящий peer-to-peer, скажете вы, для работы XMPP нужен собственный сервер и домен. Это так, но мы можем запустить сервер на локалхосте, а для связи с серверами других пользователей использовать скрытый сервис в виртуальной сети I2P. Использование I2P избавит нас от необходимости платить за домен с хостингом, а так же защитит наши коммуникации от преступной онлайн-слежки.


Таким образом, получаем:


  • Гибридный P2P мессенджер, который можно запускать и на пользовательских устройствах, и на полноценном сервере.
  • Фичи, которых не хватает другим P2P мессенджерам: оффлайн сообщения, хранение контактов и истории "в облаке", работа нескольких клиентов с одним аккаунтом.
  • Готовые клиентские приложения на любой вкус.
  • За счет использования I2P, неуязвим для различных *надзоров (сори за мат).

Приступим же к реализации...


Установка I2P и создание серверного тоннеля


В данном руководстве, в качестве I2P роутера будем использовать легковесный C++ клиент i2pd. Инструкция по установке есть в документации.


После установки создаем серверный I2P туннель — это виртуальный адрес, по которому наш XMPP сервер будет доступен для остального мира. В файл tunnels.conf дописываем следующие строки:


[prosody-s2s]
type=server
host=127.0.0.1
port=5269
inport=5269
keys=prosody.dat

[prosody-c2s]
type=server
host=127.0.0.1
port=5222
inport=5222
keys=prosody.dat

Если планируется использование только на локалхосте, секцию prosody-c2s можно не добавлять. Перезагружаем i2pd, чтобы применить настройки. Ищем I2P адрес созданного туннеля в веб-консоли http://127.0.0.1:7070/ на странице I2P tunnels.



Можно так же узнать b32 адрес нового туннеля, грепнув логи:


grep "New private keys file" /var/log/i2pd/i2pd.log | grep -Eo "([a-z0-9]+).b32.i2p" | tail -n1

Сохраните этот xxx.b32.i2p адрес, это будет домен для вашего XMPP сервера.


Установка и настройка XMPP сервера


В качестве XMPP сервера будем использовать prosody, он самый легкий и под него есть готовый модуль для работы через I2P. Установка описана в официальной документации, в Ubuntu делается элементарно apt install prosody.


Для работы mod_darknet нужна lua библиотека bit32. Если у вас lua версии меньше 5.2 (скорее всего) выполняем apt install lua-bit32.


Устанавливаем модуль mod_darknet. Он нужен, чтобы prosody делал исходящие соединения через Socks5 сервер i2pd. Скачиваем этот файл в директорию модулей prosody, обычно это /usr/lib/prosody/modules.


Теперь редактируем конфиг /etc/prosody/prosody.cfg.lua. Замените xxx.b32.i2p на свой адрес:


interfaces = { "127.0.0.1" };
admins = { "admin@xxx.b32.i2p" };
modules_enabled = {
    "roster"; "saslauth"; "tls"; "dialback"; "disco"; "posix"; "private"; "vcard";  "ping";  "register"; "admin_adhoc"; "darknet"; 
};
modules_disabled = {};
allow_registration = false;
darknet_only = true;
c2s_require_encryption = true;
s2s_secure_auth = false;
authentication = "internal_plain";

-- On Debian/Ubuntu
daemonize = true;
pidfile = "/var/run/prosody/prosody.pid";
log = {
    error = "/var/log/prosody/prosody.err";
    "*syslog";
}
certificates = "certs";

VirtualHost "xxx.b32.i2p";
ssl = {
    key = "/etc/prosody/certs/xxx.b32.i2p.key";
    certificate = "/etc/prosody/certs/xxx.b32.i2p.crt";
}

Последний шаг в настройке prosody — генерация сертификатов шифрования. В никсах это делается так:


openssl genrsa -out /etc/prosody/certs/xxx.b32.i2p.key 2048
openssl req -new -x509 -key /etc/prosody/certs/xxx.b32.i2p.key -out /etc/prosody/certs/xxx.b32.i2p.crt -days 3650
chown root:prosody /etc/prosody/certs/*.b32.i2p.{key,crt}
chmod 640 /etc/prosody/certs/*.b32.i2p.{key,crt}

Перезагрузите сервер prosody для применения настроек.


Тут нужно небольшое отступление. В сети I2P любые соединения зашифрованы сквозным шифрованием и, казалось бы, дополнительное шифрование тут излишне. Но, на практике, оказалось проще сгенерировать ключи, чем пытаться настроить все программы на использование открытого текста. Вы можете попробовать, но я вас предупреждал.


Создание аккаунтов и подключение клиентов


Добавляем админский аккаунт:


prosodyctl adduser admin@xxx.b32.i2p

Теперь настраиваем XMPP клиент (например Pidgin).



Если вы подключаетесь к локалхосту, то в настройках клиента указываем подключение к серверу 127.0.0.1 порт 5222.



Если подключаетесь к серверу удаленно через I2P, то указывайте в настройках прокси Socks5 127.0.0.1:4447.



Если все сделано правильно, вы сможете добавлять других пользователей в I2P федерации и переписываться с ними. Так же, возможно настроить ваш уже работающий сервер в обычном интернете на переписку с серверами внутри I2P. Для этого все остальные пользователи должны будут добавить в свой конфиг prosody маппинг для вашего домена. Например, так это сделано у меня для общения с сервером i2p.rocks:


darknet_map = {
    ["i2p.rocks"] = "ynkz7ebfkllljitiodcq52pa7fgqziomz4wa7tv4qiqldghpx4uq.b32.i2p";
    ["muc.i2p.rocks"] = "ynkz7ebfkllljitiodcq52pa7fgqziomz4wa7tv4qiqldghpx4uq.b32.i2p";
}

Вот собственно и все. Happy chatting!

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 55

    –26
    Новая жизнь для XMPP. Делаем мессенджер, который не получится заблокировать

    Главное, что бы этим мессенджером никто из протестующих с США не воспользовался. А то опять будет «русские хакеры», «рука кремля», «новые санкции против РФ», «высылка дипломатов»,…
      –4

      Если соглашаться на федеративный протокол, то почему не матрикс? Мне о нем в свое время на https://t.me/distributed все уши прожужжали.

        +3

        Как минимум XMPP — это уже известный стандарт с кучей клиентов под множество платформ.


        Кстати, подскажите, пожалуйста, а почему Вы сделали ссылку на один из каналов закрытого мессенжера, вместо прямой ссылки на официальный сайт https://matrix.org/blog/home/?

          0
          известный стандарт с кучей… недостатков
          • НЛО прилетело и опубликовало эту надпись здесь
              +3

              Эта банальная задача замечательно решена с помощью двух расширений: XEP-0313 (Message Archive Management) и XEP-0280 (Message Carbons).

              • НЛО прилетело и опубликовало эту надпись здесь
                  +4

                  У вас какие-то устаревшие сведения. Из серверов поддерживается как минимум в ejabberd, из клиентов — как минимум в Gajim, Xabber и Conversations.

                    +3
                    Prosody тоже поддерживает.
            +1
            matrix.org пробовали запускать, понравился его Web клиент Riot. По самому протоколу ничего не могу сказать, может и есть какие-то плюсы, но они не настолько очевидны.

            Федерацию внутри I2P не получилось сделать, насколько я помню, протокол федерации жестко завязан на DNS и для даркнета прийдется делать какие-то костыли.
            • НЛО прилетело и опубликовало эту надпись здесь
              0
              Ну вообще, я конечно пользуюсь матрицей и мне она нравится, но нужно сказать, что держать свою федерацию на данный момент — очень затратное удовольствие, т.к. это тонны данных в БД и тонны сожранной оперативной памяти, вкратце — «жирно». А XMPP сервер, хоть взять да новый поднять с пол пинка — почти ничего не стоит. Плюс там (в матриксе) ещё есть заморочки с identity серверами, в общем это тема отдельного исследования, и, насколько мне известно (я слежу поверхностно за всякими еженедельными видео-отчетами разработчиков, см. канал «matrixdotorg» на youtube), сейчас нельзя нормально поднять полностью отпиленный от других федераций matrix-инстанс (см. «анально огородиться»), в отличии от XMPP, но они работают над этим. Для начала разработчики должны наконец допилить «дендрит», — переписываемый на Go «синапс», а «синапс» — это сервер матрицы, написанный на Python и который очень жаден до рамы от самой природы пистона, один мой знакомый из интернетов, к слову, уложил свой матрикс-инстанс на неопределённый срок, т.к. у него просто не влезало в раму, со словами: «ну нет у меня 4 гб лишней рамы». Мой вердикт, — ещё пока рано говорить о заведении своей матрикс-федерации с полпинка и долгосрочного планирования на объёмы данных, которые нужно будет хранить и обрабатывать рилтайм.
                0
                Ещё забыл сказать, что из клиентов на десктопе, которыми можно пользоваться, я обнаружил только парочку, — это Riot, который суть веб-браузер, со всеми вытекающими, включая гигабайты съеденной рамы, когда у тебя более 150 румов, в которых ты состоишь (у меня лично много бриджованных на freenode-у румов по профильным чатам, да, матрицу можно использовать как IRC-клиент к фриноде с бесплатными оффлайн-логами), а также nheko, который активно пилится мейнтейнером, но всё ещё сильно ограничен по функционалу и элементарно плохо обратывает разрывы связи, там к примеру нет поддержки e2e шифрования, и шифрованные комнаты, созданные в Riot просто нельзя читать.
              –7

              Когда уже телепатию освоите? Ее уж точно не заблокируют

                +9
                Телепатия вроде высокорувневая библиотека, она не только XMPP поддерживает, почему вообще постановка вопроса о том, что ее могут заблокировать? блокируют же протоколы а не реализации, в чем я неправ?
                upd: я точно правильно понял что речь о telepathy.freedesktop.org/components?
                  +2

                  Кажется все таки это был сарказм :)

                  +2
                  Почему же не заблокируют? Очень просто заблокируют. Обяжут всех носить шапочки из фольги — и вот вам блокировка телепатии.

                  Кю!
                    0
                    из сплава «Телекилл™» же
                  +2
                  Такое чувство, что статья обрывается на самом интересном. Где описание механизмов взаимодействия между разными серверами?
                  Если у каждого будет свой локальный сервер, как находить других юзеров?
                  Или вот это
                  все остальные пользователи должны будут добавить в свой конфиг
                  — неизбежность? Тогда не взлетит, как мне кажется.
                    0
                    Соглашусь с вами, статья получилась сугубо практическая. Возможно, стоит ее дополнить теорией или написать отдельно про внутренности такой системы — как работают I2P туннели и как взаимодействуют сервера через mod_darknet. Если будет время, допилю.

                    как находить других юзеров?

                    Так же, как это делают в обычных мессенджерах — whatsapp, telegram и тд. Тут в качестве идентификатора пользователя выступает ваш jabber id.

                    не взлетит, как мне кажется.

                    Это, как мне кажется, мелочи. Для взлета больше важно готовое клиентское приложение, в котором вся настройка сводится к минимуму. И сделать это вполне реально, все программы с открытым исходным кодом. Их бы собрать в готовый к употреблению продукт, получится конфетка.
                      0
                      Почти никто из неТИшников не будет лазить по конфигам и что-то там добавлять.
                      И2П в режиме вошёл-вышел, тоже не очень — оно хочет долгой и вдумчивой работы.
                      Что бы весь этот самолёт с бассейнами и прочим взлетел, это должно работать из коробки без напильника на любых гнилых линиях (я регулярно посещаю места где 1 кб в минуту — за счастье).
                      А для идентификации необходимо использовать связку ждабер-ид + адрес_сервера, (никто не думает что все будут на одном домашнем сервере сидеть, который выключился и всё) и как это будет ввглядеть для запоминания / диктовки, особенно по телефону?
                    +5
                    Чем вас не устроил Tox?
                      0

                      Antox например очень плохо работает. Зависает и глючит на видео и аудио звонках. Сообщения часто не доставляет хотя на обоих устройствах включен. Приходится шаманить чтобы оба клиента увидели друг друга в сети и обменялись сообщениями.

                        +1

                        Ну потерпите завершения проекта tox-rs/tox, переписываем на Rust.

                          0
                          Пару лет? :(
                            +1
                            Нет. Можете посмотреть недавнюю активность отдельно взятого разработчика и экстраполировать.

                            Если коротко, то это имеет очень мало общего с тем болотом, что там было раньше. Надеюсь, скоро прочитаем подробности из первых рук.
                      +1

                      Я один не понял, а причём здесь p2p? Да, серверов много, да легко настроить, но это немного другой принцип, нежели p2p, списки то юзеров у каждого сервера свои. Если только не сделать единый "блокчейн" со списком ВСЕХ пользователей)), но насколько я знаю, это выходит за рамки спецификаций стандарта xmpp.

                        0
                        Я тоже не понял. Возможно, автор имел ввиду децентрализацию? Но jabber сам по себе децентрализован, как почта.
                        А запустить сервер в любой сети можно, хоть в интернете, хоть в локалке, хоть через hiddenservicec в Tor. Проблема только в том, что и общаться при этом возможно будет только с клиентами из этой же сети.
                          0
                          Бòльшая часть реализаций XMPP выходит за рамки стандартной спецификации.
                            0
                            списки то юзеров у каждого сервера свои

                            Но между собой сервера прекрасно общаются (как и в, например, электронной почте).
                            0
                            Для XMPP за столько лет вменяемых клиентов не то чтобы не написали, но… сравните удобство обычного официального клиента Телеграмма, и всего, что для XMPP за годы настрогали!

                            Лично я уверен, что в свое время XMPP проиграл битву за пользователей в т.ч. и в этом.
                              +6
                              О, да, постоянно прыгающие туда-сюда контакты в списке, необходимость знать номер телефона для переименования этих самых контактов, отсутствие групп этих самых контактов, отсутствие поддержки TeX, trim() в code-блоках (из-за которых выхлоп uniq -c, обрамлённый в ```, вечно выглядит криво), огромная куча прочих неприятных мелочей и возможность использовать стикеры про вашу любимую газировку — это просто верх удобства!</sarcasm>

                              Хотя все те пользователи телеграма, которых я знаю, действительно считают, что это на порядок удобнее, чем IRC или XMPP, но почему — объяснить сами толком не могут.
                                +1
                                Ага, а с таким буквально хамским подходом — и не будут. :3
                                  0
                                  Возможно, стандартизация — для обычного пользователя проще установить одно приложение, вбить номер телефона и начать общаться.
                                    +1

                                    Могу, но давайте в личку. Я не про стикеры, а именно про удобство. Сегодня из старых разве что Миранду можно использовать (как и тогда можно было).

                                    0
                                    Обычный официальный клиент телеграм появился уже в эпоху засилья новых интерфейсов.

                                    Если бы XMPP-клиент пилили сейчас — он бы выглядел горраздо красивее.
                                      0

                                      Если бы протокол делали сейчас — тоже было бы, думаю, поинтереснее. Но я не про красоту, про удобство.

                                        0
                                        Клиент Psi был довольно удобен. Правда он весил в итоге 120 мегов, т.к. тянул за собой какую-то гуёвую библиотеку (QT кажется)…
                                          0
                                          Дайте вспомнить: архив сообщений в виде html, просмотр архива по каждому дню (т.е. найти что-то, отправленное год назад — только grep-ом в файлах), и множество недоделок в UI — он не то чтобы хороший, он чуть не единственный, но не лучший (это как второе место при числе участник = 1), и уж точно не на него равняться. Одна радость, что он построен на purple, так на ней построены и почти все остальные. И, да, использовать все многообразие возможностей, что XMPP теоретически может дать, в нем можно, но очень замысловато.

                                          Жрет ресурсов как не в себя, делает чуть — типичный клиент восьмилетней давности. На фоне Миранды всегда смотрелся недоделкой, сделанной программистами-а-не-дизайнерами. Жаль, что миранды нет под линукс.
                                            0
                                            Сделанный как попало — это вы правы.

                                            Вообще, у него было две версии — новая, с QT и весом под 120 мегов (про жор ресурсов я промолчу) и старая, весила метров 20. Тоже много, но не 120.

                                            Архив сообщений в виде HTML — это не так плохо. Это даже хорошо, если вдуматься. Лучше, чем plain text, имхо.

                                            У QIP Infinium архив сообщений вообще был в закрытом пропритетарном зашифрованном формате.

                                            На тот момент он был самым лучшим из того, что было (не считая Миранды, но я к ней так и не смог привыкнуть).

                                            Впрочем, и телеграм не так чтобы очень уж удобен.

                                            Ограничение на копирование 100 мессаг за раз, отсутствие экспорта истории чата в файл — ну куда это годится в 2018 году???
                                            Ресурсы он тоже жрет как не в себя.
                                              0
                                              Это Psi на libpurple?
                                      0
                                      Объясните мне, почему создание месенджера с открытым исходным кодом и шифрованием так сложно? Есть же огромное количество хороших программ с открытыми исходным кодом. Есть мега навороченные биткоины и всякие сети i2p. Почему нет нормального месенджера?
                                      Что мешает взять протокол электронной почты, прикрутить к нему шифрование, сделать красивый интерфейс с визуализацией процесса доставки и чатами вместо списка писем?
                                      Существуют какие-то фундаментальные сложности при написании мессенджера на опенсорсе? или нет потребности в месенджере?
                                        +3

                                        Да, именно что существуют фундаментальные сложности. Мессенджер которым никто не пользуется — никому не нужен. Поэтому самое главное в мессенджере — реклама, а не код. К сожалению.

                                          +2
                                          Существуют какие-то фундаментальные сложности при написании мессенджера на опенсорсе?

                                          Я думаю, что мешает фундаментальный принцип «и так сойдёт». Вот например автор, он молодец, написал большую подробную статью, рассказал где и какие команды нужно выполнить, где в каких конфигах что поправить. Но что дальше? Кто из пользователей телеграмма будет грепать логи, и, главное, зачем? Для того, чтобы был даже самый маленький, самый микроскопический шанс на взлёт, нужно готовое решение, которое устанавливается одной кнопкой на все платформы, тысячу раз проверенное, и протестированное в самых немыслимых конфигурациях. Но этого нет. Потому что и так сойдёт.
                                            +1
                                            Причина ещё и в том, что современные месенджеры в немалой части мобильные месенджеры. Во времена первых лет скайпа были десктопы, у которых нет проблем с трафиком и потреблением электроэнергии. Работала схема пир-ту-пир через суперноды. Да и то были централизованные серверы авторизации. Сейчас смартфоны находятся за NAT(CGN) и файрволами, им нужен внешний релей. Они мало живут от одной зарядки аккумулятора и даже по этой причине не могут быть релеями. Смартфоны сидят на пакетах с ограниченным трафиком — третья причина.
                                            То есть схема пир-ту-пир не работает.
                                            Инфраструктура месенджера на сотни миллионов пользователей стоит довольно дорого.
                                            Продвижение стоит дорого.
                                            Так и получается, что основной рынок в руках очень крупных и очень денежных игроков.
                                              0
                                              Думаю дело в том, что нет даже теоретического шанса на этом заработать, а с энтузиастами дефицит, начали ребята делать Tox, да потом подзаглохло.
                                              0
                                              За счет использования I2P, неуязвим для различных *надзоров (сори за мат).

                                              А вот здесь вы, к сожалению, не правы. i2p хорошо защищён (но отнюдь не неуязвим) от внутренней слежки, которая в действия РКН нисколько не входит. Фича РКН — блокировки, и заблокировать i2p вполне реально — достаточно заблокировать reseed-сервера и ограничить доступ к получению списков floodfill-роутеров — и i2pd просто не наладит связь с initial-пирами.

                                                0

                                                Надеемся, что телеграм пилит потихоньку механизм неуязвимости перед блокировками и т.п.

                                                  0
                                                  Почему-бы просто не написать софт, который использует то, что уже есть? Мессенджер, почта. Пускай он висит в памяти и снифит текст набираемый пользователем в поле ввода мессенджера и при нажатии «отправить» вырезает его, шифрует и вставляет обратно в поле ввода или стеганографирует в рандомную картинку. Или даже пускай у него будет свой интерфейс, только шифрованную информацию он будет отправлять используя любой другой сервис.
                                                    +1

                                                    В GnuPG можно шифровать текст открытым ключём собеседника и отправить любым способом.

                                                      –1
                                                      ключём

                                                      1) ключом;
                                                      2) открытым ключом никакие тексты никогда не шифруются, тем более в GnuPG.
                                                    0

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое