Я использую fail2ban для обнаружения злонамеренных запросов к любому из моих размещенных доменов, который работает очень хорошо, за одним исключением.
Если запрос отправляется на IP вместо fqdn или субдомена, он перехватывается и записывается в 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?
apache выполняет обратный поиск IP-адреса и сначала записывает имя хоста.
Если ваш фильтр сделан правильно (например, привязанное регулярное выражение без универсальных), не имеет значения, где именно записаны домен и внешний адрес.
Я предполагаю, что в вашем примере записи журнала somedomain.de
твой и 20.37.96.167
это адрес «злоумышленника». Тогда правильный 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
и будет искать в строке с begin только из-за привязки ^
.
Этого также будет достаточно в качестве регулярного выражения, если вам нужно запретить все из 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>