«Если ваш VPN не детектирует зонды — он уже скомпрометирован»
Стандартная схема Reality+Xray работает по принципу «не пойман — не вор». Зонд подключается без правильного SNI → получает редирект на легитимный сайт → уходит. Но что если зонд знает ваш точный SNI? Что если он стучится не один раз, а методично, каждые 5 минут, из разных подсетей?
Я столкнулся с этим в Беларуси: за трое суток работы скрипта/детектора — ни одного «глупого» зонда с пустым SNI, только аккуратные коннекты с правильным google.com и аномальным поведением. Пришлось добавить два слоя защиты поверх стандартной схемы:
Детектор — анализирует nginx-лог и pcap-файлы, считает «очки подозрительности» по поведенческим признакам
Серый список — автоматически перенаправляет выявленные зонды на fallback-сайт, не давая им добраться до VPN
Ключевая идея: зонд не должен понимать, что его поймали. Он должен получить то, что ожидает увидеть, и уйти с мыслью «тут ничего интересного». То есть обнаруженный зонд помещается в серый список и при всех повторных попытках сканировать 443 порт, даже с верным SNI, будет выполнен принудительный редирект на fallback.
Почему просто забанить через iptables не вариант?
Казалось бы: поймали подозрительный IP → iptables -A INPUT -s 1.2.3.4 -j DROP. Но это ошибка:
Действие |
Что видит зонд |
Что думает оператор / система |
|---|---|---|
|
Таймаут или RST |
«Тут что-то скрывают → помечаем как устойчивый к зондам → добавляем в блок-лист» |
Перенаправление на fallback |
Обычный сайт с валидным сертификатом, нормальный TLS-хендшейк |
«Просто сайт, идём дальше» |
Вывод: лучший способ скрыть, что вас детектируют — дать зонду ожидаемый ответ.
Архитектура

