Защита периметра у российского хостинга: что мы изменили после инцидента у клиента
Карта России и серверы под защитой — атаки и фильтр Москва СПб Казань Екб НСК Сервер клиники CDN Защита периметра: CDN, WAF, фильтры — на пути атаки
Карта серверов клиента и схема входящих атак, гасимых на CDN-уровне до достижения сервера.
· 16 мин чтения · Семёнов Е.С., руководитель ITfresh

Защита периметра у российского хостинга: что мы изменили после инцидента у клиента

Защита периметра у российского хостинга: что мы изменили после инцидента у клиента

Февраль 2026 года. Пятница, 13:40. У нашего клиента — частной медицинской клиники из ЮВАО Москвы — лёг сайт с системой записи пациентов. Самый пиковый час, люди не могут записаться, операторы перезванивают вручную, а директор клиники пишет мне в WhatsApp: «Семён, у нас ад». По существу — классика: DDoS L7 по форме записи плюс одновременный SQL-fuzz на /api/. Четыре часа — и мы вернули всё в работу. Ещё две недели ушло на то, чтобы полностью пересобрать защиту периметра. Этот текст — отчёт: что именно мы поменяли, какие выводы сделали о российских хостингах в 2026 году и почему теперь рекомендуем клиентам конкретный набор инструментов — без героики и импровизации. Внутри — реальные конфиги, ценники и дословные фразы из переписки с хостерами.

Что произошло у клиента 13 февраля 2026

До атаки инфраструктура клиники была совершенно стандартной — ничего выдающегося. WordPress с плагином записи на приём. VDS от Reg.Ru за 1 800 ₽ в месяц: Ubuntu 22.04, 4 vCPU, 8 GB RAM. MySQL крутилась там же, на том же сервере. Бэкапы хостер делал раз в сутки. Из защиты — fail2ban для SSH, базовый ModSecurity в Nginx с правилами CRS и Cloudflare Free для CDN. Честно говоря, такую картину мы видим у большинства клиентов малого бизнеса. Ничего критического на первый взгляд — до первого серьёзного удара.

В 13:40 CPU на виртуалке рванул с привычных 8% сразу до 100%. Nginx начал сыпать 504-ми. Я открыл логи — и там было что-то нереальное: десятки тысяч POST-запросов в секунду на /api/booking/check-slot/, причём с разных IP. Cloudflare Free пропускал большую часть этого потока. Атака была грамотно построена: каждый IP делал 1-2 запроса за 30 секунд — ровно столько, чтобы не попасть под наш rate-limit. На пике сервер обрабатывал около 14 000 RPS. Для сравнения — в обычный день мы видели 40-60.

Параллельно шли попытки эксплуатации — замаскированные под поиск врача. SQL-инъекции, запросы к /wp-json/wp/v2/users для сбора логинов, brute-force на /wp-admin. ModSecurity за 20 минут заблокировал 47 000 таких запросов. Но кое-что всё-таки пробилось — и именно это потом потребовало отдельной работы.

Был ещё один момент, который запомнился отдельно. На третий час атаки директору клиники пришло письмо: «Ваш сайт под нагрузкой, переведите 0,008 BTC на адрес ниже — мы остановим атаку. Иначе продолжим». Ransom-DDoS, классика жанра. Директор молча переслал нам письмо с одной припиской: «не плачу принципиально». Честно — мне это понравилось.

Как мы выводили клинику из атаки за 4 часа

Шаг 1. Перевод трафика на Cloudflare с включённым «I am Under Attack»

Первое действие — быстро перевести DNS A-запись на Cloudflare и включить режим «Under Attack Mode». Что это даёт на практике: каждый входящий посетитель проходит JavaScript-челлендж перед тем, как попасть на сайт. Боты в большинстве случаев его не проходят. Реальные пациенты видят страницу «Checking your browser» и через 5-7 секунд оказываются на сайте. Для человека — почти незаметно. Для бота — стена.

На всю операцию ушло 12 минут. Почему так долго? DNS клиента жил на NS-серверах Reg.Ru с TTL 86400 — это сутки. Поменять запись можно быстро, а вот ждать, пока у провайдеров обновится кэш — это уже не в наших руках. С тех пор у всех наших клиентов TTL по умолчанию стоит 300 секунд. Это одно из тех изменений, которые почти ничего не стоят, но в критической ситуации экономят часы.

