Админка только по пропускам: как намертво заблокировать брутфорс WordPress через .htaccess по белому списку IP
Открываешь панель хостинга или терминал, смотришь на графики потребления ресурсов, а там процессор долбится в 100% лимита, а сервер захлебывается в пятисотых ошибках. В 9 из 10 случаев на WordPress причина банальна: ботнет нащупал стандартный адрес входа и методично перебирает связки логинов и паролей со скоростью сотни запросов в минуту.

Большинство владельцев сайтов первым делом бегут ставить плагины безопасности вроде Wordfence или Limit Login Attempts. Но здесь кроется фундаментальная архитектурная ошибка. Когда бот стучится в форму авторизации, плагин внутри CMS вынужден запустить PHP, подключиться к MySQL, подгрузить ядро WordPress со всеми хуками и только потом выдать ответ о блокировке. Если по сайту работает распределенная сеть, хостинг ляжет просто под тяжестью выполнения самого защитного скрипта.
Решать эту проблему нужно на уровень выше — веб-сервером Apache или LiteSpeed через конфигурацию файла .htaccess. Правило срубит паразитный запрос до того, как он коснется движка и создаст хоть каплю вычислительной нагрузки.
Почему под прицелом не только wp-login.php
Когда говорят о брутфорсе на WordPress, обычно имеют в виду стандартную форму входа, однако злоумышленники атакуют сразу по нескольким фронтам:
- wp-login.php — прямая точка входа в панель управления. Именно сюда летят терабайты POST-запросов со словарями паролей.
- xmlrpc.php — интерфейс для внешних публикаций и мобильных приложений, который часто забывают закрыть. Протокол XML-RPC позволяет передавать метод
system.multicall, где в одном HTTP-пакете упакованы сразу сотни попыток авторизации. Это обходит примитивные плагины-ограничители и моментально утилизирует память сервера. - Папка /wp-admin/ — служебный каталог, прямой доступ к которому с незнакомых устройств должен быть запрещен по умолчанию.
Ловушка admin-ajax.php: как не сломать сайт
Типичная ошибка начинающего вебмастера — зайти в корневую папку сайта, открыть .htaccess внутри /wp-admin/ и прописать тотальный Deny from all.
Через пять минут начинают сыпаться жалобы: корзина в интернет-магазине перестала добавлять товары, фильтры зависают, а формы обратной связи крутят бесконечный прелоадер. Дело в том, что фронтенд большинства плагинов WordPress отправляет асинхронные запросы именно через файл /wp-admin/admin-ajax.php.
Если заблокировать весь каталог целиком, внешние скрипты потеряют доступ к обработчику. Поэтому ограничение настраивается точечно в корневом файле .htaccess, изолируя только исполняемые файлы входа.
Боевой конфиг: ограничение по статическому IP
Если у вас или вашей команды есть постоянный статический IP-адрес (или пул корпоративных адресов), это лучший сценарий. Мы полностью отсекаем внешнюю сеть от панели авторизации, отдавая ботам сухой код 403 Forbidden.
Для современных серверов на базе Apache 2.4 в корневой файл .htaccess добавляется следующий блок:
Apache
<FilesMatch "^(wp-login\.php)">
Require ip 195.120.45.10
Require ip 195.120.45.11
Require ip 178.62.0.0/16
</FilesMatch>
<Files xmlrpc.php>
Require all denied
</Files>
Если хостинг работает на устаревшей версии Apache 2.2, синтаксис директив будет другим:
Apache
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 195.120.45.10
Allow from 195.120.45.11
</Files>
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Вместо 195.120.45.10 подставляются ваши реальные белые IP. Конструкция вида 178.62.0.0/16 позволяет добавить доверенную подсеть целиком, если ваш провайдер выделяет диапазон адресов.
Решения для динамического IP
Если провайдер регулярно меняет вам IP-адрес или в админку нужно заходить из дома, коворкинга и кафе, жесткая привязка по IP быстро заблокирует вас самих. В этой ситуации есть два надежных инженерных пути:
- Подключение через собственный VPN со статикой. Поднимите дешевый VPS за пару сотен рублей с фиксированным IP-адресом и заведите туда рабочий WireGuard или VLESS. Вы прописываете IP своего сервера в
.htaccessи получаете закрытый зашифрованный туннель для доступа ко всей инфраструктуре. - Двойная HTTP-аутентификация (Basic Auth). Перед тем как веб-сервер вообще покажет страницу
wp-login.php, браузер выбросит стандартное всплывающее окно с требованием ввести базовый логин и пароль файла.htpasswd. Автоматизированные скрипты брутфорса не умеют проходить базовую авторизацию веб-сервера и отваливаются на первой же секунде.
Контрольная проверка перед заливкой на прод
Любая опечатка или неподдерживаемая модулем директива в .htaccess моментально ломает сайт с ошибкой 500 Internal Server Error.
- Всегда держите открытую сессию по FTP или SSH перед сохранением файла, чтобы быстро откатить правки.
- Уточните у техподдержки хостинга точную версию Apache, чтобы не смешивать синтаксис директив
Require(2.4) иOrder/Allow/Deny(2.2). - Проверяйте доступность после настройки в режиме инкогнито и с мобильного интернета, чтобы убедиться, что сервер корректно отдает 403 ошибку посторонним, но пропускает ваши рабочие IP.
