Идея сделать независимый от корпораций 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!

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


  1. flatscode
    25.03.2018 10:33
    -2

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

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


  1. Foxcool
    25.03.2018 10:58

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


    1. imanushin
      25.03.2018 11:41

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


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


      1. dmbreaker
        25.03.2018 11:56

        известный стандарт с кучей… недостатков


      1. Shaltay
        25.03.2018 15:09

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


        Банальная задача — синхронизировать историю между этими кучами клиентов и множеством платформ — в XMPP хроническая, годами длящаяся боль.


        1. Disasm
          25.03.2018 15:21
          +1

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


          1. Shaltay
            25.03.2018 15:24
            +1

            > XEP-0313 (Message Archive Management)

            Который в статусе экспериментал, и поддерживают его полтора клиента (не говоря о серверах).


            1. Disasm
              25.03.2018 19:34

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


              1. Bonio
                25.03.2018 22:12

                Prosody тоже поддерживает.


    1. supervillain Автор
      25.03.2018 13:33

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

      Федерацию внутри I2P не получилось сделать, насколько я помню, протокол федерации жестко завязан на DNS и для даркнета прийдется делать какие-то костыли.


      1. Shaltay
        25.03.2018 15:07

        может и есть какие-то плюсы, но они не настолько очевидны.


        matrix.org/docs/guides/faq.html
        Ряд разделов what is difference between, а что в них неочевидного?


    1. unclechu
      26.03.2018 13:59

      Ну вообще, я конечно пользуюсь матрицей и мне она нравится, но нужно сказать, что держать свою федерацию на данный момент — очень затратное удовольствие, т.к. это тонны данных в БД и тонны сожранной оперативной памяти, вкратце — «жирно». А XMPP сервер, хоть взять да новый поднять с пол пинка — почти ничего не стоит. Плюс там (в матриксе) ещё есть заморочки с identity серверами, в общем это тема отдельного исследования, и, насколько мне известно (я слежу поверхностно за всякими еженедельными видео-отчетами разработчиков, см. канал «matrixdotorg» на youtube), сейчас нельзя нормально поднять полностью отпиленный от других федераций matrix-инстанс (см. «анально огородиться»), в отличии от XMPP, но они работают над этим. Для начала разработчики должны наконец допилить «дендрит», — переписываемый на Go «синапс», а «синапс» — это сервер матрицы, написанный на Python и который очень жаден до рамы от самой природы пистона, один мой знакомый из интернетов, к слову, уложил свой матрикс-инстанс на неопределённый срок, т.к. у него просто не влезало в раму, со словами: «ну нет у меня 4 гб лишней рамы». Мой вердикт, — ещё пока рано говорить о заведении своей матрикс-федерации с полпинка и долгосрочного планирования на объёмы данных, которые нужно будет хранить и обрабатывать рилтайм.


      1. unclechu
        26.03.2018 14:06

        Ещё забыл сказать, что из клиентов на десктопе, которыми можно пользоваться, я обнаружил только парочку, — это Riot, который суть веб-браузер, со всеми вытекающими, включая гигабайты съеденной рамы, когда у тебя более 150 румов, в которых ты состоишь (у меня лично много бриджованных на freenode-у румов по профильным чатам, да, матрицу можно использовать как IRC-клиент к фриноде с бесплатными оффлайн-логами), а также nheko, который активно пилится мейнтейнером, но всё ещё сильно ограничен по функционалу и элементарно плохо обратывает разрывы связи, там к примеру нет поддержки e2e шифрования, и шифрованные комнаты, созданные в Riot просто нельзя читать.


  1. RafaelRS
    25.03.2018 11:30
    +1

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


    1. mapron
      25.03.2018 11:39

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


      1. Daniyar94
        25.03.2018 21:38

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


    1. Arris
      25.03.2018 23:36

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

      Кю!


  1. ton1
    25.03.2018 11:53
    +1

    Такое чувство, что статья обрывается на самом интересном. Где описание механизмов взаимодействия между разными серверами?
    Если у каждого будет свой локальный сервер, как находить других юзеров?
    Или вот это

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


    1. supervillain Автор
      25.03.2018 14:18

      Соглашусь с вами, статья получилась сугубо практическая. Возможно, стоит ее дополнить теорией или написать отдельно про внутренности такой системы — как работают I2P туннели и как взаимодействуют сервера через mod_darknet. Если будет время, допилю.

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

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

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

      Это, как мне кажется, мелочи. Для взлета больше важно готовое клиентское приложение, в котором вся настройка сводится к минимуму. И сделать это вполне реально, все программы с открытым исходным кодом. Их бы собрать в готовый к употреблению продукт, получится конфетка.


  1. Vindicar
    25.03.2018 13:54

    Чем вас не устроил Tox?


    1. ivan386
      25.03.2018 19:50

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


      1. humbug
        25.03.2018 19:57

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


        1. Arris
          25.03.2018 23:44

          Пару лет? :(


          1. Halt
            26.03.2018 08:01

            Нет. Можете посмотреть недавнюю активность отдельно взятого разработчика и экстраполировать.

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


  1. darksshvein
    25.03.2018 14:55
    +1

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


    1. Bonio
      25.03.2018 17:45

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


    1. Gedweb
      26.03.2018 10:04

      Бoльшая часть реализаций XMPP выходит за рамки стандартной спецификации.


    1. legolegs
      26.03.2018 10:04

      списки то юзеров у каждого сервера свои

      Но между собой сервера прекрасно общаются (как и в, например, электронной почте).


  1. achekalin
    25.03.2018 23:15

    Для XMPP за столько лет вменяемых клиентов не то чтобы не написали, но… сравните удобство обычного официального клиента Телеграмма, и всего, что для XMPP за годы настрогали!

    Лично я уверен, что в свое время XMPP проиграл битву за пользователей в т.ч. и в этом.


    1. vasyathriller
      26.03.2018 00:42

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

      Хотя все те пользователи телеграма, которых я знаю, действительно считают, что это на порядок удобнее, чем IRC или XMPP, но почему — объяснить сами толком не могут.


      1. YaakovTooth
        26.03.2018 02:54

        Ага, а с таким буквально хамским подходом — и не будут. :3


      1. AlexeiZavjalov
        26.03.2018 06:38

        Возможно, стандартизация — для обычного пользователя проще установить одно приложение, вбить номер телефона и начать общаться.


      1. achekalin
        26.03.2018 07:35
        +1

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


    1. Arris
      26.03.2018 02:15

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

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


      1. achekalin
        26.03.2018 07:36

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


        1. Arris
          26.03.2018 17:18

          Клиент Psi был довольно удобен. Правда он весил в итоге 120 мегов, т.к. тянул за собой какую-то гуёвую библиотеку (QT кажется)…


          1. achekalin
            26.03.2018 17:24

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

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


            1. Arris
              26.03.2018 19:53

              Сделанный как попало — это вы правы.

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

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

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

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

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

              Ограничение на копирование 100 мессаг за раз, отсутствие экспорта истории чата в файл — ну куда это годится в 2018 году???
              Ресурсы он тоже жрет как не в себя.


  1. LAG_LAGbI4
    26.03.2018 08:05

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


    1. mayorovp
      26.03.2018 08:52

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


    1. SergeyMax
      26.03.2018 09:12
      +2

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

      Я думаю, что мешает фундаментальный принцип «и так сойдёт». Вот например автор, он молодец, написал большую подробную статью, рассказал где и какие команды нужно выполнить, где в каких конфигах что поправить. Но что дальше? Кто из пользователей телеграмма будет грепать логи, и, главное, зачем? Для того, чтобы был даже самый маленький, самый микроскопический шанс на взлёт, нужно готовое решение, которое устанавливается одной кнопкой на все платформы, тысячу раз проверенное, и протестированное в самых немыслимых конфигурациях. Но этого нет. Потому что и так сойдёт.


    1. wlr398
      26.03.2018 20:14
      +1

      Причина ещё и в том, что современные месенджеры в немалой части мобильные месенджеры. Во времена первых лет скайпа были десктопы, у которых нет проблем с трафиком и потреблением электроэнергии. Работала схема пир-ту-пир через суперноды. Да и то были централизованные серверы авторизации. Сейчас смартфоны находятся за NAT(CGN) и файрволами, им нужен внешний релей. Они мало живут от одной зарядки аккумулятора и даже по этой причине не могут быть релеями. Смартфоны сидят на пакетах с ограниченным трафиком — третья причина.
      То есть схема пир-ту-пир не работает.
      Инфраструктура месенджера на сотни миллионов пользователей стоит довольно дорого.
      Продвижение стоит дорого.
      Так и получается, что основной рынок в руках очень крупных и очень денежных игроков.


  1. vladbarcelo
    26.03.2018 13:03

    За счет использования I2P, неуязвим для различных *надзоров (сори за мат).

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


  1. HueyOne
    26.03.2018 15:42

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


  1. masv
    26.03.2018 20:15
    -1

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


    1. ivan386
      26.03.2018 21:13

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


      1. flatscode
        28.03.2018 08:28
        -1

        ключём

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


        1. humbug
          28.03.2018 11:14

          открытым ключом собеседника + своим приватным. Что не так-то?


        1. mayorovp
          28.03.2018 12:45

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

          Можно с этого момента подробнее?


          1. flatscode
            28.03.2018 13:53

            Вроде, гуглится же легко, например:

            security.stackexchange.com/questions/70652/why-the-symmetric-key-is-added-to-the-message


    1. ton1
      27.03.2018 10:06