[Jun 3 03:52:23] server [pid]: Connect from 1.2.3.4
[Jun 3 03:52:23] server [pid]: Failed password for $USER from 1.2.3.4 port $DST
[Jun 3 03:52:23] server [pid]: Connect from 2.3.4.5
[Jun 3 03:52:23] server [pid]: Successful login from 2.3.4.5
from collections import defaultdict, deque
from datetime import datetime
floodlog = defaultdict(deque)
def checkForFlood(clientIP):
"""check if how many times clientIP has connected within TIMELIMIT, and block if more than MAX_CONNECTEIONS_PER_TIMELIMIT"""
now = datetime.now()
clientFloodLog = floodlog[clientIP]
clientFloodLog.append(now)
if len(clientFloodLog) > MAX_CONNECTIONS_PER_TIMELIMIT:
earliestLoggedConenction = clientFloodLog.popleft()
if now - earliestLoggedConnection < TIMELIMIT:
blockIP(clientIP)
不要从你的代码中解决这个问题-这就是防火墙的设计初衷。在
使用iptables很简单:
上面的意思是“删除任何在端口$port在10分钟内尝试连接超过2次的内容”
正如Burhan Khalid所说。你不想在代码中尝试这个。它的性能不是很好,这就是防火墙的用途。在
这个例子很有用,但不是很方便。问题是你也限制了好的/可信的连接。在
你需要更灵活些。在基于linux的操作系统上,可以使用fail2ban。它是一个非常方便的工具,可以通过使用动态iptables规则来防止暴力攻击服务。在Debian/Ubuntu上,可以使用apt-get安装它。如果您在CentOS上,您需要使用第三方存储库。在
将每个连接记录到日志文件中:
现在用fail2ban监视这个文件,并定义一个regex来区分成功和失败的登录。告诉fail2ban它应该为您阻止IP多长时间,以及您是否希望收到电子邮件通知。
文档非常好,所以请看一下如何配置fail2ban来监视您的登录名:fail2ban docu
你不必只关注失败的登录。您还可以尝试监视端口扫描。最大的胜利是:不仅要保护你的应用程序。安全的还有你的SSH,HTTP等登录的beeing bruteforced!;)
如果您决定要用代码来处理这个问题,则不需要使用单独的库(尽管使用一个库可能会更有效),您可以向连接处理程序添加类似以下内容:
相关问题 更多 >
编程相关推荐