Контейнеры (docker-compose)
services: vless: # xray-core, слушает 1080 fallback: # nginx, отдаёт легитимный сайт на :443 nginx_stream: # фронтенд, слушает :443, SNI-роутинг + graylist nginx-proxy: # HTTP :80, ACME challenge для letsencrypt dockergen: # генерирует конфиг nginx-proxy по меткам контейнеров letsencrypt: # acme-companion, автовыпуск сертификатов watchtower: # автообновление образов
nginx-stream.conf
user nginx; worker_processes auto; events { worker_connections 1024; } stream { resolver 127.0.0.11 valid=10s ipv6=off; # === Серый список — читается из файла на хосте === geo $suspicious { default 0; include /etc/nginx/graylist.conf; # формат: "1.2.3.4 1;" } # === SNI-роутинг === map $ssl_preread_server_name $backend { google.com vless:1080; default fallback:443; } # === Финальное решение: зонды из серого списка — только на fallback === map $suspicious $final_backend { 0 $backend; 1 fallback:443; } log_format proxy '$remote_addr -> $backend [$time_local] $status ' 'bytes=$bytes_sent/$bytes_received conn=$connection ' 'sni=$ssl_preread_server_name duration=$session_time ' 'proto=$protocol'; access_log /var/log/nginx/stream-access.log proxy; server { listen 443; ssl_preread on; # читаем SNI, не терминируя TLS proxy_pass $final_backend; # ← ключевая директива proxy_connect_timeout 5s; proxy_timeout 3600s; proxy_socket_keepalive on; } }
Ключевые моменты:
ssl_preread on— nginx читает SNI из ClientHello, не расшифровывая трафикgeo $suspicious— подгружает серый список из файла на хосте (не в контейнере)$final_backend— финальное решение с учётом и SNI, и серого спискаduration=$session_time— длительность сессии, критична для детектора
Серый список: как это работает
Файл /etc/nginx/graylist.conf — обычный список IP в формате nginx geo:
# Graylist IPs — формат: "IP 1;" 80.94.95.221 1; # added 2026-04-02T14:59:20 193.232.56.12 1; # added 2026-04-03T09:15:44
После добавления IP детектор выполняет:
docker exec nginx_stream nginx -s reload
Это graceful reload: nginx перечитывает конфиг за ~50 мс, не разрывая активные соединения. Зонд с этого IP при следующем подключении получит fallback-сайт. С его точки зрения — обычный HTTPS-сервер, ничего интересного.
Детектор: поведенческий анализ вместо сигнатур
Источник |
Что даёт |
Частота обновления |
|---|---|---|
nginx stream log |
SNI, backend, bytes, duration |
В реальном времени |
tcpdump pcap |
TCP-fingerprint: window, MSS, TTL |
В реальном времени |
Захват пакетов: tcpdump-tls.sh
#!/usr/bin/env bash # /usr/local/sbin/tcpdump-tls.sh exec /usr/bin/tcpdump \ -i eth0 \ -Z root \ -w /var/log/tcpdump/tls-%s.pcap \ -G 300 \ # ротация каждые 5 минут -n \ 'tcp port 443 and tcp[tcpflags] & tcp-syn != 0' # только SYN-пакеты
Scoring: система очков подозрительности
Детектор не принимает бинарных решений. Каждый признак добавляет очки, алерт срабатывает при достижении порога (score_threshold: 5).
Признак |
Баллы |
Комментарий |
|---|---|---|
|
+2 |
Не прошёл SNI-роутинг |
|
+3 |
Зонд без домена (браузеры так не делают) |
|
+1 |
Слабый сигнал, но в плюс |
|
+2 |
Только хендшейк, нет данных приложения |
|
+3 |
Соединение оборвано сразу |
|
+2 |
Частые коннекты с одного IP |
|
+3 |
Всплеск за короткое окно |
|
+5 |
Главный признак: зонд появился через 1-3с после легитимного пакета |
|
+2..+5 |
Повторные визиты того же IP |
|
+3 |
Из pcap: 0, 512, 1024 — типично для сканеров |
|
+2 |
Из pcap |
|
+1 |
Из pcap: 255 или <50 |
Корреляция по времени — самый весомый признак
DPI реагирует на трафик: зонд появляется через 1-3 секунды после легитимного пакета клиента. Случайный сканер такой корреляции не даст.
14:59:15 37.212.28.144 → vless:1080 sni=google.com ← ваш клиент 14:59:16 80.94.95.221 → fallback sni=- ← зонд (+5 за correlation)
Как повторить
Требования
✅ Работающий VLESS+Reality setup (xray-core)
✅ Регистрация субдомена на ваш IP VPS
✅ Docker + docker-compose на хосте
✅ root-доступ к хосту (для iptables/tcpdump)
✅ Python 3.10+ с пакетами
pyyaml,dpkt
$cd /home/$USER $git clone https://github.com/segflt-wq/vless.git $cd /home/$USER/vless
Правим в docker-compose.yml переменные окружения под ваш субдомен и токен, в fallback.conf правим субдомен, в server.json генерим uuid и privateKey, меняем shortIds на свои, что нибудь еще по желанию. Настройки клиента подгоняем под сервер. Правим файл telegram под своего бота, или не правим, скрипт что нибудь напишет в логи. Детектор настроен на белорусский сегмент сети, адаптация под ru в папке ./vless/dpi-alert/ru. После всех правок делаем $./setup.sh — создаст каталоги, скопирует файлы конфигурации.
$docker compose up -d
Смотрим логи контов, материмся, донастраиваем letsencrypt и что нибудь еще…
Заключение
Защита от DPI — это не «поставил и забыл», а постоянная игра в кошки-мышки. Но даже простые эвристики (SNI + время + объём трафика) позволяют отсеивать 90% автоматических зондов.
Три главных вывода:
Не баньте — обманывайте. Зонд, получивший нормальный сайт, не понимает, что его поймали.
Поведение важнее сигнатур. Корреляция по времени ловит даже «умных» зондов с правильным SNI.
Автоматизация — ваш друг. Серый список + graceful reload работают без вашего участия.
Может возникнуть вопрос — а есть ли в этом смысл, ведь xray сам может отправлять на fallback трафик который не прошел reality handshake? Смысл есть — это разные слои защиты. Xray fallback отвечает на вопрос «что показать если уже достучались», детектор отвечает на вопрос «кого вообще не пускать дальше nginx». Вместе это defence‑in‑depth: зонд не только видит легитимный контент, но и активно блокируется на сетевом уровне после обнаружения паттерна.
P.S. И да, я конечно пользовался AI для подготовки материала
Комментарии (61)

BURAKKu
12.04.2026 11:40Fallback в x-ray настраивается сильно проще, благо ядро умеет это из коробки (как раз против active probing).
Если хотите маскироваться под сайт купите себе домен (закиньте туда лендинг с виджетом на чат, можете даже метрики Гугла или Яндекса подкинуть) и поднимите сайт в caddy (чтобы не веселиться с сертификатами каждый раз). В настройке сильно проще, чем зоопарк, который вам посоветовала нейронка
Ну или раз нужна именно такая логика, то взять OpenResty и весь зоопарк переделать на пару скриптов в нем.

Lordbander
12.04.2026 11:40Не то чтобы рекомендация, но спросил ИИ, подо что бы замаскироваться. Выдал норм список не типичный. Замаскировался под супермаркет, где заказывают мильены раз. Может не так злобно трафик шерстить будут, как microsoft.

Feemor
12.04.2026 11:40Купить себе домен стоит 200р в год. Если что, можно домен новый купить и настроить сертификаты за 20 минут. Визитку сайт на генерировать в течении 10 минут в нейросети

Goradiz
12.04.2026 11:40За продление попросили 12 000 руб. и столько же стоит сертификат на год.

iamezhik
12.04.2026 11:40Ну если у вас не "коммерческая" история с сотнями клиентов, то сменить домен не проблема, новый будет стоить примерно сто-двести рублей. А сертификата достаточно самоподписанного.

seivgard
12.04.2026 11:40Обсолютно бесплатно можно сделать честный сертификат от letsencript с автопродлением...

Retifff
12.04.2026 11:40Можно домен третьего уровня использовать совершенно бесплатно.

DarkTM
12.04.2026 11:40генерить визитку, это себя подставлять.
Все куда проще, находим даже через нейронку, что-то типа opensource готовых корпаративных мессенджеров, админок и т.д. Сдераем с них морду и все нужные страницы, желательно на том же на чем они написаны. Т.е. если там React, у себя делаем так же.
И на свой домен вешаем их. Условно, mast.example.com, который увидит на этом ip, любой кто попадет в fallback, и не каких вопросов у них не будет. Так как A, ресурс является некой админокй или корп.мессенджером, или еще чем-то, что вот совсем не подозрительно, как и активный трафик к нему. Совсем иное, сайт визитка. Так как то что вы ходите на сайт визитку, по пять тысяч раз в день, уже само по себе подозрительно.
nadge
12.04.2026 11:40Звучит логично, но они что, вручную каждый сайт смотрят? Или условному сбер чату (как его там не помню) скармливают, типа классифицируй нам?

maksd_gt
12.04.2026 11:40тспу это комплекс программно-технических средств в который входит в т.ч нейросеть и обученная модель. Модель обучается ровно на тех данных которые есть от пользователя и умники которые делают Селф стил мало того что подготавливают почву для блокировки посети своего хостера, так ещё и дают модели обучиться тому как какой протокол себя ведёт и в целом как ведут себя ВПН для выявления общего паттерна работы ВПН для всех протоколов и семейств протокола. для дальнейшей блокировки их тоже.

Anton_lah
12.04.2026 11:40Может я не совсем понял, что такое сайт-визитка. Но сайтом может быть просто страничка с логином. А что там внутри - кто ж его знает. Может редактирование видео изображений?..

maksd_gt
12.04.2026 11:40Забудьте про сайты-визитки для обхода блокировок. Это тупик. Работает пока нейронка не выявит паттерн и не будет готова для блокировки у всех такого же паттерна. Дальше блокировка целых подсетей хостеров при обращении к которым выявили такой паттерн.

vp7
12.04.2026 11:40Может это наоборот хорошо? Чем больше блокировки нанесут вреда экономике блокируя легитимное, тем больше шансов, что эту тему прикроют и оставят лайт вариант.
Цель ведь не в том, чтобы обойти - всегда можно рубануть зарубежные аплинки и будет это бесплатно. Цель это сделать экономически невыгодным.

Kirthgreat4
12.04.2026 11:40Оптимальная стратегия - маскироваться под ресурсы, которые генерируют похожий профиль трафика. Например под облачные хранилища (AWS S3, Azure), видеостриминги или корпоративные впн, которые не забанят из-за бизнеса

maksd_gt
12.04.2026 11:40У меня есть теория, что 70-85% инструкций по поднятию своего ВПН сегодня, написано фабрикой троллей ФСБ и профильные сообщества ведут они же. Иначе не объяснить такого глубокого, как рак в последней стадии, распространения этих селф-стилов по профильным сообществам. Так же как и бесчисленное количество дезинформации об обходе ВПН детектирования российскими приложениями на телефонах(здесь про всякие рабочие профили которые якобы должны скрыть факт использования ВПН в основном профиле, что технически безграмотное заблуждение или прямая дезинформация). Я считаю что фабрика троллей делает все чтобы информация в ру сегменте интернета об обходе блокировок была максимально некорректной и чтобы можно было высекать сразу тех кто по этим инструкциям настраивает. Я не видел ни одной полноценной инструкции в интернете и всегда приходится спорить с какими то троллями которые на прямые факты, продолжают утверждать что это все рабочие вещи(рабочие профили и Селф стилы) а я просто ничего не понимаю в этом. В одном чате меня даже заблокировали, когда я стал объяснять почему это технически ошибки. Как это объяснить как не кампанией по дезинформации населения.

Kirthgreat4
12.04.2026 11:40Ну да, заговор
Просто половина этих инструкций написана чатом гпт по запросу "как поднять Xray за 5 минут", вот и весь секрет

RomikB
12.04.2026 11:40Я бы послушал про то как рабочий профиль не скрывает ВПН. А то по виду оно прекрасно работает.

maksd_gt
12.04.2026 11:40Давай так. Ты делаешь себе рабочий профиль, в нем ВПН не запускаешь. Ставишь в рабочий профиль приложение тебойл(только в него пока что не заходи после установки). Идешь в основной профиль, включаешь свой ВПН, возвращаешься в рабочий профиль и входишь в приложение тебойл. Рассказываешь что оно тебе говорит.

maksd_gt
12.04.2026 11:40А ещё ставишь https://techet.net/netanalyzer/ приложение в рабочий профиль. Запускаешь, рассказываешь видит ли он впн

RomikB
12.04.2026 11:40Как в принципе и ожидалось все сетевые интерфейсы (локальные адреса тунелей) видны в рабочем профиле (хотя не хотелось бы). Никакие данные о том какое приложение и в каком направлении создало тунель установить невозможно. Для безопасности этого достаточно. И этого явно недостаточно для того чтобы начать какие то блокировки на основе этого. Из минусов виден DNS сервер ВПН тунеля, но его можно легко сделать локальным. В итоге да, вы правы рабочий профиль не скрывает наличие впн, но нет вы не правы в том что этих данных достаточно хоть для какой либо идентификации и позволяющих хоть как то отделить легитимные корпоративные сети от граждан ставящих себе что то для обхода блокировок.

maksd_gt
12.04.2026 11:40Нужно проводить комплексную диагностику. Тун инетрфейс это действительно только вершина айсберга. Раздельные правила маршрутизации, открытые сокс порты при раздельном туннелирование и прочее. Нужно ставить инструменты диагностики на андроид и проверять. А так да, наличие Тун не повод блокировать, и не утверждал обратного. Важно понимать что рабочий профиль не защищает от шпионов полностью. А вообще запусти приложение rknhardering с гитхаб и посмотри что по факту видно о твоём сетевом стеке шпионам.

maksd_gt
12.04.2026 11:40Нужно проводить комплексную диагностику. Тун инетрфейс это действительно только вершина айсберга. Раздельные правила маршрутизации, открытые сокс порты при раздельном туннелирование и прочее. Нужно ставить инструменты диагностики на андроид и проверять. А так да, наличие Тун не повод блокировать, и не утверждал обратного. Важно понимать что рабочий профиль не защищает от шпионов полностью. А вообще запусти приложение rknhardering с гитхаб и посмотри что по факту видно о твоём сетевом стеке шпионам.

RomikB
12.04.2026 11:40Озаботился в итоге диагностикой, поставил rknhardering, и что по wifi что по мобильной сети (у меня разные сценарии), в итоге теперь пишет "требуется дополнительная проверка". Думаю будет достаточно чтобы не блокировали.

Rubilnik
12.04.2026 11:40Мне вот кажется будет странным, что я гоняю гигабайты через сайт визитку целыми днями)