# Cloudflare API: включить Under Attack Mode
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/security_level" \
     -H "Authorization: Bearer ${CF_API_TOKEN}" \
     -H "Content-Type: application/json" \
     --data '{"value":"under_attack"}'

# Дополнительно — включить Bot Fight Mode
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/bot_management" \
     -H "Authorization: Bearer ${CF_API_TOKEN}" \
     -H "Content-Type: application/json" \
     --data '{"fight_mode":true,"sbfm_likely_automated":"managed_challenge"}'

Шаг 2. Перенос nginx за тонкий слой защиты

Одновременно переписали конфиг nginx. На /api/booking/check-slot/ поставили rate-limit: не более 5 запросов в минуту с одного IP. На /wp-admin — 3 запроса в минуту. Добавили блокировку по User-Agent для известных стрессеров: curl, wget, python-requests без кастомных заголовков. Грубо, но работает — именно такие инструменты используют в большинстве дешёвых атак.

# /etc/nginx/sites-enabled/clinic.conf — фрагмент
limit_req_zone $binary_remote_addr zone=booking:10m rate=5r/m;
limit_req_zone $binary_remote_addr zone=admin:10m rate=3r/m;
limit_req_zone $binary_remote_addr zone=api_strict:10m rate=10r/m;

# Блок известных стрессер-патернов
map $http_user_agent $bad_agent {
    default                          0;
    "~*python-requests"              1;
    "~*curl/[0-9]"                   1;
    "~*GoHttpClient"                 1;
    "~*okhttp/3"                     1;
    "~*Wget"                         1;
    ""                               1;
}

server {
    server_name clinic.ru;
    listen 443 ssl http2;

    if ($bad_agent) { return 403; }

    location /api/booking/check-slot/ {
        limit_req zone=booking burst=2 nodelay;
        limit_req_status 429;
        proxy_pass http://localhost:8080;
    }

    location /wp-admin/ {
        limit_req zone=admin burst=1 nodelay;
        allow 192.168.10.0/24;     # офис клиники
        allow 51.250.84.211;        # наш VPN-шлюз
        deny  all;
    }

    location /api/ {
        limit_req zone=api_strict burst=5 nodelay;
        proxy_pass http://localhost:8080;
    }
}

Через 25 минут после переключения на Cloudflare и применения rate-limit нагрузка на сервере опустилась до 30%. Отказы прекратились. Форма записи заработала. Пациенты, скорее всего, восприняли это как «сайт немного тормозил, потом нормализовался». Для нас — четыре часа адреналина и очень конкретные выводы.

Шаг 3. Восстановление пропущенных запросов

БД проверили сразу — искали следы успешных SQL-инъекций. ModSecurity заблокировал 99% попыток, но на трёх запросах всё-таки проявилась ошибка — увидели только по логам. Оперативно почистили кэш wp-options, сменили ключи WP_AUTH в wp-config.php. Принудительно сбросили все активные сессии администраторов через очистку поля wp_users.user_activation_key. Это не героизм — это обычная гигиена после любого инцидента. Просто многие её пропускают.

Что мы изменили в архитектуре после атаки

За две недели после инцидента мы почти полностью пересобрали защиту периметра. На встрече с директором я сформулировал принцип, который теперь использую как рабочий: «защита должна быть не в сервере, а перед сервером». Все слои фильтрации мы подняли на уровень CDN. Сам сервер стал максимально «тонким» — он просто отдаёт контент тем, кого уже пропустил Cloudflare.

Перенос с Reg.Ru на Selectel + Cloudflare Pro

VDS от Reg.Ru за 1 800 ₽ в месяц — хороший выбор для лендинга. Но для клиники с EMR-системой и живым потоком пациентов — недостаточно. Мы перевезли инфраструктуру в Selectel: VDS «Стандарт», 4 vCPU, 8 GB RAM, 120 GB SSD — 2 600 ₽ в месяц. Резервные копии настроили в Я.Облаке через Object Storage — около 400 ₽ в месяц. Cloudflare подняли с Free до Pro — примерно 2 200 ₽ в месяц. Pro даёт управляемый WAF с кастомными правилами, image optimization и нормальную аналитику — то, чего в Free-версии просто нет.

