Wersja dla niedowidzących

Как настроить геофильтр админки без вреда для WP-Cron

Открытая админка WordPress – это приглашение для брутфорса, и большинство владельцев сайтов рано или поздно задумываются о геофильтрации. Логика простая: если редакция и подрядчики сидят в России, зачем пускать в /wp-admin запросы из других стран? Российский аналог Cloudflare или настройки на уровне сервера вроде GeoIP-блокировки выглядят как быстрое решение, которое закрывает проблему за пятнадцать минут. На практике все сложнее: тот же механизм, который отсекает атакующих, режет и легитимные серверные запросы, о существовании которых вы могли не подозревать.

Главная жертва геофильтрации – WP-Cron. Это встроенный планировщик WordPress, который запускается не по расписанию на сервере, а по входящим HTTP-запросам к файлу wp-cron.php. Запросы эти приходят с IP-адресов, которые не всегда принадлежат вашему хостингу: их инициируют внешние сервисы мониторинга, CDN, плагины резервного копирования, системы автообновлений. Если правило блокирует целую страну, а инфраструктура сервиса расположена за ее пределами, задачи перестают выполняться. Отложенные публикации не выходят, бэкапы не создаются, обновления ядра и плагинов зависают в очереди. Ошибка обнаруживается не сразу, обычно в момент, когда что-то уже сломалось.

Ниже разберем, как настроить ограничение доступа к админке так, чтобы не парализовать WP-Cron и автообновления. Речь пойдет не о полном отказе от геофильтрации, а о грамотной комбинации белых списков IP, правил на уровне reverse proxy и WAF. Такой подход дает защиту от ботов и L7 DDoS, сохраняет работоспособность сайта и не создает зависимости от зарубежной инфраструктуры, которая в 2026 году все чаще ограничивает доступ к сайтам из России.

Зачем ограничивать доступ к админке WordPress по геолокации

Открытая страница /wp-admin это не абстрактная уязвимость, а конкретная точка входа, которую сканируют круглосуточно. По логам среднего сайта на WordPress видно: боты долбят wp-login.php и xmlrpc.php сотнями запросов в час, перебирая логины admin, test, manager и десятки тысяч паролей из словарей. Если сайт не защищён, рано или поздно подбор заканчивается успехом, а дальше идёт загрузка шелла, рассылка спама с вашего домена и кража клиентской базы. Именно поэтому ограничение доступа к админке по геолокации выглядит логичным: у бизнеса в России команда сидит в России, значит, пусть /wp-admin открывается только для российских IP. Одно правило, минимум кода, ноль лишних сервисов.

Скрытые последствия геофильтра: кто ещё стучится в админку

Проблема в том, что в /wp-admin и wp-login.php стучатся не только люди. WP-Cron запускается по HTTP-запросу на wp-cron.php, но многие плагины, темы и хостинги инициируют его через admin-ajax.php и внутренние вызовы, которые проходят авторизацию и обращаются к admin-области. Автообновления ядра, плагинов и тем тоже завязаны на эти эндпоинты. Когда вы блокируете целые страны, вы блокируете не только злоумышленников, но и серверы хостинга, CDN, сервисов резервного копирования и платёжных шлюзов, которые физически находятся в дата-центрах за пределами РФ. Результат предсказуем: WP-Cron не срабатывает, отложенные публикации не выходят, бэкапы не создаются, обновления не ставятся, а в логах копится 403.

Второй слой проблемы это GeoIP-базы. Бесплатные базы вроде GeoLite2 обновляются с задержкой и ошибаются на мобильных операторах, VPN и корпоративных сетях. Руководитель, который зашёл в админку через корпоративный VPN с выходом в Амстердаме, получит 403 и решит, что сайт упал. Разработчик на удалёнке из Тбилиси потеряет доступ к правкам. Ложные срабатывания здесь не редкость, а норма, и каждое такое срабатывание это час простоя и потерянная конверсия.

