OpenAI, как масштабируют postgres под 800M юзеров. Разбираю их цифры и где я в ролике упростил.
Один мастер + около 50 реплик. Чтения летят на реплики, пишет только мастер, поэтому потолок write-нагрузки это один сервер. Ниже конкретно что у них работает, что чуть не убило и почему они НЕ шардировали postgres.
➖➖➖
▎1. 50 реплик и лаг возле нуля
В ролике я сказал «реплика отстаёт на десятки мс». У OpenAI лаг практически ноль.
Реплики стоят рядом с мастером в тех же дата-центрах Azure, канал жирный, WAL применяется без задержек. Плюс сами запросы к базе короткие: весь тяжёлый вычислительный слой это LLM, а не SQL. Реплики успевают за мастером.
Сейчас они упёрлись в другое. 50 реплик это потолок для прямой стриминг-репликации, мастер захлёбывается собственным WAL-трафиком. Работают с Azure над cascading replication (реплика реплики), чтобы уйти в сотни копий.
➖➖➖
▎2. pgbouncer: 50 мс → 5 мс
Самое конкретное число из блога. До pgbouncer открытие соединения к postgres занимало 50 мс. После стало 5 мс, уменьшили в десять раз.
Работает у них в transaction или statement pooling. Оба режима ломают prepared statements: клиент шлёт PREPARE, при следующем EXECUTE попадает уже на другое соединение, где такого prepared statement нет, падает. Лечится отключением prepared statements в клиенте (JDBC, node-postgres) или переключением в session mode с потерей экономии.
Плюс потолок Azure Postgres максимум 5000 клиент-коннектов на инстанс. Без pooler'а тысячи воркеров упираются в этот лимит.
➖➖➖
▎3. OpenAI НЕ шардировали
В ролике я показал шардинг как один из четырёх слоёв. У OpenAI шардинга postgres нет и в ближайшее время не планируется.
Вместо этого они выносят write-heavy нагрузки из postgres в CosmosDB (документная БД Azure с горизонтальным шардированием из коробки).
Причина простая. Шардинг postgres требует переписать пол-приложения: cross-shard джоины, транзакции, миграции. Дешевле выделить конкретный write-heavy кусок и перекатить в БД, которая шардится сама. Postgres остаётся простой и быстрой.
Контр-интуитивно. Обычно думают «упрёмся в один мастер, будем шардить». На практике сначала выносят самое горячее в специализированную систему.
➖➖➖
▎4. SEV-0 на запуске ImageGen
За 12 месяцев у них был один крупный инцидент. Запуск генератора картинок бахнул writes в 10 раз, один мастер такого не тянет.
Из блога видно чем закрылись. idle_in_transaction_session_timeout и жёсткий таймаут на schema-change в 5 секунд. Долгая транзакция или ALTER TABLE в проде с 800M юзеров может заморозить весь мастер, потому что берут ExclusiveLock и всё встаёт в очередь. Лучше отвалиться по таймауту, чем повесить базу.
➖➖➖
▎5. Что забрать себе
Даже если у тебя не 800M юзеров, забирать надо ровно то, что у них работает.
Ставь connection pooler, даже с одним инстансом приложения, это реальная экономия на handshake.
Ограничивай длину транзакции. idle_in_transaction_session_timeout=30s в конфиге может сэкономить инцидент, когда воркер зависнет с открытой транзакцией.
Шардинг это ультра гипер ласт опция, не первая. Сначала реплики, кэш, вынос горячего в специализированную БД.
➖➖➖
Учись теории и практике на izidevops.com.
Один мастер + около 50 реплик. Чтения летят на реплики, пишет только мастер, поэтому потолок write-нагрузки это один сервер. Ниже конкретно что у них работает, что чуть не убило и почему они НЕ шардировали postgres.
➖➖➖
▎1. 50 реплик и лаг возле нуля
В ролике я сказал «реплика отстаёт на десятки мс». У OpenAI лаг практически ноль.
Реплики стоят рядом с мастером в тех же дата-центрах Azure, канал жирный, WAL применяется без задержек. Плюс сами запросы к базе короткие: весь тяжёлый вычислительный слой это LLM, а не SQL. Реплики успевают за мастером.
Сейчас они упёрлись в другое. 50 реплик это потолок для прямой стриминг-репликации, мастер захлёбывается собственным WAL-трафиком. Работают с Azure над cascading replication (реплика реплики), чтобы уйти в сотни копий.
➖➖➖
▎2. pgbouncer: 50 мс → 5 мс
Самое конкретное число из блога. До pgbouncer открытие соединения к postgres занимало 50 мс. После стало 5 мс, уменьшили в десять раз.
Работает у них в transaction или statement pooling. Оба режима ломают prepared statements: клиент шлёт PREPARE, при следующем EXECUTE попадает уже на другое соединение, где такого prepared statement нет, падает. Лечится отключением prepared statements в клиенте (JDBC, node-postgres) или переключением в session mode с потерей экономии.
Плюс потолок Azure Postgres максимум 5000 клиент-коннектов на инстанс. Без pooler'а тысячи воркеров упираются в этот лимит.
➖➖➖
▎3. OpenAI НЕ шардировали
В ролике я показал шардинг как один из четырёх слоёв. У OpenAI шардинга postgres нет и в ближайшее время не планируется.
Вместо этого они выносят write-heavy нагрузки из postgres в CosmosDB (документная БД Azure с горизонтальным шардированием из коробки).
Причина простая. Шардинг postgres требует переписать пол-приложения: cross-shard джоины, транзакции, миграции. Дешевле выделить конкретный write-heavy кусок и перекатить в БД, которая шардится сама. Postgres остаётся простой и быстрой.
Контр-интуитивно. Обычно думают «упрёмся в один мастер, будем шардить». На практике сначала выносят самое горячее в специализированную систему.
➖➖➖
▎4. SEV-0 на запуске ImageGen
За 12 месяцев у них был один крупный инцидент. Запуск генератора картинок бахнул writes в 10 раз, один мастер такого не тянет.
Из блога видно чем закрылись. idle_in_transaction_session_timeout и жёсткий таймаут на schema-change в 5 секунд. Долгая транзакция или ALTER TABLE в проде с 800M юзеров может заморозить весь мастер, потому что берут ExclusiveLock и всё встаёт в очередь. Лучше отвалиться по таймауту, чем повесить базу.
➖➖➖
▎5. Что забрать себе
Даже если у тебя не 800M юзеров, забирать надо ровно то, что у них работает.
Ставь connection pooler, даже с одним инстансом приложения, это реальная экономия на handshake.
Ограничивай длину транзакции. idle_in_transaction_session_timeout=30s в конфиге может сэкономить инцидент, когда воркер зависнет с открытой транзакцией.
Шардинг это ультра гипер ласт опция, не первая. Сначала реплики, кэш, вынос горячего в специализированную БД.
➖➖➖
Учись теории и практике на izidevops.com.
🔥11❤7👍2
Ошибка в видео и три технических детали, которые не влезли в 2 минуты. Плюс ответ на комментарий про Rust-прослойку.
➖➖➖
▎1. Моя ошибка: MySQL у GitHub не для кода
В ролике сказал «GitHub держит код на MySQL». Точнее MySQL держит метаданные: issues, pull request'ы, users, permissions, ссылки на репо. Сам код лежит в git-репозиториях на файловой системе (packed object store в .git/objects/pack/, DEFLATE + delta compression).
Из официального GitHub blog дословно: «GitHub uses MySQL as its main datastore for all things non-git». Спасибо челику в комментах.
➖➖➖
▎2. Почему vertical, а не horizontal шардинг у GitHub
В ролике сказал «взяли 130 таблиц и разнесли». Не сказал почему выбрали именно вертикальный путь.
При горизонтальном шардинге MySQL режем одну большую таблицу по ключу (user_id). Требует переписать пол-приложения: cross-shard джоины, распределённые транзакции, миграции ключей. Vitess это умеет, но много затрат временных.
при вертикальном группа таблиц (issues, PR, comments) целиком уезжает в отдельный MySQL-кластер. Приложение почти не меняется, надо просто научить его знать «issues живут вот здесь». Cutover через Vitess VReplication: копируем данные в фон, включаем dual-write, переключаем reads, отключаем старую копию.
GitHub так вынес 130 самых горячих таблиц.
➖➖➖
▎3. Discord
Cassandra на Java, memtable перед flush держит гигабайты в heap. При GC young generation зависает на десятки мс. Discord пробовал G1GC, ZGC, тюнинг heap-size смогли паузы срезать, но не убрали. Плюс read-repair и compaction тоже держат объекты в памяти, накладываясь на пользовательскую нагрузку.
ScyllaDB на C++, свой планировщик shard-per-core (thread-per-core модель, каждое ядро владеет своим срезом данных, без блокировок).
Discord посчитали цену перехода в шардах: 177 нод Cassandra. ScyllaDB смогла потянуть на 72 нодах, а это почти в 2.5 раза меньше железа. Статья старая, так что думаю объемы больше сейчас у ребят
➖➖➖
▎4. Ответ на вопрос про Rust-прослойку
В комментах был вопрос: «зачем ждать транш запросов, если можно бахнуть ответ сразу? Гасится ли latency?»
Прослойка не ждёт транш. Работает так. Первый запрос на популярное сообщение поднимает worker-задачу и она уходит в базу. Следующие запросы за то же сообщение видят что задача уже крутится, подписываются на её результат вместо своего похода в базу. Worker получает ответ, рассылает всем подписчикам одновременно.
Latency почти не растёт. Первый ждёт обычный round-trip (~15 мс с ScyllaDB). Второй и следующие получают ответ практически бесплатно только IPC overhead в микросекундах.
Смысл не в latency-гонке, а в защите базы. Без coalescing тысяча одновременных читателей одного сообщения, а это тысяча одинаковых запросов, hot partition захлёбывается, все запросы к партиции начинают тормозить.
Плюс consistent hashing по channel_id: все запросы одного канала попадают на один инстанс сервиса, где coalescing работает эффективнее (больше одновременных подписчиков на одну задачу).
➖➖➖
Ссылки:
GitHub MySQL: github.blog/engineering/infrastructure/mysql-high-availability-at-github
GitHub sharding: github.blog/engineering/infrastructure/partitioning-githubs-relational-databases-scale
GitHub 5.7→8.0: github.blog/engineering/infrastructure/upgrading-github-com-to-mysql-8-0
Git internals: github.blog/open-source/git/gits-database-internals-i-packed-object-store
Vitess: vitess.io
Discord ScyllaDB: discord.com/blog/how-discord-stores-trillions-of-messages
➖➖➖
▎1. Моя ошибка: MySQL у GitHub не для кода
В ролике сказал «GitHub держит код на MySQL». Точнее MySQL держит метаданные: issues, pull request'ы, users, permissions, ссылки на репо. Сам код лежит в git-репозиториях на файловой системе (packed object store в .git/objects/pack/, DEFLATE + delta compression).
Из официального GitHub blog дословно: «GitHub uses MySQL as its main datastore for all things non-git». Спасибо челику в комментах.
➖➖➖
▎2. Почему vertical, а не horizontal шардинг у GitHub
В ролике сказал «взяли 130 таблиц и разнесли». Не сказал почему выбрали именно вертикальный путь.
При горизонтальном шардинге MySQL режем одну большую таблицу по ключу (user_id). Требует переписать пол-приложения: cross-shard джоины, распределённые транзакции, миграции ключей. Vitess это умеет, но много затрат временных.
при вертикальном группа таблиц (issues, PR, comments) целиком уезжает в отдельный MySQL-кластер. Приложение почти не меняется, надо просто научить его знать «issues живут вот здесь». Cutover через Vitess VReplication: копируем данные в фон, включаем dual-write, переключаем reads, отключаем старую копию.
GitHub так вынес 130 самых горячих таблиц.
➖➖➖
▎3. Discord
Cassandra на Java, memtable перед flush держит гигабайты в heap. При GC young generation зависает на десятки мс. Discord пробовал G1GC, ZGC, тюнинг heap-size смогли паузы срезать, но не убрали. Плюс read-repair и compaction тоже держат объекты в памяти, накладываясь на пользовательскую нагрузку.
ScyllaDB на C++, свой планировщик shard-per-core (thread-per-core модель, каждое ядро владеет своим срезом данных, без блокировок).
Discord посчитали цену перехода в шардах: 177 нод Cassandra. ScyllaDB смогла потянуть на 72 нодах, а это почти в 2.5 раза меньше железа. Статья старая, так что думаю объемы больше сейчас у ребят
➖➖➖
▎4. Ответ на вопрос про Rust-прослойку
В комментах был вопрос: «зачем ждать транш запросов, если можно бахнуть ответ сразу? Гасится ли latency?»
Прослойка не ждёт транш. Работает так. Первый запрос на популярное сообщение поднимает worker-задачу и она уходит в базу. Следующие запросы за то же сообщение видят что задача уже крутится, подписываются на её результат вместо своего похода в базу. Worker получает ответ, рассылает всем подписчикам одновременно.
Latency почти не растёт. Первый ждёт обычный round-trip (~15 мс с ScyllaDB). Второй и следующие получают ответ практически бесплатно только IPC overhead в микросекундах.
Смысл не в latency-гонке, а в защите базы. Без coalescing тысяча одновременных читателей одного сообщения, а это тысяча одинаковых запросов, hot partition захлёбывается, все запросы к партиции начинают тормозить.
Плюс consistent hashing по channel_id: все запросы одного канала попадают на один инстанс сервиса, где coalescing работает эффективнее (больше одновременных подписчиков на одну задачу).
➖➖➖
Ссылки:
GitHub MySQL: github.blog/engineering/infrastructure/mysql-high-availability-at-github
GitHub sharding: github.blog/engineering/infrastructure/partitioning-githubs-relational-databases-scale
GitHub 5.7→8.0: github.blog/engineering/infrastructure/upgrading-github-com-to-mysql-8-0
Git internals: github.blog/open-source/git/gits-database-internals-i-packed-object-store
Vitess: vitess.io
Discord ScyllaDB: discord.com/blog/how-discord-stores-trillions-of-messages
Discord
How Discord Stores Trillions of Messages
Engineer Bo Ingram shares insight into how Discord shoulders its traffic and provides a platform for our users to communicate.
❤6🔥5
Ура!! Нас 2000 человеков🎉, за это вы получаете промокоды на скидку на сайте izidevops.com
я девопс — 40%
я нищий девопс — 41%
P.S. Все кто уже в этом месяце приобрел лабы получит бесплатный месяц дополнительно ❤️
я девопс — 40%
я нищий девопс — 41%
P.S. Все кто уже в этом месяце приобрел лабы получит бесплатный месяц дополнительно ❤️
😁18❤🔥9👍6🎉4
Media is too big
VIEW IN TELEGRAM
Оказалось, что тут есть люди которые не подписаны в инсте, но подписаны тут. Поэтом буду дублировать сюда.
👍18🔥5
Media is too big
VIEW IN TELEGRAM
Что осталось за кадром:
▪️ Lumen и Cogent из ролика это Tier-1: сети, которые никому не платят за транзит, ядро интернета
▪️ веса из traceroute называются local preference, после них сравнивают длину AS-path: чем меньше сетей
до цели, тем лучше маршрут
▪️ RPKI подписывает только владельца префикса, сам путь не проверяется: подписана пока примерно половина маршрутов
▪️ посмотреть свои хопы: traceroute -a facebook.com покажет ASN каждой сети по дороге
▪️ Lumen и Cogent из ролика это Tier-1: сети, которые никому не платят за транзит, ядро интернета
▪️ веса из traceroute называются local preference, после них сравнивают длину AS-path: чем меньше сетей
до цели, тем лучше маршрут
▪️ RPKI подписывает только владельца префикса, сам путь не проверяется: подписана пока примерно половина маршрутов
▪️ посмотреть свои хопы: traceroute -a facebook.com покажет ASN каждой сети по дороге
👍7🔥3❤2
BGP
➖➖➖
▎1. Маршрут выбирают не по географии
Логично думать, что трафик идёт коротким путём. На деле роутер прогоняет анонсы через список правил и берёт первый, который отсеет остальные. Порядок такой: сначала local preference, число, которое провайдер ставит руками, чем больше тем лучше. Дальше длина AS-path, то есть через сколько чужих сетей ехать. Потом происхождение маршрута, потом MED, и только в самом конце физическая близость соседа.
Отсюда странности вроде трафика из Москвы в Питер через Франкфурт. Провайдер платит одному соседу за каждый мегабит, а с другим обменивается бесплатно, и в настройках руками помечает второго как приоритетного.
▎2. Кто такие Tier-1
Lumen, Cogent и Arelion из ролика это транзитные сети верхнего уровня. Они не платят за транзит никому: между собой обмениваются трафиком бесплатно, по пирингу, и вместе видят весь интернет целиком. Остальные покупают доступ у них или у тех, кто покупает у них.
Иногда две такие сети ссорятся из-за денег и рвут пиринг. Тогда часть интернета перестаёт видеть другую часть, хотя технически всё живо. Cogent воевал и с Level3, и с Telia, пользователи по обе стороны неделями сидели без доступа друг к другу.
▎3. Почему фейсбук чинили так долго
Отзыв маршрутов закрыл не только вход снаружи. У Meta в той же сети жили внутренние сервисы: DNS, инструменты управления, системы доступа. Когда анонсы ушли, инженеры потеряли способ зайти на оборудование удалённо. Попасть в здание физически тоже не вышло.
Отдельная деталь: пока фейсбука не было в маршрутах, приложения на телефонах продолжали ломиться к нему. Это дало всплеск запросов на публичные резолверы вроде 1.1.1.1 и 8.8.8.8, и часть интернета притормаживала уже из-за побочки, а не из-за самой аварии.
▎4. Как воровали деньги
Пакистан 2008 воспринимается как древность, но приём никуда не делся. В 2018 увели трафик DNS Amazon и подменили страницу криптокошелька MyEtherWallet, унесли около 150 тысяч долларов. В 2022 похожее провернули с корейским KlaySwap. Оба раза механика одинаковая: короткий анонс чужого префикса, и перенапривили трафик на фишинговый сервис.
Работает это из-за правила longest prefix match. Более узкий префикс всегда выигрывает у широкого, поэтому /24 бьёт /22, а /25 бьёт /24. Никакой проверки прав в самом протоколе нет.
▎5. RPKI и чего он не умеет
Владелец адресов подписывает запись «этот префикс анонсирую я, вот мой номер AS». Роутер проверяет подпись и отбрасывает мусор. Крупные операторы фильтруют по RPKI уже несколько лет.
Дыра в том, что подпись покрывает владельца префикса, а путь остаётся без проверки. Злоумышленник может анонсировать чужой префикс, подставив в конец пути настоящий номер владельца, и проверка это пропустит. Лечится это BGPsec, где подписывается каждый переход, но его в реальных сетях почти нет: дорого по железу и требует, чтобы поддержали все по цепочке.
▎6. Что попробовать руками
Ещё есть bgp.he.net: вбиваешь свой IP и видишь, кому он принадлежит, с кем эта сеть соединена и какие префиксы анонсирует. Полезно, когда провайдер говорит, что «у нас всё хорошо».
➖➖➖
▎1. Маршрут выбирают не по географии
Логично думать, что трафик идёт коротким путём. На деле роутер прогоняет анонсы через список правил и берёт первый, который отсеет остальные. Порядок такой: сначала local preference, число, которое провайдер ставит руками, чем больше тем лучше. Дальше длина AS-path, то есть через сколько чужих сетей ехать. Потом происхождение маршрута, потом MED, и только в самом конце физическая близость соседа.
Отсюда странности вроде трафика из Москвы в Питер через Франкфурт. Провайдер платит одному соседу за каждый мегабит, а с другим обменивается бесплатно, и в настройках руками помечает второго как приоритетного.
▎2. Кто такие Tier-1
Lumen, Cogent и Arelion из ролика это транзитные сети верхнего уровня. Они не платят за транзит никому: между собой обмениваются трафиком бесплатно, по пирингу, и вместе видят весь интернет целиком. Остальные покупают доступ у них или у тех, кто покупает у них.
Иногда две такие сети ссорятся из-за денег и рвут пиринг. Тогда часть интернета перестаёт видеть другую часть, хотя технически всё живо. Cogent воевал и с Level3, и с Telia, пользователи по обе стороны неделями сидели без доступа друг к другу.
▎3. Почему фейсбук чинили так долго
Отзыв маршрутов закрыл не только вход снаружи. У Meta в той же сети жили внутренние сервисы: DNS, инструменты управления, системы доступа. Когда анонсы ушли, инженеры потеряли способ зайти на оборудование удалённо. Попасть в здание физически тоже не вышло.
Отдельная деталь: пока фейсбука не было в маршрутах, приложения на телефонах продолжали ломиться к нему. Это дало всплеск запросов на публичные резолверы вроде 1.1.1.1 и 8.8.8.8, и часть интернета притормаживала уже из-за побочки, а не из-за самой аварии.
▎4. Как воровали деньги
Пакистан 2008 воспринимается как древность, но приём никуда не делся. В 2018 увели трафик DNS Amazon и подменили страницу криптокошелька MyEtherWallet, унесли около 150 тысяч долларов. В 2022 похожее провернули с корейским KlaySwap. Оба раза механика одинаковая: короткий анонс чужого префикса, и перенапривили трафик на фишинговый сервис.
Работает это из-за правила longest prefix match. Более узкий префикс всегда выигрывает у широкого, поэтому /24 бьёт /22, а /25 бьёт /24. Никакой проверки прав в самом протоколе нет.
▎5. RPKI и чего он не умеет
Владелец адресов подписывает запись «этот префикс анонсирую я, вот мой номер AS». Роутер проверяет подпись и отбрасывает мусор. Крупные операторы фильтруют по RPKI уже несколько лет.
Дыра в том, что подпись покрывает владельца префикса, а путь остаётся без проверки. Злоумышленник может анонсировать чужой префикс, подставив в конец пути настоящий номер владельца, и проверка это пропустит. Лечится это BGPsec, где подписывается каждый переход, но его в реальных сетях почти нет: дорого по железу и требует, чтобы поддержали все по цепочке.
▎6. Что попробовать руками
traceroute -a google.com # покажет ASN каждой сети по дороге
whois -h whois.radb.net AS12389 # чья это автономная система
Ещё есть bgp.he.net: вбиваешь свой IP и видишь, кому он принадлежит, с кем эта сеть соединена и какие префиксы анонсирует. Полезно, когда провайдер говорит, что «у нас всё хорошо».
🔥6❤3👍1
Media is too big
VIEW IN TELEGRAM
Вы наверное забыли, что я существую. Надеюсь все отсылки будут поняты
1❤15👍5🔥5
Как российские приложения палят твой VPN
Разбор по [отчёту RKS Global](https://files.rks.global/russian_apps_search_for_vpn_ru.pdf): 30 российских приложений под микроскопом.
➖➖➖
▎6 способов найти VPN
В отчёте 6 контрольных точек. Четыре ищут сам туннель (один уже устарел), спецразрешений не требуют.
Способ 1. Спросить систему напрямую через ConnectivityManager. ACCESS_NETWORK_STATE выдаётся автоматически:
Способ 2. Перебрать сетевые интерфейсы. VPN поднимает tun0 или ppp0:
Способ 3 (легаси). Прочитать таблицу ядра напрямую:
Работало до Android 10. Дальше /proc/net закрыли SELinux, без root приложение туда не заглянет. В отчёте метод есть, но на свежих версиях это мёртвая ветка.
Способ 4. Поймать прокси. Обходчики (V2Ray, Clash, xray) поднимают локальный SOCKS5 на 127.0.0.1, его палят пробой loopback-порта (1080, 7890). Системный HTTP-прокси отдельно виден через LinkProperties.getHttpProxy().
Способ 5 отдаёт уже не флаг, а имена. Приложение спрашивает, кто умеет быть VPN-сервисом:
Способ 6. Поиск пакетов Tor Browser (`org.torproject.torbrowser`). Из 30 приложений его ищет только Яндекс Браузер.
➖➖➖
▎Куда уходит результат
- VPN определяют все 30 приложений.
- 18 шлют статус VPN на сервер.
- 7 получают список VPN-клиентов по именам: Wildberries, 2ГИС, МТС, Ozon, Мегамаркет, RuStore, Одноклассники.
➖➖➖
▎Что не вошло в ролик, но можно почитать в файле
Отчёт это статический разбор APK через apktool и jadx: 68 контрольных точек, 12 категорий слежки, версии из RuStore и Google Play.
Слежка запускается сама. 49 из 68 проверок срабатывают до первого касания экрана, сразу после установки. Лидеры Т-Банк и Мегамаркет, у обоих 65 баллов из 68.
За 9 дней до дедлайна 15 апреля восемь приложений (среди них Яндекс Go и Дзен) ДОБАВИЛИ детект VPN в обновлениях. Тренд обратный: слежку не убирали, а наращивали.
⚠️ Отдельная дыра в Android 16. Баг registerQuicConnectionClosePayload сливает реальный IP мимо туннеля даже при Always-On VPN. Google закрыл репорт как Won't Fix, патч есть только в GrapheneOS.
Детект работает не в вакууме. 4-5 августа РКН заблокировал серверы 20+ VPN-сервисов, и юрист Саркис Дарбинян связал успех блокировок в том числе с тем, что приложения научились палить VPN прямо на устройстве. Сначала приложение видит твой обходчик, потом его сервер уходит в блок.
➖➖➖
▎Как закрыться
Список установленного прячется приватным пространством: отдельный профиль со своими копиями приложений (Android 15+). У Samsung это защищённая папка, на старом Android рабочий профиль через Shelter.
Против самого детекта на обычном телефоне готового решения нет. Помогают только root-инструменты вроде vpnhide, которые фильтруют ответы на уровне Binder.
Разбор по [отчёту RKS Global](https://files.rks.global/russian_apps_search_for_vpn_ru.pdf): 30 российских приложений под микроскопом.
➖➖➖
▎6 способов найти VPN
В отчёте 6 контрольных точек. Четыре ищут сам туннель (один уже устарел), спецразрешений не требуют.
Способ 1. Спросить систему напрямую через ConnectivityManager. ACCESS_NETWORK_STATE выдаётся автоматически:
val caps = cm.getNetworkCapabilities(cm.activeNetwork)
val hasVpn = caps?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) == true
Способ 2. Перебрать сетевые интерфейсы. VPN поднимает tun0 или ppp0:
NetworkInterface.getNetworkInterfaces().toList().any {
it.isUp && it.name.matches(Regex("tun\\d|ppp\\d"))
}
Способ 3 (легаси). Прочитать таблицу ядра напрямую:
$ cat /proc/net/tcp # TCP-соединения ядра
$ cat /proc/net/route # tun0 в таблице = трафик в туннеле
Работало до Android 10. Дальше /proc/net закрыли SELinux, без root приложение туда не заглянет. В отчёте метод есть, но на свежих версиях это мёртвая ветка.
Способ 4. Поймать прокси. Обходчики (V2Ray, Clash, xray) поднимают локальный SOCKS5 на 127.0.0.1, его палят пробой loopback-порта (1080, 7890). Системный HTTP-прокси отдельно виден через LinkProperties.getHttpProxy().
Эти четыре отвечают «да / нет»: туннель есть или нет.
Способ 5 отдаёт уже не флаг, а имена. Приложение спрашивает, кто умеет быть VPN-сервисом:
val intent = Intent("android.net.VpnService")
val vpnApps = packageManager.queryIntentServices(intent, 0)
// -> WireGuard, Amnezia, твой обходчик по имени пакета
Способ 6. Поиск пакетов Tor Browser (`org.torproject.torbrowser`). Из 30 приложений его ищет только Яндекс Браузер.
➖➖➖
▎Куда уходит результат
- VPN определяют все 30 приложений.
- 18 шлют статус VPN на сервер.
- 7 получают список VPN-клиентов по именам: Wildberries, 2ГИС, МТС, Ozon, Мегамаркет, RuStore, Одноклассники.
➖➖➖
▎Что не вошло в ролик, но можно почитать в файле
Отчёт это статический разбор APK через apktool и jadx: 68 контрольных точек, 12 категорий слежки, версии из RuStore и Google Play.
Слежка запускается сама. 49 из 68 проверок срабатывают до первого касания экрана, сразу после установки. Лидеры Т-Банк и Мегамаркет, у обоих 65 баллов из 68.
За 9 дней до дедлайна 15 апреля восемь приложений (среди них Яндекс Go и Дзен) ДОБАВИЛИ детект VPN в обновлениях. Тренд обратный: слежку не убирали, а наращивали.
⚠️ Отдельная дыра в Android 16. Баг registerQuicConnectionClosePayload сливает реальный IP мимо туннеля даже при Always-On VPN. Google закрыл репорт как Won't Fix, патч есть только в GrapheneOS.
Детект работает не в вакууме. 4-5 августа РКН заблокировал серверы 20+ VPN-сервисов, и юрист Саркис Дарбинян связал успех блокировок в том числе с тем, что приложения научились палить VPN прямо на устройстве. Сначала приложение видит твой обходчик, потом его сервер уходит в блок.
➖➖➖
▎Как закрыться
Список установленного прячется приватным пространством: отдельный профиль со своими копиями приложений (Android 15+). У Samsung это защищённая папка, на старом Android рабочий профиль через Shelter.
Но от детекта VPN это не спасает. Интерфейс tun0 на устройстве один, виден из любого профиля. На iOS то же самое: список не собрать, а VPN палится через utun.
Против самого детекта на обычном телефоне готового решения нет. Помогают только root-инструменты вроде vpnhide, которые фильтруют ответы на уровне Binder.
❤15🔥9🆒2
Всем привет.
Закрываю продажу лаб по Kubernetes.💔 Всем, кто покупал, верну деньги полностью, независимо от того, сколько осталось по подписке.
Причина простая. Поддержка лаб съедала очень много времени и сил. Потраченного времени жаль, но тянуть это и совершать ошибку невозвратных затрат не хочется 🤫
Сейчас думаю над новыми форматами видео или бесплатных материалов. Что бы вам самим было полезно? Напишите в комментариях.
Закрываю продажу лаб по Kubernetes.
Чтобы получить возврат, напишите мне в дм инстаграма или на partners@izidevops.ru. Достаточно написать с почты, на которую оформляли доступ и номер карты куда сделать возврат. Доступ к лабам будет открыт еще до конца августа.
Причина простая. Поддержка лаб съедала очень много времени и сил. Потраченного времени жаль, но тянуть это и совершать ошибку невозвратных затрат не хочется 🤫
Сейчас думаю над новыми форматами видео или бесплатных материалов. Что бы вам самим было полезно? Напишите в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
😢24❤10😁3💔1🫡1
Media is too big
VIEW IN TELEGRAM
MCP новый слой, который становится необходимым из-за развития ИИ. Пытаюсь на двух стульях балансировать, чтобы было и понятно и не поверхностно
👍14😱2
This media is not supported in your browser
VIEW IN TELEGRAM
Вы уже подписаны тут, так что подписывайтесь в других соцсетях. И научите меня заливать в хорошем качестве, пожалуйста!
3❤19👍13
Поэтому к сожалению сайт будет закрыт, но я уверен кто-то сворует его и поднимет точно такой же, на домене izidevops.com🤫.
С новыми бесплатными лабами ci-cd с практикой в gitlab и также лабами по куберу, который вы сможете развернуть на своем ПК, думаю уже этот самый грязный заяц делает их для вас!
💟
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👌3👨💻1
Media is too big
VIEW IN TELEGRAM
Факты из исследования IMDEA Networks и Radboud University, июнь 2025.
* Meta признана в РФ экстремистской организацией, её деятельность запрещена.
Видео касается в основном телефонов с android на борту
* Meta признана в РФ экстремистской организацией, её деятельность запрещена.
Видео касается в основном телефонов с android на борту
1❤15🔥6
Всем привет! Сайт переехал на izidevops.com вроде все баги пофиксил после миграции. Также добавил мануалы, как запустить linux на windows через wsl, чтобы вы могли тренироваться бесплатно. Также добавил репозиторий публичный (он упоминается в уроках по ci cd)с домашними тренировками ci/cd которые вы сможете настроить сами, если что-то не получается или находите ошибки или не воспроизводимость, то пишите в форму на сайте или сюда. Пишите также, какие темы освятить, всё читаю. Сделаем полезный бесплатный сайт вместе ❤️
1🔥22❤12👍5
Всем привет!
Прошу простить, что не было обучающих роликов, они обязательно скоро выйдут,с первой полноценной рекламой (прошу не хейтить, это позволяет делать бесплатный контент лучше❤️ )
В izidevops.com появились главы:
Kubernetes и как его поднять на своем компе,
CI/CD тоже с бесплатными мануалами как их запускать, как все работает и зачем оно
И также добавил удобный поиск, всех люблю, всех обнял!
P.S. Также я начал перезаливать, видосы в ютуб, чтобы там тоже были подписчики, для создания длинного формата через какое-то время. Если и туда подпишитесь буду очень благодарен🤫
Прошу простить, что не было обучающих роликов, они обязательно скоро выйдут,
В izidevops.com появились главы:
Kubernetes и как его поднять на своем компе,
CI/CD тоже с бесплатными мануалами как их запускать, как все работает и зачем оно
И также добавил удобный поиск, всех люблю, всех обнял!
P.S. Также я начал перезаливать, видосы в ютуб, чтобы там тоже были подписчики, для создания длинного формата через какое-то время. Если и туда подпишитесь буду очень благодарен
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍26❤11🔥5💩2
Media is too big
VIEW IN TELEGRAM
Дублирую из инсты, кому реально необходимо выставлять счета для оплаты за рубеж велком. Mellow
1❤12🔥3✍2
Всем привет! Добавил уроки с практикой по куберу локальной и поэтому бесплатной, и также скрипты проверки заданий, так что теперь можете читать теорию, поднять собственный кубер локально и выполнять задания.
Если нашли ошибки или неточности, обязательно пишите в форму обратной связи, я всё читаю ❤️
Если нашли ошибки или неточности, обязательно пишите в форму обратной связи, я всё читаю ❤️
❤22🔥5🤝2
Media is too big
VIEW IN TELEGRAM
Новое видео docker vs podman, узнай кому ушло мое победное очко
👍6😁5❤3
Media is too big
VIEW IN TELEGRAM
Вот такие пироги с базами. Пишите в комментарии, кто пользуется вк клипами, чтобы я вас удалил 🌚
4👍10🔥10😁8❤3😍2