Привет, Хабр! Я пишу данную статью, по своей "выдумке", дабы найти единомышленников, и продвинуть идею в массовое использование, если уж на то пошло - простое защищённое взаимодействие по сети - мессенджер. Буду стараться объяснять всё простым языком - как могу, ибо это моя первая статья. Буду рад вашей критике.
Скажу, что я попытался прежде всего придумать эффективную архитектуру велосипеда исходя из уже существующих проектов. Потому мой проект принимает чисто научно-исследовательский вид от неопытного человека в образовательных целях, и возможно будет содержать неверные суждение и трактовки различных понятий.
XXCore. На чем основано, и почему может помочь
Начну с того, что в мире уже существуют инструменты для обхода введённых ограничений и цензуры, а также для получение анонимности в самом интернете: tor, i2p, freenet. Однако они нацелены на весь интернет. Тут я имею ввиду, что, используя tor, ты можешь заходить на недоступные ресурсы в том или ином регионе, и как следствие скрыть свой реальный IP-адрес. I2P же является оверлейной сетью, так называемый "невидимый интернет извне", который реализует анонимность в наивысшей возможной степени(наверное): своим Garlic Routing, протоколами SSU2 и NTCP2, а также постоянно сменяющимися однонаправленными туннелями. Однако при "чебурнете" сложность такой сети, хотя скорее именно избыточность, для простого общения может стать препятствующей основой для обычного человека. Потому любой из нас, на таком этапе, будет придумывать свою специализацию, в данном случае это то, что нужно уже сейчас. Развернув оверлейную сеть, можно не беспокоиться о каких-либо блокировках, хотя всё-таки стоит, но об этом позже.
XXCore - архитектура простой развёртываемой приватной сети, имеющей топологию p2p с доверенными узлами. В основе лежит PipeNet и видоизменённый SSU2 в качестве транспортного протокола.
Суть заключается в том, что такая сеть состоит из роутеров, которые могут составлять маршруты туннелей для подобных себе и становится особыми узлами сети - серверами месседжера. Тут имеется ввиду, что каждый участник сети одновременно является и клиентом и посредником для других, у него также есть возможность стать особым(дальше будем говорить - доверенным) узлом, при определённых обстоятельствах. Любое соединение двух роутеров строится на основе Noise Protocol Framework. В архитектуре нет никаких eepsite, I2P mail и прочего что существует в том же I2P, существуют только доверенные узлы являющиеся специализированными e-service - подобие SFU-серверов для мессенджера, а также одновременно STUN/TURN серверов для создания peer-to-peer сессий. Вместо расширения Garlic Routing, пакеты отправляются одновременно с постоянным фиктивным трафиком, шифруясь от узла к узлу. Сеть соответственно может расширятся и порождать другие: роутер подключенный к одному из доверенных узлов, может стать таким же доверенным, при достижении определённой нагрузки на зависимом узле.
Я уточню, что в случае если узлы(клиенты) являются firewalled(описывается ниже), то-есть кем является каждый человек который платит провайдеру только за выход в интернет, доверенным узлом он стать не сможет. Чаще всего, для приватной маленькой сети, где все друг другу доверяют, нужен всего один такой узел.
Каковы отличие от I2P и Tor?
Во первых, сеть специализирована для аудиоконференций и чатов. Транспортный протокол не реализует обработку потерь пакетов. Понятие потерь вводиться только для чатов.
Во вторых, упор архитектуры идёт на безопасную передачу данных. Анонимность при отправке пакета наступает только в случае передачи его между роутерами. То-есть, вас никто не сможет раскрыть только когда вы используете доверяемый вами роутер как самый первый промежуточный узел в туннеле.
В третьих, сложность использования и порог вхождение низок. При первом запуске I2P, вам нужно настроить проброс портов для udp/tcp трафика и... Всё! Существует более весомая проблема I2P - скорость трафика, на сегодняшний день она достаточно низкая.
В четвёртых, e-service'ом может стать любой узел.
Сейчас, вы можете с полной уверенность сказать что всё описанное ранее не имеет смысла: ведь мессенджер можно развернуть в приватной сети I2P или Tor. И это правда, однако в ответ я лишь скажу, что преимущество этой архитектуры заключается в её специализирующей основе, а также в расширении сети даже обычными пользователями, то-есть которые firewalled.
В следующей главе будет описаны подробности архитектуры с учётом того, что все технологии и понятия уже известны читателю.
Внутренняя структура XXCore
Перед введением в суть доверенных узлов, хочу сказать, что существуют несколько типов узлов:
Nonfirewalled роутер - узел, который может быть и клиентом, и посредником, и доверенным узлом в туннелях.
Firewalled роутер - узел, являющийся клиентом и посредником между двумя nonfirewalled роутерами.
Доверенный nonfirewalled роутер - узел, являющийся STUN/TURN сервером при peer-to-peer сети, и SFU сервером соответственно для SFU сети.
Доверенные узлы
Особенностью сети является возможность роутера стать "доверенным". Понятие "доверенный роутер" в данном случае синонимично с e-service.
Доверенный роутер - это узел сети который имеет туннели с не менее двумя недоверенными узлами. В данной сети таких узлов может быть несколько. В контексте мессенджера их можно называть "серверами", хотя всё ещё являются равноправными и обособленными в существующей сети. При развёртывании сети на VPS(в общем, на любом устройстве имеющее белый IP-адрес), прежде всего это поднятие узла и последующее установление соединений с другими узлами, первым доверенным роутером становится сам VPS, хотя в общем-то это определяется его собственной конфигурацией.
Понятие nonfirewalled обозначает что узел находиться за несимметричным NAT. Именно такой тип NAT позволяет узлу стать доверенным. Если узел находиться за симметричным NAT, коим будет являться каждый узел без белого IP-адреса, то он будет являться firewalled.
Туннели
Туннели(или связи) между любыми узлами в такой сети являются двунаправленными, и могут состоять из прямых соединений определённых узлов. Любое такое прямое соединение узлов обязано совершить рукопожатие, описанное noise протоколом, по паттерну определённым транспортным протоколом. Дополнительное рукопожатие выполняется между двумя конечными узлами - если туннель не является прямым, то есть состоит хотя бы из одного посредника. Если точка назначения туннеля - доверенный роутер, то образуется peer-to-peer сеть для двух узлов и SFU сеть для не менее трёх. Транспортировка пакетов по таким туннелям подобна mixnet сетям, в нашем случае специализированный PipeNet: транспортировочными пакетами являются batch(серии) состоящие из 4 внутренних пакетов с одинаковым размером, где одна часть - полезная нагрузка, а остальная - фиктивность. При передачи по туннелю, каждый последующий роутер будет менять порядок пакетов и передавать следующему, если таковой не конечный узел в туннеле.
Таким образом, туннели представляют собой двухслойное соединение: первый слой - несколько прямых последовательных соединений между узлами, второй слой - соединение между конечными узлами поверх первого слоя соответственно. В архитектуре это разделяется двумя понятиями: транспортный протокол ESSU(easy SSU2), и протокол прямого назначения EDDP(encrypted direct destination protocol) вроде I2NP.
Транспортный протокол ESSU
ESSU - транспортный протокол для передачи серий пакетов, основанный на упрощённом SSU2. Основные позиции данного протокола:
Соединение между двумя узлами строиться на основе XK паттерна noise handshake. Если сеть - peer-to-peer, для соединения двух конечных узлов используется паттерн NoisePSK_XX.
После осуществления рукопожатия, через каждые 16 пакетов производится rekey: выводится новый общий секретный ключ на основе старого с помощью KDF.
Размер одной передаваемой серии пакетов статический - 1360 байтов. В одной серии, как говорилось ранее, 4 пакетов, следовательно размер одного такого пакета - 340 байтов: 2 с полезной нагрузкой и 2 фиктивных пакетов. Полезная нагрузка также имеет детерминированный размер в соответствии с типом пакета.
Все заголовки пакетов, включая отправляемый эфемерный ключ при первом сообщении noise handshake, обфусцируются с помощью keystream ChaCha20, подобно chaobfse в SSU2.
Потери пакетов никак не обрабатываются: нет ack-blocks, повторной передачи пакетов и тп.