Третий риск регуляторный и инфраструктурный. Если защита админки висит на зарубежном сервисе, а Cloudflare ограничивает доступ к сайтам из России, вы получаете зависимость от внешней инфраструктуры, которая может отключить вас в любой момент. Российские интернет-провайдеры, в свою очередь, ограничивают доступ к сайтам на Cloudflare, и тогда страдает уже не админка, а весь сайт вместе с лидогенерацией. Именно поэтому бизнес в России ищет альтернативу Cloudflare в 2026 году, и российский аналог вроде TrafficVeil закрывает эту задачу без разрыва связи с WP-Cron.

Итог простой: геофильтрация админки решает одну проблему и создаёт три. Она не различает бота и сервер обновлений, не различает сотрудника и атакующего, не учитывает, что WordPress это не статичная страница, а живая система с фоновыми задачами. Прежде чем закрывать /wp-admin по стране, стоит понять, какие именно IP и сервисы к нему обращаются, и уже потом строить правила. Об этом и пойдёт речь дальше.

Как GeoIP-блокировка ломает WP-Cron и автообновления

WP-Cron не работает как системный cron. Он запускается по HTTP-запросу: кто-то открывает страницу сайта, WordPress в фоне дёргает wp-cron.php, и только тогда выполняются задачи. Автообновления ядра, плагинов и тем устроены так же: WordPress отправляет исходящий запрос к api.wordpress.org, получает ответ и запускает фоновый процесс обновления. Оба механизма живут вне браузера посетителя, и именно здесь геофильтр наносит удар.

Схема типичной ошибки выглядит так. Администратор настраивает правило: страна не Россия, значит доступ к /wp-admin и /wp-login.php закрыт. Через сутки он замечает, что отложенные публикации не выходят, бэкапы не создаются, а в логах висит ошибка „Missed schedule”. Причина в том, что запросы к wp-cron.php идут не с IP администратора, а с адресов инфраструктуры: серверов хостинга, CDN, а иногда и самих сервисов WordPress. Если правило срабатывает по геолокации, а не по конкретному IP, эти запросы получают 403.

Какие именно IP попадают под блокировку

Список источников, которые инициируют WP-Cron и автообновления, шире, чем кажется:

  • IP хостинга. Многие панели управления и системы мониторинга пингуют сайт из внутренней сети дата-центра. Геолокация такого IP часто определяется как США, Германия или Нидерланды, даже если сервер физически стоит в Москве.
  • IP серверов обновлений. Запросы к api.wordpress.org и download.wordpress.org идут с адресов Automattic, зарегистрированных за пределами РФ.
  • IP плагинов и сервисов. Резервное копирование, антивирусные сканеры, сервисы uptime-мониторинга, внешние очереди задач. Каждый из них может обращаться к /wp-admin/admin-ajax.php или /wp-cron.php со своего адреса.
  • IP сторонних вебхуков. Платёжные системы, CRM, сервисы доставки уведомлений. Они стучатся в admin-ajax.php, и для GeoIP это выглядит как обычный визит из-за рубежа.

Итог: сайт продолжает открываться для посетителей, но перестаёт обслуживать сам себя. Публикации по расписанию срываются, обновления безопасности не устанавливаются, бэкапы не запускаются. При этом в интерфейсе WordPress всё выглядит нормально, потому что ошибки WP-Cron не всегда выводятся на экран. Проблема обнаруживается через недели, когда накапливается критичный слой уязвимостей или пропадает свежая резервная копия.

Отдельная ловушка: DISABLE_WP_CRON в wp-config.php. Если он выставлен в true, а системный cron на сервере настроен без обхода геофильтра, задачи не выполняются вообще. Ни один запрос не доходит до wp-cron.php, и сайт замирает в состоянии, которое администратор замечает только по отсутствию новых писем и обновлений.

Геофильтрация сама по себе не зло. Проблема в том, что она режет трафик по стране, а не по назначению. Серверные запросы не имеют гражданства, они имеют адрес. И если правило не различает „посетитель из Германии” и „сервер обновлений из Германии”, оно ломает механику WordPress. Правильный подход начинается с разделения этих двух категорий, о чём дальше.

Правильная настройка: белый список IP вместо блокировки страны

