Обновить

Обход блокировок внутри iOS-приложения: VLESS + Reality через sing-box, и грабли по дороге

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели18K
Всего голосов 12: ↑12 и ↓0+17
Комментарии25

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

У меня только один вопрос: почему регулятор целенаправленно режет никому неизвестный мессенджер?

Никак специально не режет. И статья этого не утверждает.

Реальность проще и хуже. РКН и операторы по его предписаниям фильтруют не «по продуктам», а по диапазонам и фингерпринтам. Когда блочат сеть провайдера, типовой SNI-паттерн или конкретный TLS-fingerprint, в этот фильтр попадают сразу десятки мелких сервисов которых никто индивидуально не «замечал». Это collateral, а не таргетинг.

Reality в этом контексте нужен ровно потому, что «правильная репутация» от такого collateral'а не спасает. Не важно знаменит ли ты, важно как твой ClientHello выглядит на DPI. Если как обычный мессенджер с cloud-IP, попадёшь в общий фильтр. Если как трафик к microsoft.com, пройдёшь.

То есть статья не про «РКН охотится за нами», а про «как сделать так, чтобы DPI вообще не различал что это мессенджер».

А, т.е. вы изначально поселились в таком диапазоне? Сорян, да

Такой подход давно напрашивается в виде еще одного proxy в Telegram

В Telegram уже есть свои MTProto-прокси для похожей задачи, но они маскируют именно Telegram-протокол. Reality универсальнее: его можно завернуть вокруг любого outbound-трафика. Поэтому в нашем случае это и сработало проще, чем городить свою обфускацию.

UPD: задумывалось как ответ на коммент @art3012, промахнулся кнопкой. Дублирую в правильном треде.

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

Network effect это правда, у любого нового мессенджера эта проблема. В том числе была у Telegram, Signal, Discord (и др.) когда они стартовали. Это не повод не пытаться, а повод делать аккуратно под конкретную аудиторию.

Yggdrasil это mesh IP-routing, замена транспортного слоя между узлами. Над ним всё равно нужен мессенджер: identity, ключи, доставка офлайн-сообщений, push, медиа. Это разные слои задачи, одно другое не заменяет.

Мессенджеры уже есть все какие нужны, и большие с миллиардами мух, и маленькие для групп селфхостед, и открытые без регистрации по паспорту и трекинга (jami итп), и какие угодно. Как вам вообще в голову пришло что надо сделать еще 1, для кого?

Логика «все мессенджеры уже есть» одинаково применима к 2010-му (зачем Signal, есть WhatsApp), 2013-му (зачем Telegram), 2014-му (зачем Threema). Каждый раз ниша находилась.

Конкретно наша: люди в регионах с сетевой цензурой (РФ, СНГ, Иран), где WhatsApp/Signal/Telegram режут на сетевом уровне по TLS-фингерпринту, а Jami и подобные DHT-решения не доставляют офлайн-сообщения и не имеют встроенного обхода блокировок. RCQ закрывает именно это: libsignal + sealed sender + VLESS/Reality внутри приложения, без отдельного VPN.

Регистрация по UIN, без номера телефона и паспорта. Плюс Bluetooth-mesh работает в Иране во время shutdown-ов, когда интернета нет вообще.

Кажется, как раз логично было бы переиспользовать identity и прочую крипту от Yggdrasil. Если это вам почему-то не подходит, интересно было бы прочитать, почему именно.

Хороший вопрос. Если правильно помню, у Yggdrasil identity это Ed25519-ключ узла, а IPv6-адрес узла однозначно из него выводится. То есть identity у них per-node (на каждую инсталляцию своя), и решает задачу «как одному узлу маршрутизировать пакеты другому, зная только его публичный ключ». Полезная штука, но довольно специфическая.

Для мессенджера нужно несколько вещей сверху, которых у Yggdrasil просто нет:

  1. X3DH для асинхронного key agreement: signed prekey и пачка one-time prekeys лежат на сервере, чтобы Федор мог написать Яне, пока Яна оффлайн.

  2. Double Ratchet: forward secrecy и post-compromise security на каждом сообщении. Yggdrasil-уровень это пакеты, понятия «сессия мессенджера» там в принципе не существует.

  3. Sender Keys для эффективной групповой криптографии (без них каждое групповое сообщение приходится шифровать по числу участников).

  4. Sealed sender для метаданных «кто кому».

  5. И ещё момент: пользователь у нас один, а устройств может быть несколько, у каждого свой session-ключ. Yggdrasil-identity жёстко прибита к узлу, я не уверен, можно ли это туда нормально натянуть.