maksd_gt
12.04.2026 11:40Наконец то хоть кто-то это понимает.
Я уже заколебался фейспалмы пробивать в профильных чатах в ТГ, когда вижу очередную классную рекомендацию делать селф-стил без технической аргументации "как потом защититься от блокировки по статистической аномалии". Я считаю что большая часть инструкци в интернете по впн, это фсбшные тролли пишут. Нет другого объяснение такому обилию заблуждений и явных логических ошибок. "Как защититься от детектирвоания? Создать своим селф стилом огромную статистическую аномалию, которая торчит и видна при любом масштабе и даже не нужно детально анализировать трафик"

edo1h
12.04.2026 11:40Я уже заколебался фейспалмы пробивать в профильных чатах в ТГ, когда вижу очередную классную рекомендацию делать селф-стил без технической аргументации "как потом защититься от блокировки по статистической аномалии".
может быть дело в том, что на ваш вопрос нет ответа?

edo1h
12.04.2026 11:40ну типичный корпоративный портал, например, чем отличается?
не залогинившись ты ничего не увидишь, и не имея ссылки на страничку логина её тоже не сможешь найти (далеко не всегда с / идёт на неё редирект).

heejew
12.04.2026 11:40А зачем эти нагромождения, если ядро x-ray и так работает так, если запрос пришел без нужных shortid,publilkey то происходит ровно то же. В чем суть?