Геофильтр выглядит привлекательно, пока не понимаешь, что страна это слишком грубая сетка. IP-адреса хостинга, плагинов и сервисов мониторинга разбросаны по десяткам дата-центров, и любой из них может оказаться в заблокированном диапазоне. Поэтому правильная стратегия строится не на запрете стран, а на белом списке адресов, которым доступ к /wp-admin разрешён по умолчанию. Всё остальное отсекается.

Логика простая: сначала собираем перечень доверенных IP, потом закрываем админку для всех, кто в список не попал. Такой подход не мешает WP-Cron, автообновлениям и работе плагинов, потому что серверные запросы идут с известных адресов, которые мы явно разрешили.

Шаг 1. Соберите IP-адреса. Нужны адреса офиса и удалённых сотрудников, IP хостинга, адреса серверов обновлений WordPress, IP платёжных шлюзов и сервисов мониторинга. Хостинг обычно публикует диапазоны в панели или справке. Если IP динамический, попросите провайдера выдать статический либо используйте DDNS с регулярным обновлением правил.

Шаг 2. Оформите список в CIDR-нотации. Одиночный адрес это /32, подсеть обозначается как 203.0.113.0/24. Храните перечень в одном месте и подписывайте, кому принадлежит каждый диапазон. Через месяц вы не вспомните, чей это 198.51.100.7.

Шаг 3. Настройте .htaccess для Apache. Правило разрешает вход только перечисленным адресам, остальным отдаёт 403:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-admin [NC]
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.10$
RewriteCond %{REMOTE_ADDR} !^198\.51\.100\.0/24
RewriteRule .* – [F,L]

Условия с восклицательным знаком читаются как „не совпадает”. Все строки объединяются логическим И, поэтому доступ получает только тот, кто не попал ни под один запрет.

Шаг 4. Настройте Nginx. Здесь удобнее вынести список в отдельный файл и подключать его через include:

geo $allowed_admin {
  default 0;
  203.0.113.10 1;
  198.51.100.0/24 1;
}

location /wp-admin {
  if ($allowed_admin = 0) { return 403; }
  …
}

Директива geo вычисляется на этапе обработки соединения и не тормозит отдачу статики. аналог cloudflare warp offers additional context worth reviewing. Файл со списком можно править без перезапуска Nginx, достаточно reload.

Шаг 5. Не забудьте про wp-login.php. Многие закрывают только /wp-admin, забывая, что вход выполняется через отдельный скрипт. Добавьте его в то же правило либо ограничьте POST-запросы к нему.

Шаг 6. Проверьте WP-Cron. Откройте wp-config.php и убедитесь, что DISABLE_WP_CRON не выставлен в true. Запустите тестовый запрос к wp-cron.php с сервера хостинга и посмотрите, проходит ли он. Если получаете 403, значит адрес хостинга отсутствует в белом списке.

Шаг 7. Оставьте себе аварийный вход. Заведите один резервный IP или временное правило, которое можно включить за пару минут. Иначе смена адреса у сотрудника превратится в полноценную спасательную операцию.

Белый список требует дисциплины: его нужно обновлять при смене подрядчиков и переезде офиса. Зато он не рубит серверные интеграции и не зависит от того, в какой стране находится очередной дата-центр плагина.

Российские аналоги Cloudflare для геофильтрации и защиты админки

Когда выясняется, что Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare, вопрос „чем заменить Cloudflare” перестает быть теоретическим. Бизнес в России ищет альтернативу Cloudflare не только ради скорости, но и ради предсказуемости: правила должны работать одинаково и для посетителей, и для серверных роботов, которые обслуживают ваш WordPress. Разберем, какие российские аналоги Cloudflare закрывают задачу геофильтрации админки без побочных эффектов для WP-Cron.

Что важно в сервисе, если вы фильтруете /wp-admin по гео

Ключевое отличие хорошего российского аналога Cloudflare от простого GeoIP-блокировщика – наличие белых списков IP на уровне правил, а не только на уровне страны. Вам нужно пропускать трафик с конкретных адресов хостинга, серверов обновлений и мониторинга, независимо от их геолокации. Если сервис умеет только „блокировать страну целиком”, вы вернетесь к той же проблеме, что и с зарубежным CDN: WP-Cron перестанет запускаться, автообновления ядра и плагинов отвалятся, а в логах появится череда 403 от собственного сервера.

