Добавить в корзинуПозвонить
Найти в Дзене
TrafficVeil

TrafficVeil: как мы построили сервис защиты сайтов от ботов, DDoS и взломов

Больше года назад мы начали делать инструмент «для себя». Сегодня это полноценный сервис, который проксирует и защищает реальные сайты, отражая миллионы вредоносных запросов, — и всё это создано с расчётом на обычного пользователя. Рассказываю, как это вышло — честно и без маркетинга. TrafficVeil — облачный сервис, который защищает сайт от вредоносного трафика: ботов, парсеров, DDoS-атак уровня L7, попыток взлома и спама. Работает как «умный охранник» между интернетом и вашим сайтом — пропускает настоящих посетителей и блокирует вредителей. Мы делали систему максимально простой в настройке. Если вы не знаете, как правильно защитить сайт, есть автоматические сценарии, которые сделают это за вас, и ИИ-бот, который поможет разобраться с любой настройкой. Идея родилась из реальной проблемы. У меня была сетка PBN из 300 сайтов, и анализировать логи каждого вручную было невыносимо долго. Готовые решения на рынке не подходили по разным причинам — не буду углубляться. Так был заложен первый к
Оглавление

Больше года назад мы начали делать инструмент «для себя». Сегодня это полноценный сервис, который проксирует и защищает реальные сайты, отражая миллионы вредоносных запросов, — и всё это создано с расчётом на обычного пользователя. Рассказываю, как это вышло — честно и без маркетинга.

Что такое TrafficVeil

TrafficVeil — облачный сервис, который защищает сайт от вредоносного трафика: ботов, парсеров, DDoS-атак уровня L7, попыток взлома и спама. Работает как «умный охранник» между интернетом и вашим сайтом — пропускает настоящих посетителей и блокирует вредителей.

Мы делали систему максимально простой в настройке. Если вы не знаете, как правильно защитить сайт, есть автоматические сценарии, которые сделают это за вас, и ИИ-бот, который поможет разобраться с любой настройкой.

С чего всё началось: 300 сайтов и каша в логах

Идея родилась из реальной проблемы. У меня была сетка PBN из 300 сайтов, и анализировать логи каждого вручную было невыносимо долго. Готовые решения на рынке не подходили по разным причинам — не буду углубляться.

Так был заложен первый камень будущего сервиса: мы с командой написали анализатор логов, который парсил и структурировал данные о каждом визите — какой IP зашёл, на какую страницу, с каким браузером, в какое время. Раньше это был просто поток цифр, теперь — структура, и картина получилась, мягко говоря, интересная.

Одни скрипты методично долбились в xmlrpc.php — файл WordPress, через который чаще всего ломают сайты. Другие пытались записать что-то в папку uploads. Третьи читали debug.log и error.log — а там иногда лежат пароли от базы данных и другая чувствительная информация. И таких «умных» запросов были не десятки, а сотни видов.

Мы начали фиксировать адреса, с которых приходил весь этот мусор. За год набралась база больше миллиона «плохих» IP — адреса, с которых никогда не приходило ничего хорошего, только сканеры, спамеры и взломщики.

Логичным следующим шагом стала фильтрация входящего трафика прямо на входе, а не постфактум. Звучит просто — на деле оказалось совсем не так.

Второй толчок: блокировка Cloudflare в России

Пока мы строили защиту от ботов, случилось ещё одно: РКН начал блокировать Cloudflare, и часть наших сайтов в зоне .ru перестала открываться для российских пользователей. Около 60% нашей PBN-сетки было именно в зоне .ru — проблема оказалась серьёзной.

Понадобилось собственное решение для проксирования. Так к задаче защиты добавилась задача надёжной доставки трафика — независимо от того, что происходит с зарубежными CDN-провайдерами. Эти две задачи, защита и проксирование, и легли в основу TrafficVeil.

Как это работает: от DNS до вашего сервера

Мы написали собственный DNS-сервер. Когда владелец сайта прописывает у регистратора наши NS-записи — это занимает около 30 секунд — наш DNS начинает отвечать на все запросы об этом сайте. Отвечает не реальным IP хостинга, а адресом нашего прокси-сервера.

-2

С этого момента реальный адрес сервера скрыт полностью: ни в WHOIS, ни в DNS-чекерах — везде виден только наш IP. Атаковать хостинг напрямую становится невозможно, потому что никто не знает, где он находится.

На сегодня в системе 20 выделенных серверов и около 180 IP-адресов. С ростом числа подключённых сайтов будет расти и инфраструктура.

Дальше в дело вступает наш фильтр — прокси-слой, который стоит между посетителем и сайтом.

Семь уровней проверки: что происходит с каждым запросом

