如果已經禁止特定埠,fail2ban 不能禁止所有埠上的 ip
我在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