Ubuntu

如果已經禁止特定埠,fail2ban 不能禁止所有埠上的 ip

  • May 5, 2019

我在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,它就會被禁止 10 分鐘。但是第五次同一地址被禁止時,fail2ban 過濾器應該禁止該 IP 30 天,但由於它已經在 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禁止?

任何指導表示讚賞。謝謝。

雖然 fail2ban 為每個服務創建一個iptables鏈(例如fail2ban-ssh),但對現有禁令的檢查是基於 IP 地址的。解決此問題的一種可能性是,如果它在將要禁止它(再次)之前已經在禁止列表中,則使 fail2ban取消禁止 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

引用自:https://serverfault.com/questions/489642