Я использую fail2ban для обнаружения вредоносных запросов ко всем моим размещенным доменам, и этот сервис работает очень хорошо, за одним исключением.
Если запрос отправляется на IP-адрес вместо полного доменного имени или поддомена, он перехватывается и записывается в other_vhosts_access.log, поскольку сам IP-адрес не является виртуальным хостом.
Пример записи:
somedomain.de:80 20.37.96.167 - - [24/янв./2020:15:47:04 +0100] "POST //4walls/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 301 587 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/79.0.3945.88 Safari/537.36"
Похоже, Apache выполняет обратный поиск по IP-адресу и записывает имя хоста в первую очередь.
Это приводит к тому, что fail2ban самостоятельно банит IP-адрес сервера, а не IP-адрес запрашивающего.
Как я могу предотвратить запись somedomain.de:80?
решение1
Apache выполняет обратный поиск по IP-адресу и записывает имя хоста в первую очередь.
Если ваш фильтр создан правильно (например, закрепленное регулярное выражение без универсальных запросов), то не имеет значения, где именно прописаны домен и внешний адрес.
Я предполагаю, что в вашем примере записи журнала, somedomain.de
это ваш адрес и 20.37.96.167
это адрес "intruder". Тогда правильное failregex будет выглядеть так:
# ban everything (with code 300-599):
failregex = ^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+
Прикрепленная часть ^\S+\s+<ADDR>
совпадает somedomain.de:80 20.37.96.167
и будет искать в строке от начала только из-за привязки ^
.
Этого также будет достаточно в качестве регулярного выражения, если вам нужно запретить все other_vhosts_access.log
(независимо от результирующего http-статуса).
Если у вас fail2ban версии <= 0.9, используйте <HOST>
вместо <ADDR>
.
Вы также можете проверить, fail2ban-regex
фиксирует ли он некоторые ложные срабатывания, например:
fail2ban-regex --raw -vv /path/to/log '^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+' \
| grep <your-IP-or-hostname>