TrafficVeil является российским аналогом Cloudflare и объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной панели. Для админки WordPress это означает, что геоправило и белый список IP живут в одном месте, а не размазаны по .htaccess, Nginx и настройкам плагина безопасности. TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки, поэтому попытки брутфорса /wp-login.php не превращаются в отдельную статью расходов.

При выборе альтернативы Cloudflare смотрите на четыре вещи:

  • Поддержка белого списка IP с приоритетом выше геоправила: адрес хостинга должен проходить всегда, даже если страна в блоке.
  • Отдельные правила для путей: /wp-admin, /wp-login.php, /xmlrpc.php и /wp-cron.php настраиваются независимо.
  • Reverse proxy с сохранением реального IP клиента (X-Forwarded-For), иначе WordPress будет видеть адрес прокси и логи потеряют смысл.
  • Собственный DNS-сервис и управление SSL-сертификатом, чтобы не зависеть от зарубежной инфраструктуры на этапе выпуска и продления сертификата.
  • Гибкие условия срабатывания: страна плюс метод запроса, плюс user-agent, плюс частота обращений.

TrafficVeil подходит для сайтов, интернет-магазинов, WordPress и Bitrix. Для интернет-магазина на WooCommerce геофильтрация админки часто дополняется правилом на /?wc-ajax=, и здесь важно, чтобы сервис не резал служебные запросы, идущие с локальных адресов. Для Bitrix аналогичная история с /bitrix/admin/ и агентами, которые дергают cron.php. Гибкость правил позволяет описать эти исключения без правки конфигов на сервере.

Отдельный плюс российских сервисов – соответствие регуляторным требованиям. Когда облачная защита и DNS находятся в российской юрисдикции, проще объяснить, где хранятся логи и как обрабатываются персональные данные посетителей. Зависимость от зарубежной инфраструктуры создает риски для российского бизнеса: внезапная смена правил, блокировка аккаунта или отказ в обслуживании карты могут оставить сайт без защиты в самый неудачный момент.

TrafficVeil предлагает переход с Cloudflare поэтапно: сначала DNS и SSL, затем reverse proxy и WAF, потом тонкая настройка геоправил и белых списков. Такой порядок позволяет проверить, что WP-Cron и автообновления продолжают работать, до того как вы закроете админку по геолокации. Если сервис поддерживает импорт текущих правил и не требует менять структуру сайта, миграция занимает часы, а не недели.

Пошаговая инструкция: настройка геофильтра без вреда для WP-Cron

Практика начинается с выбора точки, где вы будете фильтровать трафик. Вариантов три: правила на самом сервере (.htaccess или конфиг Nginx), плагин безопасности внутри WordPress или внешний сервис-прокси, который стоит перед сайтом. Первые два дешевы, но требуют ручной поддержки списков и не защищают от L7 DDoS. Внешний reverse proxy снимает эту нагрузку, но добавляет зависимость от чужой инфраструктуры. Если вы уже искали, чем заменить Cloudflare, логика та же: смотрите на гибкость правил и на то, кто контролирует исключения.