Reg.Ru — отличный регистратор. Домены и DNS клиники там и остались, без вопросов. Но как хостинг для критически важных сервисов — на нашей практике он проигрывает. У Selectel и Я.Облака сетевая инфраструктура в Москве заметно надёжнее — это ощущается не в маркетинговых материалах, а в цифрах. После переезда UptimeRobot фиксировал 99,98% за два месяца. Для медицинского сервиса, где запись к врачу — это не просто удобство, это критика.

WAF-правила Cloudflare под бизнес-логику

На Cloudflare Pro мы написали 14 кастомных WAF-правил — под конкретные сценарии атак на медицинскую клинику. Не универсальные шаблоны, а точечные: по эндпойнтам, по паттернам запросов, по географии трафика. Правила закрывают то, что стандартный набор CRS не покрывает применительно к WordPress с плагином записи на приём.

# WAF Custom Rules (Cloudflare Expression Language)

# Правило 1: блок POST на форму записи без валидного X-Source-Token
(http.request.uri.path eq "/api/booking/check-slot/"
  and http.request.method eq "POST"
  and not http.request.headers["x-source-token"][0] in {
    "frontend-prod-2026-01" "ios-app-2025-12"
  })
=> Block

# Правило 2: rate-limit /wp-login.php — 5 попыток в час
(http.request.uri.path eq "/wp-login.php")
=> Managed Challenge (rate: 5r/h per IP)

# Правило 3: блокировка путей-разведчиков
(http.request.uri.path matches "(?i)(/\\.env|/\\.git|/wp-config|/phpmyadmin|/admin\\.php)")
=> Block

# Правило 4: блок known-bad SHODAN/Censys агентов
(http.user_agent contains "Censys" or http.user_agent contains "Shodan"
  or http.user_agent contains "MJ12bot" or http.user_agent contains "AhrefsBot")
=> Block

# Правило 5: только Россия и СНГ для админки
(http.request.uri.path matches "^/wp-admin"
  and not ip.geoip.country in {"RU" "BY" "KZ" "AM"})
=> Block

Бэкапы по схеме 3-2-1 без оптимизма

До инцидента у клиента был один бэкап — снимок виртуалки на стороне хостера, раз в сутки, хранение 7 дней. Это катастрофически мало. Мы внедрили схему 3-2-1: три копии данных — продуктив плюс два бэкапа, на двух разных носителях, одна копия — оффсайт. Звучит как базовая вещь. Но до атаки об этом не думал никто.

#!/bin/bash
# /usr/local/bin/clinic-backup.sh — запуск через cron каждый час для БД,
# раз в сутки для файлов

set -euo pipefail

BACKUP_DIR=/var/backups/clinic
S3_BUCKET=s3://clinic-backups-itfresh
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=14
RETENTION_S3_DAYS=90

# 1. БД — каждый час
mysqldump --single-transaction --quick \
  --triggers --routines --events \
  -u backup -p"${MYSQL_BACKUP_PASS}" \
  clinic_main | gzip -9 > "${BACKUP_DIR}/db-${TIMESTAMP}.sql.gz"

# 2. Файлы и uploads — раз в сутки
if [ "$(date +%H)" = "03" ]; then
    tar czf "${BACKUP_DIR}/files-${TIMESTAMP}.tar.gz" \
        /var/www/clinic/wp-content/uploads \
        /var/www/clinic/wp-config.php \
        /etc/nginx /etc/letsencrypt
fi

# 3. Заливка в Я.Облако Object Storage (S3-совместимый)
aws s3 cp "${BACKUP_DIR}/db-${TIMESTAMP}.sql.gz" "${S3_BUCKET}/db/" \
  --endpoint-url=https://storage.yandexcloud.net \
  --storage-class=STANDARD_IA

# 4. Локальный rotation
find "${BACKUP_DIR}" -name "db-*.sql.gz" -mtime +${RETENTION_DAYS} -delete
find "${BACKUP_DIR}" -name "files-*.tar.gz" -mtime +${RETENTION_DAYS} -delete

# 5. Уведомление в Telegram о статусе
curl -s "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
  -d "chat_id=${TG_CHAT_ID}" \
  -d "text=Backup OK at ${TIMESTAMP} — $(du -sh ${BACKUP_DIR} | cut -f1)"

