Привет, хабр.....

Если не читали предыдущие статьи - кратко: в РФ сейчас работают белые списки ( а мы не знали ) подробнее тут, ТСПУ работает в режиме drop-all, пропуская только одобренные IP + SNI.

Обходилось это легко - покупаешь VPS у VK/Timeweb/Яндекса, получаешь подсеть которая есть в белых списках, поднимаешь VLESS.

Только вот скоро это перестанет работать.

VK и Яндекс начали детектить инстансы используемые как прокси - предположительно смотрят на паттерны трафика и так далее, MAX вообще давно палит IP VPS через HOST_REACHABILITY - подробнее тут. Мне самому забанили VPS за перебор IP в Yandex Cloud.

И в конце концов поставщики VPS просто уберут смертным доступ к пулам из вайтлиста - тогда вся схема умрёт окончательно.

Так что... способы обойти белые списки через попадание в белые списки - скоро станут невозможными.

Так что делать? Плакать и смириться с чебурнетом ? Ну, как бы да и как бы нет, нам поможет BB22.

Не буду томить. Мы будем эксплуатировать готовые сервисы которые уже в белых списках. А точнее - звонки.

Сначало заранее : почему не Mail/API? Потому что звонки дают огромную пропускную способность. Не только текст а видео и аудио. А SMTP легко DPI-шится: если трафик последователен а сообщения похожи на кашу - блок.

То есть мы будем гнать данные через WebRTC SFU.

выбор сервиса

Для публичной демо сцены выбрали Яндекс Телемост

У Телемоста два важных плюса:

  • Уже в белых списках (проверено)

    пруф. работы телемоста в РФ
    пруф. работы телемоста в РФ
  • Не требует регистрации со стороны участника - войти в аккаунт должен только инициатор, второй участник может остаться гостем.

архитектура

Телемост использует SFU, не P2P. Трафик идёт:

Ваш клиент -> Сервер Яндекса (в белом списке) -> Ваш VPS (второй гость)

У Телемоста есть DataChannel - SCTP over DTLS, порт 5000. По SDP максимальный размер - 1023MB. Реальный лимит сервера - 8KB. Сообщения больше 8KB молча дропаются. Яндекс если вы это читаете то фиксите, не профессионально делаете вещи блин. Решается чанкингом на уровне приложения.

Есть и видеоканал - через него можно гнать данные QR-кодами. медленнее, но fallback если DC закроют.

Аудиоканал - не подходит. Opus с DTX, FEC и шумоподавлением убивает любые не-голосовые данные на уровне кодека. Потеря энергии сигнала >99%. Забудьте.

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

реализация BareBone2022: OlcRTC

Проект называется OlcRTC в честь OpenLibreCommunity

Основаной проект написан на GO, PoC на PY

В репо есть несколько PoC файлов:

code/poc.py - Базовый proof of concept. Два гостя подключаются к одной конференции и обмениваются сообщениями через DC

:P TEST PASSED - OlcRTC PoC works!

code/vcsend.py - Передача данных через видеопоток. Данные кодируются в QR-коды, передаются в видеотреке с 1 FPS, декодируются на приёмнике через pyzbar + OpenCV

-> QR COMPLETE: 892 bytes
:P got 892 bytes

code/limits.py - Проверка всех лимитов. Запускаете, получаете реальные цифры по своему соединению, создан для проверки начали ли Telemost вводить ограничения

:P 1KB: SUCCESS
:P 6KB: SUCCESS  :P 8KB: SUCCESS
X 10KB: Never reached server
:P Max working size: 8,192 bytes (8KB)

code/dcsend.py - HTTP прокси через DataChannel. Клиент шлёт URL, сервер скачивает файл и отдаёт чанками по 8KB с заголовками (transfer_id + sequence)

code/info.py - Полная информация о конференции: участники, кодеки, ICE серверы, SDP

code/flood.py - Не запускайте, флуд участников

а ну ок
а ну ок

И еще пара не нужных вам файлов, кому интересно сам чекнет

Реальные цифры скорости Yandex Telemost

latency (RTT):

  • 100 байт: ~57ms

  • 1KB: ~70ms

  • 4KB: ~73ms

  • 8KB: ~130ms

throughput:

  • 64KB: 2.1s (~244 Kbps)

  • 128KB: 2.2s (~477 Kbps)

  • 256KB: 2.2s (~973 Kbps)

При стриминге большого файла (42MB APK OlcNG):

:P Streamed 44628865 bytes in 7.00s (44.61 Mbps)

Да, 44 Mbps. DC реально быстрый

4к видео скриншот
4к видео скриншот

Тянет даже 4к ютуб видео

Установка Golang версии OlcRTC, требуется любой VPS

На сервере:

установка на сервере
установка на сервере
sudo -v
bash <(curl -sL zarazaex.xyz/srv.sh)

Вводите ID конференции (создайте свою, не используйте мою )

Получаете ключ шифрования

ключ шифрования
ключ шифрования

На клиенте:

установка на клиенте
установка на клиенте
sudo -v
bash <(curl -sL zarazaex.xyz/cnc.sh)

Вводите ID, ключ, порт (по умолчанию 8809) - получаете локальный SOCKS5h прокси

Проверка:

all_proxy=socks5h://localhost:8809 curl -fsSL zarazaex.xyz

Известные проблемы и пометки которые скоро будут пофикшены

  • Трафик не маскируется под реальные сообщения - нет искусственного замедления пакетов в стиле NYM. Паттерны отличаются от живого звонка, к сожалению реализация такого заняла бы слишком много времени, в общем, ждите

  • Нет инициализации звонка изнутри - конференцию надо создавать руками заранее

  • Используется кастомный мультиплексор вместо готовых реализаций

  • Не шлёт фоновые XHR запросы телеметрии как оригинальный клиент Телемоста

  • Яндекс может убрать DC или ограничить скорость - тогда переходим на видеоканал

  • Реализация для MAX существует, но не опубликована по понятным причинам

  • Яндекс может запретить созваниваться Русским с Американцами

  • Яндекс может запретить звонки без подтверждения номера

  • РКН может исключить телемост из бс

  • Реализация BB22 тоесть OlcRTC существует только на Linux

  • Используются имена "srv" которые можно тупо ввести в блеклист

  • По факту этот метод вечный и не блокируемый, проблема в реализации BareBone2022

  • Придется очень много притворятся легит трафиком, эт сложно но возможно

  • Но самое главное - этот способ теоретически не заблокировать не отключив MAX / Telemost

Итого

Идея работает. Данные идут через серверы Яндекса и в будущем макса, они в белом списке. Скорость достаточная.

Яндекс рано или поздно закроет DC - именно поэтому параллельно готовим поддерджку VC и версию для MAX. Когда чебурнет настанет по-настоящему - будем готовы.

Проект под WTFPL. PR не принимаем. issue нету, хотите свою реализацию - делайте с нуля, лучше не форкайте.

Участники: @zarazaex, @zowue и все причастные из openlibrecommunity.

Гитхаб: zarazaex69/olcRTC

По проблемам: zarazaex@tuta.io

UPD: Вот недавно ТГ канал создал, там способы ускорения и обходы белых списков есть, кто хочет может подписатся t.me/openlibrecommunity а еще там самые крутые новости и ваще лучший канал во всем телеграме подпишитесь там еще бесплатно все и анонсы статей будут кароче круто ваще просто.

UPD: собственно OlcRTC все еще в этапе разработки, за пару месяцев все вышеописанные проблемы я уже решу.

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