我在 fail2ban 中使用自定义过滤器来搜索其自己的日志,并在常规过滤器禁止 5 次后禁止 IP。我将其用作iptables-allports
此操作。所有其他过滤器都配置为iptables-multiport
。
这是具体配置jail.conf
[fail2ban]
enabled = true
filter = fail2ban
action = iptables-allports[name=fail2ban]
logpath = /var/log/fail2ban.log
maxretry = 5
findtime = 604800
bantime = 2592000
我的过滤器fail2ban.conf
看起来像这样(删除了多余的评论)
[Definition]
# Count all bans in the logfile
failregex = fail2ban.actions: WARNING \[(.*)\] Ban <HOST>
# Ignore our own bans, to keep our counts exact.
ignoreregex = fail2ban.actions: WARNING \[fail2ban\] Ban <HOST>
iptables-allports.conf
是 Ubuntu 12.04.2 中 fail2ban 0.8.6-3 的默认版本
问题是,每当某个 IP 被常规过滤器(例如 sshd)禁止时,该 IP 将被禁止 10 分钟。但是当同一地址被禁止第五次时,fail2ban 过滤器应该会禁止该 IP 30 天,但由于该 IP 已经在 fail2ban-ssh 链中被禁止,因此会失败。
如果你看一下这个日志,也许这个问题更容易理解
2013-03-19 16:28:34,304 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-19 16:38:34,992 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-19 22:08:58,961 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-19 22:18:59,675 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-20 03:52:25,005 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-20 04:02:25,672 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-20 09:29:51,020 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-20 09:39:51,734 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-20 12:34:01,832 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-20 12:34:03,718 fail2ban.actions: WARNING [fail2ban] 202.191.128.252 already banned
2013-03-20 12:44:02,545 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
正如您所看到的,fail2ban 认为该 IP 已被禁止,即使它是用于不同的端口(或者更确切地说:特定端口 22,而不是通用的“所有端口”),因此不执行任何操作。
我想知道是否以及如何让 fail2ban 禁止 fail2ban 链中的 ip,即使它已经被禁止使用 ssh?
任何指导都值得赞赏。谢谢。
答案1
虽然 fail2ban 创建了一个iptables每个服务链(例如fail2ban-ssh),检查是否存在禁令是基于 IP 地址的。解决这个问题的一种可能性是让 fail2ban解禁如果某个 IP 已经在禁止列表中,则在再次禁止该 IP 之前,发送一个票证
apt-get install
这些操作发生在位于(通过 安装时)的 Python 脚本中
/usr/share/fail2ban/server
编辑文件actions.py
,您应该看到以下定义__checkban
代码
def __checkBan(self):
ticket = self.jail.getFailTicket()
if ticket != False:
aInfo = dict()
bTicket = BanManager.createBanTicket(ticket)
aInfo["ip"] = bTicket.getIP()
aInfo["failures"] = bTicket.getAttempt()
aInfo["time"] = bTicket.getTime()
aInfo["matches"] = "".join(bTicket.getMatches())
if self.__banManager.addBanTicket(bTicket):
logSys.warn("[%s] Ban %s" % (self.jail.getName(), aInfo["ip"]))
for action in self.__actions:
action.execActionBan(aInfo)
return True
else:
logSys.warn("[%s] %s already banned" % (self.jail.getName(), aInfo["ip"]))
return False
修改/替换定义
def __checkBan(self):
ticket = self.jail.getFailTicket()
if ticket != False:
aInfo = dict()
bTicket = BanManager.createBanTicket(ticket)
aInfo["ip"] = bTicket.getIP()
aInfo["failures"] = bTicket.getAttempt()
aInfo["time"] = bTicket.getTime()
aInfo["matches"] = "".join(bTicket.getMatches())
# changes from here ...
if not self.__banManager.addBanTicket(bTicket):
logSys.warn("[%s] first unban %s before ban" % (self.jail.getName(), aInfo["ip"]))
self.__unBan(ticket)
self.__banManager.addBanTicket(bTicket)
logSys.warn("[%s] Ban %s" % (self.jail.getName(), aInfo["ip"]))
for action in self.__actions:
action.execActionBan(aInfo)
return True
# else:
# logSys.warn("[%s] %s already banned" % (self.jail.getName(),
# aInfo["ip"]))
#return False
并重新启动 fail2ban(例如/etc/init.d/fail2ban restart
),尽管这可能没有必要......
注意:如果你想“尝试一下”,你可以列出防火墙(iptables)规则
iptables -L
并删除由 fail2ban 创建的规则,以便访问并强制“重新禁止”
iptables -D fail2ban-ssh xxxx
其中 xxxx 是列表中该链中的规则编号iptables -L fail2ban-ssh
答案2
如果你的主机位于 NAT 后面,那么在 INPUT 中阻止 IP 将不起作用。你必须选择 FORWARD。
例如,我在 Docker 中使用 Asterisk,因此阻止 INPUT 将不起作用。我这样设置了 jail 角色:
[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[chain=FORWARD, name=asterisk, protocol=all, blocktype=DROP]
logpath = /home/asterisk/logs/messages
bantime = 10800
maxretry = 2
我可以看到丢包计数在增加,如附图所示。