В дополнение хочу сказать, что перед рукопожатием рассматривается вариант для обмена собственными внешними IP адресами. Это нужно чтобы вывести эфемерный ключ-маску для обфускации первых трёх сообщений рукопожатия. Хотя не лучше ли указать это в конфигурации?
Зашифрованный протокол прямого назначения EDDP
EDDP - протокол прямого назначения, инкапсулируемый в ESSU и используемый между двумя любыми узлами в сети для взаимодействия. Данный протокол абстрагирован от уровня ESSU, потому целевой пакет данного протокола является payload-частью ESSU unit одного batch.
Пока что протокол не имеет явно описанных позиций, однако нужно отметить две особенности:
Осуществляется внутренний noise handshake по паттерну NoisePSK_XK. Где PSK - общий секретный ключ известный перед осуществлением рукопожатия, является 'паролем доступа' к предварительно созданной сессии.
Реализуется туннельная маршутизация.
Маршрутизация
В отличии от Onion/Garlic Routing, маршрутизация определяется на этапе передачи первого пакета. Заголовок пакета с полезной нагрузкой содержит поле хранящее идентификатор конечного узла, который был выбран исходным узлом. Именно по этому идентификатору каждый последующий роутер в туннеле будет искать, среди подключенных к нему роутеров(или псевдороутров), данный узел - алгоритмом подобного поиска является DHT. Следствием этого является, что каждый узел в сети имеет свой уникальный идентификатор.
После того как узел принял пакет с отличным идентификатором назначения, узел сохраняет в таблицу отражения соответствие, если такового нет, между идентификатором узла назначения и идентификатором роутера который имеет туннель с данным узлом.
Степень безопасности и анонимности сети XXCore
Всё описанное ранее создаёт безопасность в передачи пакетов, что естественно понятно. Все серии шифруются симметричными ключами между узлами, полезная нагрузка в пакетах шифруется отдельно - вспомним внутренний noise handshake между недоверенным и доверенным узлом. Порядок пакетов одной серии на каждом узле меняется для предотвращения определении корреляции между каждым отправлением, часть пакетов такой серии составляют фиктивный трафик, что увеличивает степень информационной энтропии. Анонимность же здесь встаёт на второй план: степень анонимизация увеличивается только в случае увеличения количества роутеров. Это и всё выше описанное, как я считаю, определяет масштабируемую архитектуру с максимально возможной безопасностью передачи данных.
Мессенджер на XXCore
Как ранее говорилось, архитектура является специализированной - на ней нельзя развернуть собственный сервис, ведь сеть строиться в заданных рамках топологии: peer-to-peer и SFU. Для мессенджера не хватает только внедрение RTP-сессий над EDDP.
Что же мы получаем? Расширяемая приватная анонимная сеть без нагромождений I2P, которую можно развернуть с хотя бы одним роутером. По логике, заблокировать такое сопоставимо с введением белых списков на постоянную основу.
Конечно, я возможно не описал подобие управляющих потоков SRTP и многое другое. Возможно что-то кажется размытым и противоречащим. Но я был бы рад, если бы кто-нибудь вдохновился этим и ускорил процесс создания. На данный момент моя реализация пишется на C++, так вот кому стало интересно: я был бы рад вас увидеть в списке контрибьюторов github проекта.
Реализация пишется как header-only библиотека без всяких выделений на куче, и имеет уклон на минимализм.
Спасибо!
