Стандартная схема Reality+Xray работает по принципу «не пойман — не вор»: зонд, не имеющий правильного SNI, получает редирект на легитимный сайт и уходит. Но что делать, если зонд знает точный SNI и сканирует сеть регулярно с разных подсетей?
В Беларуси за трое суток работы детектора не было «глупых» зондов с пустым SNI — только аккуратные подключения с правильным google.com, но с аномальным поведением. Для усиления защиты добавлены два уровня:
- детектор, анализирующий логи nginx и pcap-файлы с подсчётом «очков подозрительности» по поведенческим признакам;
- серый список, который автоматически перенаправляет выявленных зонды на fallback-сайт, блокируя доступ к VPN.
Главная идея — зонд должен думать, что он получил обычный сайт и не подозревать о детекции. Даже при повторных попытках с верным SNI подозрительные IP перенаправляются на fallback.
Простой бан IP через iptables неэффективен — зонд воспринимает таймаут или сброс соединения как признак скрытия, что повышает его подозрительность. Перенаправление же выглядит как обычный HTTPS-сервер с валидным сертификатом.
Архитектура решения использует docker-контейнеры с nginx, xray-core (vless), fallback-сайтом и автоматическим обновлением сертификатов. Nginx читает SNI из ClientHello без расшифровки, загружает серый список IP из файла и применяет маршрутинг и редиректы.
Серый список — это файл с IP-адресами подозрительных зондов, при добавлении IP nginx выполняет graceful reload, не разрывая активных соединений. Зонд получает fallback-сайт и не замечает блокировки.
Детектор работает на основе поведенческого анализа: собирает данные из логов и tcpdump, оценивает подозрительность по ряду признаков (например, частые подключения, время появления после легитимных клиентов, особенности TCP-фингерпринта). Накопление очков приводит к занесению IP в серый список.
Ключевой признак — корреляция по времени: зонд появляется в течение 1-3 секунд после легитимного клиента, что трудно подделать.
Настройка решения требует работающего VLESS+Reality, регистрации субдомена, docker-compose, root-доступа и Python 3.10+. Скрипты и конфигурации доступны на GitHub, адаптированы под белорусский сегмент сети и могут быть изменены под другие регионы.
В итоге, защита от DPI — это постоянная игра в кошки-мышки. Даже простые эвристики позволяют отсеивать до 90% автоматических зондов. Три главных совета:
- Не баньте — обманывайте, давая зонду валидный ответ.
- Сосредоточьтесь на поведении, а не только на сигнатурах.
- Автоматизируйте процесс с помощью серого списка и graceful reload.
Такой подход обеспечивает глубинную защиту: зонд видит легитимный контент, но блокируется на сетевом уровне после обнаружения подозрительной активности.
Автор использовал AI для подготовки материала.