fail2ban ignoreip Пример хоста DNS?
Я хотел бы добавить ".googlebot.com" в список игнорирования iplist для fail2ban, поскольку в объяснении ignore ip упоминается хост DNS в качестве принятого ввода. Это правильный формат?
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
1 ответ
Если посмотреть на скрипт Python, который использует значение "ignoreip", попытка сопоставления с подстановочным знаком для такого имени не будет работать, то это должен быть IP/ сеть или имя, которое разрешается в IP.
Если строка "googlebot.com" находится в журнале, возможно, вместо этого будет использоваться "ignoreregex"? Команда и использование перечислены здесь: http://www.fail2ban.org/wiki/index.php/Commands
В моем файле журнала есть только IP-адреса (без доменных имен), поэтому
ignoreregex
у меня не сработало.
Я опубликую здесь то, что я сделал, на случай, если это будет полезно для кого-то, пытающегося сделать что-то подобное. Это было сделано в Ubuntu 18.04 с Fail2Ban v0.10.2.
- Создайте сценарий, который принимает номер IP, выполните обратный поиск в DNS и проверьте, входит ли имя хоста в разрешенное имя домена. Поместите этот сценарий в /etc/fail2ban/filter.d/ignorecommands. Я назвал этот сценарий
ignorehost
.
#!/usr/bin/env fail2ban-python
# Inspired by apache-fakegooglebot script
#
# Written in Python to reuse built-in Python batteries and not depend on
# presence of host and cut commands
#
import sys
import re
from fail2ban.server.ipdns import DNSUtils, IPAddr
ALLOWED_HOSTS = [
".phlapa.fios.verizon.net",
".nwrknj.fios.verizon.net",
".hsd1.de.comcast.net",
".hsd1.pa.comcast.net"]
def process_args(argv):
if len(argv) != 2:
raise ValueError("Please provide a single IP as an argument. Got: %s\n"
% (argv[1:]))
ip = argv[1]
if not IPAddr(ip).isValid:
raise ValueError("Argument must be a single valid IP. Got: %s\n"
% ip)
print("Ip received!")
return ip
def is_allowed_host(ip):
host = DNSUtils.ipToName(ip)
if not host:
return False
else:
m = re.match('.\S+(-\d+)(?P<domain>\.\S+)', host)
domain = m.group('domain')
if domain in ALLOWED_HOSTS:
return True
else:
return False
if __name__ == '__main__': # pragma: no cover
try:
ret = is_allowed_host(process_args(sys.argv))
except ValueError as e:
sys.stderr.write(str(e))
sys.exit(2)
sys.exit(0 if ret else 1)
- Добавьте эту строку в нужные тюрьмы в /etc/fail2ban/jail.local:
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
В моем случае я помещаю эту строку в тюрьмы ssh и sshd:
[sshd]
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
[ssh]
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
- Перезагрузить fail2ban
systemctl reload fail2ban.service
Лучшее решение - добавить строку ignoreregex в файл конфигурации фильтра:
ignoreregex = ^<HOST> -.*"GET.*HTTP.*Googlebot/2\.1.*"$
Это будет игнорировать Googlebot. Не забудьте проверить access.log
вместо того error.log
если вы используете Apache.