Поэтому я бы не сказал, что libsignal и Yggdrasil это альтернативы. Они скорее на разных слоях: libsignal закрывает крипту мессенджера, Yggdrasil (или Reality, или что-то ещё) сидит ниже и таскает байты. Кстати, Tox over Yggdrasil уже существует, и там Tox-крипта тоже осталась своя, Yggdrasil её не заменял.

Ну и честно говоря, переписывать X3DH + Double Ratchet + Sealed Sender с нуля втроём в свободное время мы бы не вытянули (даже продвинутый ИИ -не всесилен). libsignal проверен в Signal и WhatsApp, аудитов на нём прилично, так что взяли его не от любви, а из расчёта.

Ну да, спасибо, я что-то такое предполагал.

На мой взгляд, у Yggdrasil и вообще IPv6 врождённая проблема: невозможно предложить это настраивать среднестстатитстическому пользователю. Невозможен даже самый крайний сценарий попросить его "продиктовать свой IP" (v4).

Чтобы Yggdrasil пошёл в массы, один из вариантов очеловечивания это прикрутить меесенджер как часть стека. Ставишь мессенджер - получаешь заодно доступ в сеть.

Это так, благопожелание...

Yggdrasil - впн, ipv6 в нем решает проблемы с адресами, не надо заботится о том что бы сети не пересекались и что бы всем хватало адресов, это врожденное свойство около бесконечного пространства адресов ipv6. Пользователю не надо ничего никому диктовать, установил приложение, включил, работает.

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

И видит в этом приложении неведомую хрень (кучу ipv6 префиксов и адресов), которая выглядит страшновато даже для бывалых... олдскулов-админов. Которые привыкли если не прибивать ipv6 рефлекторно сразу, во избежание ненужных проблем, то, насилуя себя, игнорировать это побуждение и терпеть - чтобы иногда случались внезапные ништяки от прогресса в сетевых технологиях. "О! ntc.party открывается".

А вот про включил-работает позвольте не поверить. Диагностика и траблшутинг ожидаемы и предусмотрены - иначе бы приложение состояло из единственной кнопки вкл./выкл.

Что я предлагаю - подумать о более человечной обратной связи. Даже такая малость, как два разных интерфейса wan и wan6 в openwrt - уже кажется шажком в этом направлении. Возможно, это правильная абстракция, которую следовало завести изначально. Это ведь два разных линка, которые могут быть up/down независимо друг от друга.

https://www.perplexity.ai/search/5e0eb811-26a0-4e17-a5f8-fd9478f34e61

Как и следовало ожидать, я не первый задумался о визуализации IPv6. Вероятно, что ещё лучшим драйвером для входа послужило бы почти интегрированное в стек приложение типа мессенджера.

Из-за использования ИИ везде (от репозитория до ответов в комментариях здесь) и шаблонного описания преимуществ по модели «мы решаем проблему Х с помощью решения Y, которое лучше существующего решения Z» складывается ощущение, что мне пытаются этот мессенджер продать. А он бесплатный. Весело :)

Да, ИИ используем активно, и в коде, и в текстах, а кто его сейчас не использует, интересно? Команда из трёх человек, базируемся в Израиле, у каждого основная работа в IT, RCQ это сайд-проект в свободное время. Шипить мессенджер втроём по вечерам без буста от LLM было бы очень медленно, поэтому и в репозитории следы видны, и в комментариях тон такой. Скрывать это смысла нет.

По «шаблонному описанию преимуществ»: техническая статья про обход блокировок неизбежно строится вокруг сравнения с альтернативами (MTProto-proxy, Shadowsocks, классический VPN). Без сравнения остаётся голый список технологий без объяснения, зачем они. По «продают, а он бесплатный»: исходники iOS-клиента открыты под AGPL-3.0 на github.com/rcq-messenger/rcq-ios, бэкенд крутится на нашем железе за наш счёт. Если бы продавали, был бы прайс-лист :)

Андроида нет :(

Пока только iOS, да. Тянуть две платформы параллельно втроём в сайд-проекте не получалось, поэтому Android осознанно отложен (но в процессе все равно). Протокол + бэкенд открыты, спецификация в репозитории, так что если кто-то из комьюнити начнёт Android-клиент раньше нас, поможем чем сможем. Сами вернёмся к Android, когда iOS-версия стабилизируется.

Клиент только под ios или будет в будущем и android и десктоп?

Пока только iOS. Уже занимаемся этим вопросом.

Сама идея отличная - взять то оформление и идею с юинами которую помнят многие, это то что хотелось увидеть. Очень хотелось бы чтобы проект взлетел и к вам присоединились и другие идейные разработчики.

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

Так там сервера на cloudflare, подсети там не заблокированы наглухо, так что оборачивание трафика что бы он не был похож на телеграмный уже даёт возможность обходить блокировки. Вон, посмотри на проект zapret2, он вообще без ВПН позволяет пользоваться тем же ютубом и дискордом.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации