Назад | Перейти на главную страницу

Fail2Ban - как предотвратить блокировку динамического IP-адреса моего интернет-провайдера?

Я только что установил Fail2Ban.

Я хочу добавить свой IP-адрес провайдера в свой список игнорирования, но мой IP-адрес динамический.

В файле jail.conf у меня вот такое:

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1
bantime  = 600
maxretry = 3

Мой DNS выглядит примерно так: 12-123-112-223.zone6.myISPName.co.uk

Можно ли добавить DNS wild в список игнорирования? например, *.myISPName.co.uk

fail2ban не позволяет использовать адреса с подстановочными знаками.
У вас есть несколько возможностей:
1. используйте динамический DNS для адреса, который вы хотите исключить
2. напишите правило принятия для iptable, выполняемое до правил fail2ban.
3. просто настройте fail2ban

Как настроить fail2ban на игнорирование вашего адреса?
Внутри /etc/fail2ban/filter.d/ у вас есть готовые фильтры. В ваших правилах уже используется одно из них (например, с filter = sshd используйте фильтр sshd).
Просто измените фильтры, которые вы хотите (или измените копию), чтобы добавить правило «исключения».
Правила исключения начинаются с ignoreregex. Они написаны в точности как правила «матча». Посмотри на man fail2ban-regex.
Для вашего примера вы можете просто добавить ignoreregex .myISPName.co.uk в желаемом фильтре.
Но это также защитит любого злоумышленника от того же провайдера.

В моем файле журнала есть только IP-адреса (без доменных имен), поэтому ignoreregex у меня не сработало.

Я опубликую здесь то, что я сделал, на случай, если это будет полезно для кого-то, пытающегося сделать что-то подобное. Это было сделано в Ubuntu 18.04 с Fail2Ban v0.10.2.

  1. Создайте сценарий, который принимает номер 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)
  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>
  1. Перезагрузить fail2ban

systemctl reload fail2ban.service

создать простой скрипт в / usr / local / bin / userip

#!/bin/sh
if [ ! -z $1 ]; then
    who --ips | grep ^$1 | rev | cut -d' ' -f1 | rev | tail -n1
fi

Это получить IP-адрес зарегистрированного имени пользователя, переданного в первом аргументе

Отредактируйте /etc/fail2ban/action.d/iptables-multiport.conf (или iptables.conf)

actionban = [ ''$(userip YOURUSER) != '<ip>' ] && iptables -I fail2ban-<name> 1 -s <ip> -j DROP

теперь fail2ban не блокирует ваш IP-адрес, пока вы не войдете в систему со своим именем пользователя ВАШ ПОЛЬЗОВАТЕЛЬ с помощью ssh