我在fail2ban中使用一个自定义filter来search自己的日志,并禁止从任何常规filter5禁令后的IP。 我使用iptables-allports作为此操作。 所有其他的filter都configuration了iptables-multiport 。
这是jail.conf的特定configuration
[fail2ban] enabled = true filter = fail2ban action = iptables-allports[name=fail2ban] logpath = /var/log/fail2ban.log maxretry = 5 findtime = 604800 bantime = 2592000
我的filterfail2ban.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>
对于Ubuntu 12.04.2, iptables-allports.conf是fail2ban 0.8.6-3的默认configuration
问题是,每当一个IP被禁止从一个常规的filter,说sshd,它被禁止10分钟。 但是,第五次同样的地址被禁止,fail2banfilter应该禁止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,尽pipe它已经被禁止使用ssh了。
任何指导赞赏。 谢谢。
当fail2ban为每个服务创build一个iptables链(例如fail2ban-ssh )时,检查现有的禁止是基于IP地址。 解决这个问题的一个可能性是,如果它已经在禁止列表中,那么它将使IP(ticket)成为一个IP,
这些操作发生在位于python脚本(通过apt-get install )中
/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
修改/replace定义
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创build的规则,以便访问并强制“重新禁止”
iptables -D fail2ban-ssh xxxx
其中xxxx是列表iptables -L fail2ban-ssh中该链中规则的编号
不要使用名称fail2ban作为部分名称, 不要使用与您的iptables链名称相同的名称。 使用例如:
[repeated-bans] enabled = true filter = fail2ban-repeated-bans banaction = iptables-allports port = anyport logpath = /var/log/fail2ban.log ...