Раз в две недели я вручную делаю restore из S3-бэкапа — поднимаю изолированную среду и проверяю, что всё реально восстанавливается. Не теорию, не логи — именно restore. Не тестируешь бэкап? Значит, бэкапа у тебя нет.

Мониторинг 24/7 через Prometheus + Telegram

На отдельной виртуалке в Selectel у меня крутится связка: Prometheus, Alertmanager и Grafana. Плюс поднял blackbox-exporter — он пингует сайт одновременно из трёх точек: Москва, Питер, Нидерланды. Если сайт не отвечает больше 60 секунд — алерт моментально летит в дежурный Telegram-канал ITfresh. Простои мы не пропускаем.

# prometheus.yml — фрагмент
scrape_configs:
  - job_name: 'blackbox-clinic'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
        - https://clinic.ru/
        - https://clinic.ru/api/booking/check-slot/
        - https://clinic.ru/wp-login.php
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9115

# alertmanager rules
groups:
  - name: clinic_critical
    rules:
      - alert: ClinicDown
        expr: probe_success{job="blackbox-clinic"} == 0
        for: 60s
        labels:
          severity: critical
        annotations:
          summary: "Сайт клиники недоступен с {{ $labels.instance }}"

      - alert: ClinicSlowResponse
        expr: probe_duration_seconds{job="blackbox-clinic"} > 3
        for: 5m
        labels:
          severity: warning

Что мы поняли про российские хостинги в 2026

15 лет в IT-аутсорсе в Москве — и я видел, как российский хостинг прошёл путь от «один поднял VDS в гараже» до нормальных облачных платформ. К 2026 году картина сложилась вполне конкретная.

Топ для критичных сервисов

Yandex Cloud — флагман российского облака, стабильная сеть, хорошая защита от DDoS на уровне инфраструктуры, прогнозируемые цены. У нас там живут резервные шлюзы и Object Storage у трёх клиентов. Selectel — для VDS и dedicated, отличный аптайм, разумные цены, нормальная техподдержка. Использую как основной провайдер для большинства корпсайтов клиентов. VK Cloud — конкурентоспособный по цене, неплохая дока, но техподдержка медленнее, чем у Selectel. Cloud.ru (бывший SberCloud) — корпоративный сегмент, высокий ценник, но сертификаты ФСТЭК и УЦ если кому-то это критично.

Шаред-хостинг и небольшие провайдеры

Reg.Ru, Beget, Sprinthost — нормальная разметка для лендингов, малых корпоративных сайтов, сайтов-визиток. Ставить туда EMR-систему клиники, биллинг или критичный 1С-сервис — не стоит. FirstVDS, Timeweb, RuVDS — VDS сегмента «дёшево и под себя», для тестовых стендов и личных сайтов разработчиков. Aeza — отдельный кейс: дешёвая, в основном европейская инфраструктура, но репутация у разных клиентов очень разная.

Кого мы не рекомендуем

Без названий, но по признакам — есть провайдеры, с которыми лучше не связываться. Это те, кто не отвечает на abuse-репорты в течение 72 часов. Кто до сих пор не поддерживает IPv6 — в 2026-то году. У кого есть публично задокументированные случаи длительного простоя без каких-либо компенсаций. Ну и те, кто берёт предоплату на год вперёд без возврата. В реестре RIPE таких десятки.

Цифры проекта и история одного писка в 4 утра

После того инцидента мы полностью пересобрали защиту — ровно за две рабочие недели. Теперь про деньги. Инженерные работы: 96 000 ₽ за 28 часов — проектирование, миграция, настройка, тесты. Ежемесячно: новый хостинг плюс Cloudflare Pro — 4 600 ₽, сопровождение и мониторинг — ещё 6 000 ₽. Мы сравнивали с альтернативой — корпоративный антиDDoS у Stack-Group стоит 18–25 тысяч в месяц. Клиника такой бюджет бы не потянула. Наша схема через CDN + VDS вышла в 4 раза дешевле.

Примерно через месяц после внедрения случился момент, который я запомнил надолго. 4:12 утра. Telegram-канал мониторинга выдаёт алерт: «ClinicDown». Хватаю ноутбук, захожу через VPN в Selectel — сайт работает. Начинаю разбираться. Недоступность была, но только с проверки из Нидерландов, и длилась 90 секунд. В 4:10 у Selectel сбой на одном коммутаторе — восстановление за 92 секунды. Реальных пользователей ночью было 2–3 человека, они просто увидели «попробуйте через минуту». А у меня уже через 5 минут после начала инцидента был чёткий план действий — алерт сработал именно так, как мы задумывали. С тех пор я доверяю Selectel больше: они не прячут мелкие сбои, а инфраструктура восстанавливается без потери данных. Для нас это не просто приятный факт — это критерий выбора.

