Я только что установил 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.
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)
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
В моем случае я помещаю эту строку в тюрьмы ssh и sshd:
[sshd]
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
[ssh]
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
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