kvd264
12.04.2026 11:40Ну чтоб наверняка. Мало ли произойдет что-то другое. Пусть самые странные боты держатся от xray от греха подальше, он наверняка только на обычных расчитан. /s
Очередной нейрослоп на хайповую тему во имя умножения энтропии.ЮраMiraclePtr, мы все про ebay ли.

segflt Автор
12.04.2026 11:40Спасибо за ваш комментарий! Ответ на вопрос зачем это нужно если ядро xray все умеет изложен в самом конце моего опуса)

edo1h
12.04.2026 11:40какой-то он неубедительный. и вообще выглядит как типичный нейрослоп на запрос «обоснуй значем нужно ненужное»

Kirthgreat4
12.04.2026 11:40Ну да, нейрослоп. Главное в конце стыдливо приписать "P.S. я пользовался AI", типа это оправдывает водянистость текста

Okeu
12.04.2026 11:40Ответ на вопрос зачем это нужно если ядро xray все умеет изложен в самом конце моего опуса
это:
Смысл есть — это разные слои защиты. Xray fallback отвечает на вопрос «что показать если уже достучались», детектор отвечает на вопрос «кого вообще не пускать дальше nginx». Вместе это defence‑in‑depth: зонд не только видит легитимный контент, но и активно блокируется на сетевом уровне после обнаружения паттерна.
не ответ на вопрос, а просто бессмысленная каша:
1) я не вижу там ответа на вопрос: "Зачем?"
2) "Xray fallback отвечает на вопрос «что показать если уже достучались»", а что, nginx детектор не отвечает на тот же самый вопрос? Или обращение к nginx - это еще не достучались? Что тогда вообще значит "достучались"? Для внешнего наблюдателя любой прозрачный прокси не имеет разницы, хоть господь бог его переадресовал на другую страницу.
А вот лишний инфраструктурный геморрой разводить не имеет смысла, пока нет ответа на вопрос "Зачем?". Где-то я видел статьи, где были аргументации такого подхода.

