如果超过“每x次尝试次数”,则阻止特定ip

2024-04-18 16:08:44 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个服务器必须处理来自gprs模块的大量TCP请求,我认为设置一些东西来保护服务器不受来自某些ip的多个请求的影响是很方便的

现在我想做一些东西(在python中)来检查某个ip尝试连接的次数,如果超过了给定的尝试次数,这个ip将在给定的时间内(或永远)被阻塞。在

我想知道是否有库可以做到这一点,或者我应该如何在代码中解决这个问题。在


Tags: 模块代码ip服务器时间次数tcpgprs
3条回答

不要从你的代码中解决这个问题-这就是防火墙的设计初衷。在

使用iptables很简单:

iptables -I INPUT -p tcp --dport $PORT -i eth0 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport $PORT -i eth0 -m state --state NEW -m recent --update --seconds 600 --hitcount 2 -j DROP

上面的意思是“删除任何在端口$port在10分钟内尝试连接超过2次的内容”

正如Burhan Khalid所说。你不想在代码中尝试这个。它的性能不是很好,这就是防火墙的用途。在

iptables -I INPUT -p tcp --dport $PORT -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport $PORT -i eth0 -m state --state NEW -m recent --update --seconds 600 --hitcount 2 -j DROP

这个例子很有用,但不是很方便。问题是你也限制了好的/可信的连接。在

你需要更灵活些。在基于linux的操作系统上,可以使用fail2ban。它是一个非常方便的工具,可以通过使用动态iptables规则来防止暴力攻击服务。在Debian/Ubuntu上,可以使用apt-get安装它。如果您在CentOS上,您需要使用第三方存储库。在

  1. 将每个连接记录到日志文件中:

    [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
    
  2. 现在用fail2ban监视这个文件,并定义一个regex来区分成功和失败的登录。告诉fail2ban它应该为您阻止IP多长时间,以及您是否希望收到电子邮件通知。

文档非常好,所以请看一下如何配置fail2ban来监视您的登录名:fail2ban docu

你不必只关注失败的登录。您还可以尝试监视端口扫描。最大的胜利是:不仅要保护你的应用程序。安全的还有你的SSH,HTTP等登录的beeing bruteforced!;)

如果您决定要用代码来处理这个问题,则不需要使用单独的库(尽管使用一个库可能会更有效),您可以向连接处理程序添加类似以下内容:

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)

相关问题 更多 >