FAQ: что чаще всего спрашивают клиенты

Какой хостинг сейчас выбирать в России для бизнес-сайта?

По нашему опыту за 2024–2026 годы: для критически важных сервисов — Я.Облако, VK Cloud, Selectel, Cloud.ru. Стабильная сеть, встроенная DDoS-защита, адекватная техподдержка. Шаред-хостинги — Reg.Ru, Beget, FirstVDS — нормально закрывают лендинги и небольшие корпоративные сайты. Для серьёзных бизнес-приложений — нет, не вариант. DDoS-Guard и Stack-Group — это отдельная история, под очень специфические задачи.

Что делать, если на ваш сайт пошёл DDoS?

Если атака уже идёт — вот три шага. Первый: звонить хостеру. У нормальных провайдеров есть встроенный DDoS-фильтр L3–L4, который активируют по запросу. Второй: переключать трафик через CDN с защитой — Cloudflare, Selectel CDN или Я.Cloud CDN. Третий: если это L7-атака, HTTP-flood — настраивать rate-limiting на nginx и поднимать WAF, например ModSecurity с правилами OWASP CRS. На пике крупной атаки первые 15 минут решают всё. Репутация страдает быстрее, чем падает доступность сервиса.

Можно ли защититься от DDoS бесплатно?

Полностью защититься? Нет. Бесплатный Cloudflare и базовая DDoS-защита Selectel закрывают около 90% мелких атак — до 1–5 Gbps, которые школьники запускают через стрессеры. Но атаки 10+ Gbps, ботнеты IoT — это уже другой уровень, там нужна платная защита. Стоимость: от 1 500 ₽ в месяц за Cloudflare Pro до 15–30 тысяч у российских специализированных провайдеров. На нашей практике бизнесу всегда дешевле заплатить за защиту заранее, чем разгребать последствия одного успешного DDoS.

Что такое стрессер и насколько это серьёзная угроза?

Стрессер — это, по сути, розничная торговля DDoS-атаками. 200–500 ₽ за 10 минут атаки на любой IP. Клиенты — подростки, конкуренты, шантажисты. Реальная угроза: за 200 ₽ сайт ляжет на полчаса. У нас был клиент, которого пытались шантажировать так каждые три недели. Хорошая новость: CDN с фильтрацией автоматически закрывает 95% подобных атак.

Сколько стоит защитить периметр сайта клиники у вас?

Базовая защита для обычного бизнес-сайта — 2–5 страниц плюс админка — включает настройку Cloudflare с WAF-правилами, перенастройку nginx, бэкапы по схеме 3-2-1 и мониторинг. Инженер тратит 12–15 рабочих часов, стоимость — 60–75 тысяч рублей. Ежемесячно: Cloudflare Pro — 1 500 ₽, мониторинг — 6 000 ₽. Для клиники с EMR-системой цифры другие: полный комплекс с резервным каналом — 95–120 тысяч рублей на старте.

Итог

Защита периметра — это не один большой бронежилет. Это слои: правильный хостинг, CDN с WAF, бэкапы по схеме 3-2-1, постоянный мониторинг и план действий на случай атаки. Для одной московской медицинской клиники все эти вложения — 96 000 ₽ единовременно и 10 600 ₽ в месяц — окупились конкретно: клиника не заплатила шантажистам 0,008 BTC и не потеряла данные пациентов, что грозило бы отзывом лицензии. Директор этой клиники теперь повторяет коллегам одну фразу, и я с ней полностью согласен: «Безопасность всегда дешевле последствий её отсутствия. И заниматься ею должны те, кто умеет, — а не сисадмин в перерывах между поддержкой 1С».

Похожая задача в вашей компании?

Расскажите, что у вас сейчас — пришлю план работ и оценку в течение рабочего дня.

Написать в Telegram  или  +7 903 729-62-41

Семёнов Е.С., руководитель ITfresh

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для IT-руководителя и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

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

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.