Anton_lah
12.04.2026 11:40спасибо, очень полезно. Чем больше таких слоев защиты, тем сложнее определить, что там на самом деле.

maksd_gt
12.04.2026 11:40Банальный реалити уже решает эту задачу и дает правильный фолбэк. Что гордить то? Просто правильно настроить и сайт донор выбрать не тем на чем сидишь.

Kirthgreat4
12.04.2026 11:40Что мешает зонду просто игнорировать этот fallback и сразу банить IP, если он видит, что TCP-соединение устанавливается с сервером, который хостится у известного клауд-провайдера (типа DigitalOcean или Hetzner)
nikerossxp
правильный sni - только собственный домен. Вся "популярщина" это уже моветон пару месяцев так точно.
зонд точно знает ваш точный sni
уже есть относительно полный список IP зондов
считаю неуважением к сообществу писать какие-то статьи, прямо игнорирующие все обоснованные ранее советы
gotch
Тем более, что зарегистрировать свой домен на год стоит 125 рублей.
ArjLover
Где по 125?
gotch
Не буду здесь рекламировать, но небольшие хостинг- провайдеры берут ровно столько за домен и год хостинга dns.
ArjLover
Эх, максимально простой вопрос был. Жалко?
А за продление?
gotch
Я в личное вам ответил. Продление не важно, это же временный домен под задачу.
DennisP
Да где угодно. Часто на некоторые домены дают хорошую скидку на первый год, типа для привлечения клиентов. Например сейчас на namecheap домен .online стоит 0.99$ за первый год
nidalee
А Namecheap не требует KYC? Потому что с русскими у них разговор короткий.
DennisP
Я не знаю. Но их много, не только namecheap даёт такие условия
nidalee
В таком случае конкретно Namecheap лучше избегать, там активисты.
jshapen
Месяц назад регил там домен. Указал что я из Камбоджи. Другого KYC не потребовал.
Universal32
Куча доменов в namecheap. Захожу с Нидерландов. Все гладко уже несколько лет.
nidalee
Хорошо, но это до следующей волны активизма.
Aelliari
домены из 1.111b на .xyz стоят $0,99 как на покупку, так и на продление. Но это будут только цифры
gscdlr
А можно название материала/ссылку? Стараюсь знакомиться со всеми материалами по теме. У меня стороннее готовое решение, но может придется разворачивать свое.
Alexinthecold
>правильный sni - только собственный домен
Может я не совсем понял о чем речь идет=) но если вы считаете, что лучше селфстил делать конфиг со своим доменом или просто VLESS-TCP-TLS , то я считаю нельзя говорить так категорично, потому для всего есть свое применение.
Есть ситуации когда ваш "собственный домен" со селфстилом вам только навредит и не будет работать, а вот риалити в классическом понимании пробиться поможет. У меня такой опыт имеется...
Olvizd
А точно есть активпроббинг от дпи? У 99% пользователей в target Гугл/Майкрософт. И что-то не слышно про массовые блокировки.