Обход зондов и защита VPN: метод Reality+Xray с серым списком

Стандартная схема 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% автоматических зондов. Три главных совета:

  1. Не баньте — обманывайте, давая зонду валидный ответ.
  2. Сосредоточьтесь на поведении, а не только на сигнатурах.
  3. Автоматизируйте процесс с помощью серого списка и graceful reload.

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

Автор использовал AI для подготовки материала.