У меня было много атак на мой сервер. Большинство из них начинают со сканирования уязвимостей, за которым следуют волны запросов POST.
Я скоро буду внедрять Cloudflare (WAF и DDos). Это означает, что поиск DNS в моем домене покажет IP-адрес Cloudflare, а не моего сервера. В связи с этим IP-адрес моего сервера будет скрыт.
Тем не менее, атаки по-прежнему могут происходить, проходя по очереди через все возможные IP-адреса в мире. Когда я смотрю журналы своего сервера, я вижу, что это происходит МНОГОЕ. (У меня 3 IP-адреса, привязанных к моему 1 серверу, и такие же атаки происходят на XXX.XXX.XXX.XX1, затем на XXX.XXX.XXX.XX2, затем на XXX.XXX.XXX.XX3)
Мой .htaccess верхнего уровня выглядит так:
# deny all POST requests
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteRule .* - [F,L]
</IfModule>
# deny unused request types
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} ^(delete|head|trace|track) [NC]
RewriteRule .* - [F,L]
</IfModule>
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Вопросы:
Что я должен добавить, чтобы [если HTTP_HOST = XXX.XXX.XXX.XX1 OR HTTP_HOST = XXX.XXX.XXX.XX2 OR HTTP_HOST = XXX.XXX.XXX.XX3] то трафик сразу блокируется?
Могу ли я поместить этот новый код в начало файла .htaccess? Это сломает то, что сейчас там?
Вам не нужно проверять Host
заголовок для определенных IP-адресов, просто проверьте любые Host
который начинается с цифры. Например, в верхней части .htaccess
файл:
RewriteCond %{HTTP_HOST} ^\d
RewriteRule .* - [F]
Вам не нужен L
флаг с F
- подразумевается.
Вам также не нужны дополнительные <IfModule mod_rewrite.c>
обертки. Просто оставьте WordPress как есть. (Хотя это тоже не обязательно.)
Однако в идеале такие блоки должны выполняться на уровне сервера / vitualhost, а не в .htaccess
. Настроить по умолчанию <VirtualHost>
который перехватывает эти нежелательные IP-запросы.
Например, предполагая, что вы используете только VirtualHosts на основе имен, вы можете настроить дефолт VirtualHost (что должен происходит перед всеми другими VirtualHosts) в форме:
# Catch all other requests for non-specific hosts. eg IP address access
<VirtualHost _default_>
ServerName default.example.com
<Location />
Require all denied
</Location>
</VirtualHost>
Это перехватывает все запросы, которые не сопоставляются ни с каким другим виртуальным хостом с именем. _default_
это просто псевдоним для *
. Как отмечалось выше, это <VirtualHost>
контейнер должен происходит раньше всех <VirtualHost>
контейнеры в конфигурации вашего сервера. Тот факт, что это определено первый это то, что делает его "по умолчанию".
В ServerName
директива должна быть определена как что-либо иное, кроме реального название сервера в вашей системе. Его можно не указывать, но сервер будет пытаться только его вычислить, что может оказаться ненадежным.
Это предотвращает ваши фактические виртуальные хосты (которые обслуживают ваш веб-сайт) от необходимости иметь дело с этими Другой Запросы.
# deny all POST requests
Это кажется немного экстремальным! Я удивлен, что ваш сайт все еще работает?