IPcost

Как заблокировать IP с помощью .htaccess?

Nicolas Nicolas,


Файл .htaccess — один из самых мощных инструментов для администраторов веб-сайтов на серверах Apache. Он позволяет точно контролировать доступ к сайту без изменения основной конфигурации сервера. Среди наиболее распространённых применений: блокировка нежелательных IP-адресов — вредоносных ботов, скраперов, злоумышленников или просто посетителей, которых вы хотите ограничить. Вот все доступные методы — от простейшего до самого продвинутого.

Предварительные требования: включение mod_authz_host

Директивы контроля доступа по IP в .htaccess требуют включения модуля Apache mod_authz_host на вашем сервере. По умолчанию это так на практически всех средах общего хостинга и современных серверах Apache. Если вы управляете собственным сервером, проверьте командой:

apache2ctl -M | grep authz

Также обратите внимание, что синтаксис немного отличается между Apache 2.2 и Apache 2.4 (текущей версией). Оба синтаксиса показаны ниже.

Блокировка одного IP

Это наиболее простой случай. Добавьте эти строки в файл .htaccess в корне вашего сайта:

Apache 2.4 (текущий синтаксис):

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0
</RequireAll>

Apache 2.2 (устаревший синтаксис):

Order Allow,Deny
Allow from all
Deny from 123.456.789.0

Замените 123.456.789.0 на IP-адрес, который хотите заблокировать. Посетитель получит ошибку 403 Forbidden.

Блокировка нескольких IP одновременно

Вы можете добавить столько адресов, сколько нужно, перечислив их в одной строке или в отдельных строках:

Apache 2.4:

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0
  Require not ip 98.76.54.32
  Require not ip 11.22.33.44
</RequireAll>

Apache 2.2:

Order Allow,Deny
Allow from all
Deny from 123.456.789.0 98.76.54.32 11.22.33.44

Блокировка диапазона IP (подсети)

Если нужно заблокировать целый блок адресов — например все IP интернет-провайдера или дата-центра — можно использовать нотацию CIDR или префикс подсети:

По префиксу (все IP, начинающиеся с 123.456.789):

<RequireAll>
  Require all granted
  Require not ip 123.456.789
</RequireAll>

По нотации CIDR (блок /24, то есть 256 адресов):

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0/24
</RequireAll>

Другие распространённые примеры масок:

  • /32 — один IP
  • /24 — 256 адресов (напр., от 123.456.789.0 до 123.456.789.255)
  • /16 — 65 536 адресов (напр., от 123.456.0.0 до 123.456.255.255)
  • /8 — 16 миллионов адресов (напр., от 123.0.0.0 до 123.255.255.255)

Блокировка IP в конкретном каталоге

Если нужно заблокировать доступ IP только к подкаталогу сайта (например к административной панели), поместите файл .htaccess в этот конкретный каталог с правилом блокировки:

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0
</RequireAll>
Полезно знать: можно также использовать блоки <Directory>, <Files> или <Location> непосредственно в файле httpd.conf или apache2.conf для ещё более точного контроля — например, блокируя IP только для конкретного файла. Этот подход эффективнее .htaccess, поскольку не требует, чтобы Apache читал файл при каждом запросе.

Белый список: разрешение только определённых IP

Обратная операция также возможна: разрешить доступ только одному или нескольким конкретным IP и блокировать всё остальное. Это особенно полезно для защиты административного интерфейса:

Apache 2.4:

Require ip 123.456.789.0
Require ip 98.76.54.32

Apache 2.2:

Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from 98.76.54.32

Любой IP не из списка получит ошибку 403. Обратите внимание, что если ваш IP динамический (меняется при каждом подключении), этот подход может заблокировать вас самих — в этом случае предпочтите белый список по диапазону подсети.

Перенаправление заблокированного IP вместо возврата 403

Вместо отображения грубой ошибки 403 можно перенаправлять заблокированные IP на другую страницу — страницу пользовательской ошибки или даже другой URL:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^123.456.789.0$
RewriteRule ^ /dostup-zapreshchen.html [R=302,L]

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

Блокировка по User-Agent вместо IP

Некоторые вредоносные боты или скраперы регулярно меняют IP, но сохраняют тот же User-Agent. В этом случае блокировка по User-Agent более эффективна:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(BadBot|EvilScraper|MaliciousSpider) [NC]
RewriteRule .* - [F,L]

Флаг [F] возвращает ошибку 403, [NC] делает сравнение нечувствительным к регистру. Можно добавить столько User-Agent, сколько нужно, разделяя их символом |.

Случай использованияРекомендуемый методКлючевой синтаксис
Блокировка одного IPRequire not ipRequire not ip 1.2.3.4
Блокировка нескольких IPRequire not ip (несколько)Require not ip 1.2.3.4 (повторяется)
Блокировка диапазона /24Нотация CIDRRequire not ip 1.2.3.0/24
Белый список конкретных IPБелый списокRequire ip 1.2.3.4
Перенаправление вместо блокировкиRewriteRuleRewriteCond %{REMOTE_ADDR}
Блокировка по User-AgentRewriteRule + HTTP_USER_AGENTRewriteCond %{HTTP_USER_AGENT}
Полезно знать: изменения в файле .htaccess вступают в силу немедленно в Apache, без перезапуска сервера. Однако неправильно сформированный файл .htaccess может сделать ваш сайт полностью недоступным с ошибкой 500. Всегда тестируйте изменения в среде разработки или делайте резервную копию оригинального файла перед любыми изменениями в production. Если сайт возвращает ошибку 500 после изменения, немедленно восстановите предыдущую версию файла.