Идея сделать независимый от корпораций 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)
Foxcool
25.03.2018 10:58Если соглашаться на федеративный протокол, то почему не матрикс? Мне о нем в свое время на https://t.me/distributed все уши прожужжали.
imanushin
25.03.2018 11:41Как минимум XMPP — это уже известный стандарт с кучей клиентов под множество платформ.
Кстати, подскажите, пожалуйста, а почему Вы сделали ссылку на один из каналов закрытого мессенжера, вместо прямой ссылки на официальный сайт https://matrix.org/blog/home/?
Shaltay
25.03.2018 15:09Как минимум XMPP — это уже известный стандарт с кучей клиентов под множество платформ.
Банальная задача — синхронизировать историю между этими кучами клиентов и множеством платформ — в XMPP хроническая, годами длящаяся боль.Disasm
25.03.2018 15:21+1Эта банальная задача замечательно решена с помощью двух расширений: XEP-0313 (Message Archive Management) и XEP-0280 (Message Carbons).
Shaltay
25.03.2018 15:24+1> XEP-0313 (Message Archive Management)
Который в статусе экспериментал, и поддерживают его полтора клиента (не говоря о серверах).
supervillain Автор
25.03.2018 13:33matrix.org пробовали запускать, понравился его Web клиент Riot. По самому протоколу ничего не могу сказать, может и есть какие-то плюсы, но они не настолько очевидны.
Федерацию внутри I2P не получилось сделать, насколько я помню, протокол федерации жестко завязан на DNS и для даркнета прийдется делать какие-то костыли.Shaltay
25.03.2018 15:07может и есть какие-то плюсы, но они не настолько очевидны.
matrix.org/docs/guides/faq.html
Ряд разделов what is difference between, а что в них неочевидного?
unclechu
26.03.2018 13:59Ну вообще, я конечно пользуюсь матрицей и мне она нравится, но нужно сказать, что держать свою федерацию на данный момент — очень затратное удовольствие, т.к. это тонны данных в БД и тонны сожранной оперативной памяти, вкратце — «жирно». А XMPP сервер, хоть взять да новый поднять с пол пинка — почти ничего не стоит. Плюс там (в матриксе) ещё есть заморочки с identity серверами, в общем это тема отдельного исследования, и, насколько мне известно (я слежу поверхностно за всякими еженедельными видео-отчетами разработчиков, см. канал «matrixdotorg» на youtube), сейчас нельзя нормально поднять полностью отпиленный от других федераций matrix-инстанс (см. «анально огородиться»), в отличии от XMPP, но они работают над этим. Для начала разработчики должны наконец допилить «дендрит», — переписываемый на Go «синапс», а «синапс» — это сервер матрицы, написанный на Python и который очень жаден до рамы от самой природы пистона, один мой знакомый из интернетов, к слову, уложил свой матрикс-инстанс на неопределённый срок, т.к. у него просто не влезало в раму, со словами: «ну нет у меня 4 гб лишней рамы». Мой вердикт, — ещё пока рано говорить о заведении своей матрикс-федерации с полпинка и долгосрочного планирования на объёмы данных, которые нужно будет хранить и обрабатывать рилтайм.
unclechu
26.03.2018 14:06Ещё забыл сказать, что из клиентов на десктопе, которыми можно пользоваться, я обнаружил только парочку, — это Riot, который суть веб-браузер, со всеми вытекающими, включая гигабайты съеденной рамы, когда у тебя более 150 румов, в которых ты состоишь (у меня лично много бриджованных на freenode-у румов по профильным чатам, да, матрицу можно использовать как IRC-клиент к фриноде с бесплатными оффлайн-логами), а также nheko, который активно пилится мейнтейнером, но всё ещё сильно ограничен по функционалу и элементарно плохо обратывает разрывы связи, там к примеру нет поддержки e2e шифрования, и шифрованные комнаты, созданные в Riot просто нельзя читать.
RafaelRS
25.03.2018 11:30+1Когда уже телепатию освоите? Ее уж точно не заблокируют
mapron
25.03.2018 11:39Телепатия вроде высокорувневая библиотека, она не только XMPP поддерживает, почему вообще постановка вопроса о том, что ее могут заблокировать? блокируют же протоколы а не реализации, в чем я неправ?
upd: я точно правильно понял что речь о telepathy.freedesktop.org/components?
Arris
25.03.2018 23:36Почему же не заблокируют? Очень просто заблокируют. Обяжут всех носить шапочки из фольги — и вот вам блокировка телепатии.
Кю!
ton1
25.03.2018 11:53+1Такое чувство, что статья обрывается на самом интересном. Где описание механизмов взаимодействия между разными серверами?
Если у каждого будет свой локальный сервер, как находить других юзеров?
Или вот этовсе остальные пользователи должны будут добавить в свой конфиг
— неизбежность? Тогда не взлетит, как мне кажется.supervillain Автор
25.03.2018 14:18Соглашусь с вами, статья получилась сугубо практическая. Возможно, стоит ее дополнить теорией или написать отдельно про внутренности такой системы — как работают I2P туннели и как взаимодействуют сервера через mod_darknet. Если будет время, допилю.
как находить других юзеров?
Так же, как это делают в обычных мессенджерах — whatsapp, telegram и тд. Тут в качестве идентификатора пользователя выступает ваш jabber id.
не взлетит, как мне кажется.
Это, как мне кажется, мелочи. Для взлета больше важно готовое клиентское приложение, в котором вся настройка сводится к минимуму. И сделать это вполне реально, все программы с открытым исходным кодом. Их бы собрать в готовый к употреблению продукт, получится конфетка.
Vindicar
25.03.2018 13:54Чем вас не устроил Tox?
ivan386
25.03.2018 19:50Antox например очень плохо работает. Зависает и глючит на видео и аудио звонках. Сообщения часто не доставляет хотя на обоих устройствах включен. Приходится шаманить чтобы оба клиента увидели друг друга в сети и обменялись сообщениями.
humbug
25.03.2018 19:57Ну потерпите завершения проекта tox-rs/tox, переписываем на Rust.
Arris
25.03.2018 23:44Пару лет? :(
Halt
26.03.2018 08:01Нет. Можете посмотреть недавнюю активность отдельно взятого разработчика и экстраполировать.
Если коротко, то это имеет очень мало общего с тем болотом, что там было раньше. Надеюсь, скоро прочитаем подробности из первых рук.
darksshvein
25.03.2018 14:55+1Я один не понял, а причём здесь p2p? Да, серверов много, да легко настроить, но это немного другой принцип, нежели p2p, списки то юзеров у каждого сервера свои. Если только не сделать единый "блокчейн" со списком ВСЕХ пользователей)), но насколько я знаю, это выходит за рамки спецификаций стандарта xmpp.
Bonio
25.03.2018 17:45Я тоже не понял. Возможно, автор имел ввиду децентрализацию? Но jabber сам по себе децентрализован, как почта.
А запустить сервер в любой сети можно, хоть в интернете, хоть в локалке, хоть через hiddenservicec в Tor. Проблема только в том, что и общаться при этом возможно будет только с клиентами из этой же сети.
legolegs
26.03.2018 10:04списки то юзеров у каждого сервера свои
Но между собой сервера прекрасно общаются (как и в, например, электронной почте).
achekalin
25.03.2018 23:15Для XMPP за столько лет вменяемых клиентов не то чтобы не написали, но… сравните удобство обычного официального клиента Телеграмма, и всего, что для XMPP за годы настрогали!
Лично я уверен, что в свое время XMPP проиграл битву за пользователей в т.ч. и в этом.vasyathriller
26.03.2018 00:42О, да, постоянно прыгающие туда-сюда контакты в списке, необходимость знать номер телефона для переименования этих самых контактов, отсутствие групп этих самых контактов, отсутствие поддержки TeX, trim() в code-блоках (из-за которых выхлоп
uniq -c
, обрамлённый в```
, вечно выглядит криво), огромная куча прочих неприятных мелочей и возможность использовать стикеры про вашу любимую газировку — это просто верх удобства!</sarcasm>
Хотя все те пользователи телеграма, которых я знаю, действительно считают, что это на порядок удобнее, чем IRC или XMPP, но почему — объяснить сами толком не могут.AlexeiZavjalov
26.03.2018 06:38Возможно, стандартизация — для обычного пользователя проще установить одно приложение, вбить номер телефона и начать общаться.
achekalin
26.03.2018 07:35+1Могу, но давайте в личку. Я не про стикеры, а именно про удобство. Сегодня из старых разве что Миранду можно использовать (как и тогда можно было).
Arris
26.03.2018 02:15Обычный официальный клиент телеграм появился уже в эпоху засилья новых интерфейсов.
Если бы XMPP-клиент пилили сейчас — он бы выглядел горраздо красивее.achekalin
26.03.2018 07:36Если бы протокол делали сейчас — тоже было бы, думаю, поинтереснее. Но я не про красоту, про удобство.
Arris
26.03.2018 17:18Клиент Psi был довольно удобен. Правда он весил в итоге 120 мегов, т.к. тянул за собой какую-то гуёвую библиотеку (QT кажется)…
achekalin
26.03.2018 17:24Дайте вспомнить: архив сообщений в виде html, просмотр архива по каждому дню (т.е. найти что-то, отправленное год назад — только grep-ом в файлах), и множество недоделок в UI — он не то чтобы хороший, он чуть не единственный, но не лучший (это как второе место при числе участник = 1), и уж точно не на него равняться. Одна радость, что он построен на purple, так на ней построены и почти все остальные. И, да, использовать все многообразие возможностей, что XMPP теоретически может дать, в нем можно, но очень замысловато.
Жрет ресурсов как не в себя, делает чуть — типичный клиент восьмилетней давности. На фоне Миранды всегда смотрелся недоделкой, сделанной программистами-а-не-дизайнерами. Жаль, что миранды нет под линукс.Arris
26.03.2018 19:53Сделанный как попало — это вы правы.
Вообще, у него было две версии — новая, с QT и весом под 120 мегов (про жор ресурсов я промолчу) и старая, весила метров 20. Тоже много, но не 120.
Архив сообщений в виде HTML — это не так плохо. Это даже хорошо, если вдуматься. Лучше, чем plain text, имхо.
У QIP Infinium архив сообщений вообще был в закрытом пропритетарном зашифрованном формате.
На тот момент он был самым лучшим из того, что было (не считая Миранды, но я к ней так и не смог привыкнуть).
Впрочем, и телеграм не так чтобы очень уж удобен.
Ограничение на копирование 100 мессаг за раз, отсутствие экспорта истории чата в файл — ну куда это годится в 2018 году???
Ресурсы он тоже жрет как не в себя.
LAG_LAGbI4
26.03.2018 08:05Объясните мне, почему создание месенджера с открытым исходным кодом и шифрованием так сложно? Есть же огромное количество хороших программ с открытыми исходным кодом. Есть мега навороченные биткоины и всякие сети i2p. Почему нет нормального месенджера?
Что мешает взять протокол электронной почты, прикрутить к нему шифрование, сделать красивый интерфейс с визуализацией процесса доставки и чатами вместо списка писем?
Существуют какие-то фундаментальные сложности при написании мессенджера на опенсорсе? или нет потребности в месенджере?mayorovp
26.03.2018 08:52Да, именно что существуют фундаментальные сложности. Мессенджер которым никто не пользуется — никому не нужен. Поэтому самое главное в мессенджере — реклама, а не код. К сожалению.
SergeyMax
26.03.2018 09:12+2Существуют какие-то фундаментальные сложности при написании мессенджера на опенсорсе?
Я думаю, что мешает фундаментальный принцип «и так сойдёт». Вот например автор, он молодец, написал большую подробную статью, рассказал где и какие команды нужно выполнить, где в каких конфигах что поправить. Но что дальше? Кто из пользователей телеграмма будет грепать логи, и, главное, зачем? Для того, чтобы был даже самый маленький, самый микроскопический шанс на взлёт, нужно готовое решение, которое устанавливается одной кнопкой на все платформы, тысячу раз проверенное, и протестированное в самых немыслимых конфигурациях. Но этого нет. Потому что и так сойдёт.
wlr398
26.03.2018 20:14+1Причина ещё и в том, что современные месенджеры в немалой части мобильные месенджеры. Во времена первых лет скайпа были десктопы, у которых нет проблем с трафиком и потреблением электроэнергии. Работала схема пир-ту-пир через суперноды. Да и то были централизованные серверы авторизации. Сейчас смартфоны находятся за NAT(CGN) и файрволами, им нужен внешний релей. Они мало живут от одной зарядки аккумулятора и даже по этой причине не могут быть релеями. Смартфоны сидят на пакетах с ограниченным трафиком — третья причина.
То есть схема пир-ту-пир не работает.
Инфраструктура месенджера на сотни миллионов пользователей стоит довольно дорого.
Продвижение стоит дорого.
Так и получается, что основной рынок в руках очень крупных и очень денежных игроков.
vladbarcelo
26.03.2018 13:03За счет использования I2P, неуязвим для различных *надзоров (сори за мат).
А вот здесь вы, к сожалению, не правы. i2p хорошо защищён (но отнюдь не неуязвим) от внутренней слежки, которая в действия РКН нисколько не входит. Фича РКН — блокировки, и заблокировать i2p вполне реально — достаточно заблокировать reseed-сервера и ограничить доступ к получению списков floodfill-роутеров — и i2pd просто не наладит связь с initial-пирами.
HueyOne
26.03.2018 15:42Надеемся, что телеграм пилит потихоньку механизм неуязвимости перед блокировками и т.п.
masv
26.03.2018 20:15-1Почему-бы просто не написать софт, который использует то, что уже есть? Мессенджер, почта. Пускай он висит в памяти и снифит текст набираемый пользователем в поле ввода мессенджера и при нажатии «отправить» вырезает его, шифрует и вставляет обратно в поле ввода или стеганографирует в рандомную картинку. Или даже пускай у него будет свой интерфейс, только шифрованную информацию он будет отправлять используя любой другой сервис.
ivan386
26.03.2018 21:13В GnuPG можно шифровать текст открытым ключём собеседника и отправить любым способом.
flatscode
28.03.2018 08:28-1ключём
1) ключом;
2) открытым ключом никакие тексты никогда не шифруются, тем более в GnuPG.mayorovp
28.03.2018 12:45открытым ключом никакие тексты никогда не шифруются, тем более в GnuPG
Можно с этого момента подробнее?
flatscode
28.03.2018 13:53Вроде, гуглится же легко, например:
security.stackexchange.com/questions/70652/why-the-symmetric-key-is-added-to-the-message
flatscode
Главное, что бы этим мессенджером никто из протестующих с США не воспользовался. А то опять будет «русские хакеры», «рука кремля», «новые санкции против РФ», «высылка дипломатов»,…