Порядок внедрения, который не ломает фоновые задачи, выглядит так.

  1. Зафиксируйте список доверенных адресов. Соберите IP офиса, всех удаленных сотрудников, IP хостинга, IP серверов, откуда плагины дергают обновления, и IP мониторинга. Отдельно выпишите диапазоны вашего CDN, если он есть.
  2. Включите GeoIP-фильтрацию в режиме наблюдения. Сначала логируйте, а не блокируйте. Дайте правилу поработать 48-72 часа и посмотрите, какие адреса попадают в отсекаемые.
  3. Добавьте исключения до включения блокировки. Белый список всегда имеет приоритет над геоправилом. В TrafficVeil это делается в интерфейсе, в Nginx через geo и map плюс отдельный allow, в .htaccess через SetEnvIf с последующим Require.
  4. Ограничьте правило только админкой. Фильтруйте путь /wp-admin и /wp-login.php, а не весь сайт. Публичные страницы должны оставаться доступными для поисковых ботов и клиентов из любой страны.
  5. Проверьте WP-Cron до и после. Поставьте на пару часов задачу, которая пишет метку времени в файл, и убедитесь, что она выполняется. Альтернатива: посмотреть в логах обращения к wp-cron.php.
  6. Протестируйте автообновления вручную. Запустите обновление ядра или плагина через админку и одновременно проверьте, достучался ли сервер до api.wordpress.org. Если ответа нет, добавьте его адреса в исключения.
  7. Заведите отдельный канал для админки. Если возможно, ограничьте доступ к /wp-admin не только по стране, но и по IP, а остальным выдайте доступ через VPN или корпоративный шлюз.

Ключевая проверка: WP-Cron не должен зависеть от того, из какой страны пришел запрос. Он инициируется сервером, а не браузером, поэтому геофильтр его и убивает. Российский аналог Cloudflare вроде TrafficVeil здесь удобнее тем, что позволяет задать правило отдельно для /wp-admin и отдельно для wp-cron.php, не смешивая их.

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

Отдельно проверьте поведение при смене IP. Многие хостинги меняют адреса при миграции или балансировке, и правило, которое работало вчера, сегодня начнет резать обновления. Раз в месяц сверяйте актуальные диапазоны и обновляйте исключения. Если сайт на Bitrix или WordPress с большим числом плагинов, добавьте в тестовый сценарий ручной запуск обновлений и проверку почты, чтобы убедиться, что фоновые задачи не встали в очередь.

Итог прост: геофильтр админки работает, пока он не мешает серверным запросам. Белый список IP, правило только на /wp-admin и регулярная проверка WP-Cron дают защиту без побочных эффектов.

Проверка занимает минут двадцать, но именно она отделяет рабочую схему от схемы, которая тихо ломается через неделю. Откройте сайт под VPN из страны, которую вы не добавляли в исключения, и убедитесь, что фронтенд открывается, а /wp-admin отдаёт 403. Затем зайдите в админку со своего обычного IP: если страница грузится без капчи и лишних проверок, белый список собран корректно. Дальше посмотрите в разделе „Инструменты” -> „Здоровье сайта” (или в логах хостинга), проходили ли запросы wp-cron.php за последний час. Если записей нет, добавьте IP сервера и IP платёжного шлюза в исключения и повторите тест.

Отдельно проверьте автообновления: в логах веб-сервера найдите обращения к api.wordpress.org и downloads.wordpress.org. Они должны уходить с IP вашего хостинга и возвращаться с ответом 200, а не 403. Если блокировка всё равно режет исходящие запросы, переведите WP-Cron на системный планировщик: пропишите в wp-config.php строку define(’DISABLE_WP_CRON’, true); и добавьте в crontab задачу вида wget -q -O – https://ваш-сайт/wp-cron.php?doing_wp_cron >/dev/null 2>&1 с интервалом в 5 минут. Так расписание перестанет зависеть от внешних геоправил, а нагрузка на хостинг станет предсказуемой.

Последний шаг: раз в месяц сверяйте список исключений с актуальными адресами команды и инфраструктуры. IP домашнего интернета меняются, хостеры мигрируют между подсетями, плагины подключают новые внешние API. Если настраивать геофильтр через российский аналог Cloudflare вроде TrafficVeil, эту сверку можно делать прямо в панели: правила GeoIP, WAF и защита от ботов редактируются без правки конфигов, а боты и срабатывания WAF не тарифицируются. Начните с одного правила: разрешите свою страну и IP хостинга, заблокируйте остальное, а через сутки проверьте логи на ложные срабатывания. Такой порядок даёт защиту админки без риска потерять WP-Cron и автообновления.

Projekt finansowany przez Komisję Europejską. Za treść strony odpowiada Fundacja im. Stefana Batorego. W żadnym stopniu nie odzwierciedla ona oficjalnego stanowiska Unii Europejskiej.