Мы написали собственный reverse proxy на Go — не взяли готовый Nginx или HAProxy, потому что нужна была полная гибкость: возможность вставить любую логику в любом месте цепочки обработки запроса.

Каждый HTTP-запрос, прежде чем попасть на сайт, проходит несколько уровней проверки.

Уровень 1. Проверка SSL

Первым делом пропускаются запросы от Let's Encrypt для автоматического выпуска SSL-сертификатов. Без этого автоматизация SSL не работает.

Уровень 2. Логирование

Каждый запрос без исключений записывается в базу: IP-адрес, страна, браузер, запрошенная страница, время ответа и, если запрос заблокирован, причина блокировки. Всё это доступно в личном кабинете.

Уровень 3. Проверка по базам вредоносных IP

Один из ключевых уровней. IP каждого посетителя проверяется сразу по нескольким базам: собственная база, которую мы собирали больше года; открытые базы IPsum и Bitwire; база фейковых Google-ботов — да, существуют боты, которые представляются поисковым роботом Google, но им не являются; база известных сканеров и другие источники.

-3

В памяти системы загружено более 8,5 миллионов адресов. Проверка происходит за O(1) — мгновенно, независимо от размера базы, с помощью структуры данных Bloom Filter. Если IP есть в базе — запрос не проходит.

Уровень 4. Геофильтрация

Если сайт работает на российскую аудиторию, а запросы тысячами идут из Китая или Бразилии — скорее всего, это не клиенты. Можно заблокировать целые страны или, наоборот, настроить белый список и пускать трафик только из нужных регионов.

-4

Дополнительно можно блокировать целые автономные системы и дата-центры — например, пускать только реальных пользователей и блокировать запросы с хостинг-провайдеров. Настраивается одним переключателем.

Уровень 5. WAF — защита от взлома

WAF (Web Application Firewall) ловит попытки взлома через уязвимости в коде сайта. Мы интегрировали Coraza WAF v3 с полным набором правил OWASP CRS v4 — один из самых авторитетных стандартов веб-безопасности. Более 100 правил блокировки закрывают SQL-инъекции, XSS-атаки, Remote Code Execution, Path Traversal, PHP-инъекции.

-5

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

Уровень 6. Rate Limiting

Сто запросов в секунду с одного IP — это точно не живой человек, даже самый быстрый читатель не переключается между страницами с такой скоростью. Мы ограничиваем частоту запросов по IP алгоритмом Sliding Window на Redis. Лимиты настраиваются отдельно для каждого домена — в секунду, минуту, час. Превысившие лимит автоматически блокируются.

Уровень 7. JS Challenge — умная капча

Собственная разработка, которой мы особенно гордимся. Никакого Google reCAPTCHA с выбором светофоров — мы сделали «невидимую капчу».

При первом обращении браузер посетителя получает вычислительную задачу, которую нужно решить для получения токена доступа. Настоящий браузер решает её за доли секунды незаметно для пользователя. Бот — не может: большинство ботов и скриптов на Python, Go, curl не выполняют JavaScript вообще. Сложность задачи настраивается для каждого домена отдельно, от 1 до 8.

Если запрос прошёл все семь уровней — он попадает на сайт. Если нет — отсекается, и сервер даже не узнаёт о попытке. Средний оверхед всей цепочки — 10–15 миллисекунд, посетители ничего не замечают.

Защита WordPress: отдельная история

WordPress — самая популярная CMS в мире и поэтому самая атакуемая. Для неё мы сделали отдельный middleware, который закрывает самые распространённые дыры.

-6

• xmlrpc.php — заблокирован полностью. Это файл, через который чаще всего ломают WordPress, и большинству владельцев он вообще не нужен

• wp-login.php — защищён от брутфорса: количество попыток входа с одного IP ограничено, после превышения — блокировка

• Author enumeration — закрыт. Через него можно узнать логины пользователей и затем подбирать к ним пароли

• debug.log, error.log и другие чувствительные файлы — недоступны снаружи, хотя именно в них иногда хранятся пароли от баз данных

Весь функционал включается одной кнопкой при выборе профиля WordPress.

Готовые профили: защита в один клик

Мы понимали с самого начала: не все владельцы сайтов хотят разбираться в настройках WAF, rate limiting и баз блокировок. Большинству нужно просто нажать кнопку и получить защищённый сайт.

-7

• WordPress — блокировка xmlrpc, защита страницы входа, подключение WAF и базы вредоносных IP

• WooCommerce — всё из профиля WordPress плюс защита оформления заказа и корзины, блокировка парсеров цен. Особенно актуально для магазинов, у которых конкуренты собирают прайс через парсеры

• 1С-Битрикс — защита административной панели /bitrix/admin/, белый список для 1С-обмена

• MODX — защита /manager/, блокировка /connectors/

• DLE — защита admin.php, блокировка SQL-инъекций

• Drupal — защита /admin/ и /user/

• Строгий режим — максимальная паранойя: все базы блокировок подключены, JS Challenge включён для всех посетителей. Используется во время серьёзных атак

• Лёгкий режим — минимальная защита для тех, кому важно не мешать работе сайта

Выбрал профиль, нажал кнопку — всё настроено: rate limiting, WAF, базы блокировок и защита специфических файлов работают сразу.

Надёжность: что если один сайт упал

Когда через один прокси работают сотни сайтов, возникает нетривиальная задача: что делать, если один из них «завис»? Без специальной архитектуры прокси будет ждать ответа от зависшего сервера, занимая ресурсы, и постепенно всё больше соединений зависнет в ожидании — пострадают все остальные сайты, включая исправные.

Мы решили это через изоляцию доменов. Каждый домен получает свой пул ресурсов: собственный HTTP-клиент, ограничение на количество параллельных запросов (по умолчанию 50 на домен) и Circuit Breaker.

Circuit Breaker — это «автоматический выключатель». Если сервер начинает отвечать ошибками, он срабатывает, и прокси прекращает отправлять туда запросы. Через 60 секунд делается одна контрольная попытка: если сервер ожил, работа восстанавливается в штатном режиме, если нет — отключение повторяется.

В итоге падение одного сайта не задевает остальные — они продолжают работать как обычно.

Аналитика: что происходит с сайтом прямо сейчас

Каждый запрос через прокси записывается в ClickHouse — специализированную базу для аналитики, которая обрабатывает миллиарды строк за секунды. Сохраняется всё: IP, страна, браузер, запрошенный путь, статус ответа, время обработки, причина блокировки.

-8

На основе этих данных в личном кабинете строится дашборд:

• Сколько запросов пришло на каждый сайт — в разбивке по времени

• Сколько из них заблокировано и по какой причине — IP-база, WAF, rate limit, геофильтрация и так далее

-9

• Топ атакующих IP с полной информацией: страна, провайдер, автономная система

• География трафика на карте мира

• Живая лента событий в реальном времени через WebSocket

Отдельно есть раздел логов, где можно найти конкретный запрос, отфильтровать по любому параметру и разобрать его до деталей — это помогает понять, почему заблокировался запрос или откуда пришла атака.

SSL и домены: полная автоматизация

Когда у тебя сотни доменов, вручную следить за сертификатами — это ад: каждый нужно выпустить, вовремя продлить и не забыть ни про один. Мы автоматизировали это полностью.

При добавлении домена SSL-сертификат через Let's Encrypt выпускается автоматически, Nginx-конфиг генерируется и применяется сам. Продление тоже происходит автоматически: уведомления приходят за 30 и 7 дней до истечения, но это просто для информации — сертификат обновится без участия пользователя.

Отдельно работает мониторинг WHOIS: система следит за сроками регистрации доменов и присылает уведомление в Telegram за неделю до окончания, в день истечения и в день удаления домена из реестра. Для тех, кто управляет сотнями доменов, это спасение — перехватить домен из-за случайной просрочки больше не получится.

Уведомления приходят в Telegram, по email, через Webhook в Slack или Discord — как удобно.

Немного о технической стороне

Бэкенд и прокси написаны на Go с использованием Gin, GORM и fasthttp. Go выбрали не случайно: он даёт отличную производительность при работе с большим количеством параллельных соединений, что критично для прокси-сервера.

Фронтенд — Next.js с React, TypeScript и Ant Design. Личный кабинет работает как обычное веб-приложение, данные обновляются в реальном времени через WebSocket.

Для баз данных используем три инструмента под разные задачи: PostgreSQL хранит операционные данные — настройки, домены, пользователей; Redis отвечает за кэш, rate limiting и хранение блокировок, работая в памяти; ClickHouse хранит логи и аналитику, легко перемалывая миллиарды строк.

WAF построен на Coraza v3 с правилами OWASP CRS v4. DNS — собственный авторитативный сервер на Go. Инфраструктура: Docker, Nginx, Let's Encrypt, мониторинг через Prometheus и Grafana.

Redis работает в отказоустойчивом кластере: три sentinel-узла, один master и два replica. PostgreSQL — master плюс replica.

Итого: больше года пути

От анализатора логов для собственной PBN-сетки до полноценного SaaS-сервиса защиты сайтов прошло больше года. Было сложно, были бессонные ночи — особенно когда разбирались с автоматизацией SSL на множестве VPS-серверов. Были моменты, когда казалось, что проще взять готовое решение.

Но в итоге получился сервис, который делает нормальную защиту сайта доступной по адекватной цене даже для тех, кто не разбирается в технических деталях. Нажал кнопку «WordPress» — сайт защищён. Прописал NS-записи — реальный IP скрыт. Всё остальное работает само.