![iptables 没有阻塞](https://linux22.com/image/30770/iptables%20%E6%B2%A1%E6%9C%89%E9%98%BB%E5%A1%9E.png)
我有一个由 crontab 每分钟运行的脚本。
该脚本扫描系统日志并抓取每次尝试登录服务器的 dovecot、exim 或 ssh 失败的 IP,并将它们添加到 ipset 中,从而永远阻止该 IP。
问题是这样的:脚本每分钟运行一次,并且很好地完成了它应该做的事情,即抓取攻击者的IP并将它们添加到ipset中,但我仍然有相同IP试图攻击系统的日志条目一个小时。
换句话说。假设现在有人试图攻击系统。一分钟内,脚本将运行并获取所有密码失败次数超过 3 次的 IP,并将它们添加到 ipset 中。即便如此,我仍然有几个小时的 IP 日志试图暴力攻击该网站,并且连接没有中断。
我的假设是这样的:ipset的工作原理是向表中添加一个IP,下次该IP到达服务器时该IP将被阻止,但如果该IP已经连接到试图攻击的服务器,则连接不会断开。这是正确的吗?如果是,有没有办法中断正在进行的连接?
注意:仅供记录:我用来将名为阻塞的 ipset 添加到 iptables 的命令如下:
iptables -A INPUT -p tcp --dport XX -m set --set blocking src -j DROP
其中 XX 是我要阻止的端口。
答案1
iptables -A
添加到结尾链的(注意 的长形式-A
是--append
)。您可能有一个类似于iptables -A INPUT -p tcp --dport XX -j ACCEPT
顶部附近的规则,它会产生干扰,因为当规则从上到下执行时,它首先被匹配。
有两种明显的方法可以解决这个问题:
使用单独的块链,该块链在服务的接受规则之前被调用。这是我使用的方法,因为如果对区块链的跳转进行了适当的调节,那么如果没有必要,所有这些规则都不会被测试。您需要弄清楚要添加到哪个区块链。另一个好处是,如果您需要,这样做
iptables -F smtp-blocks
比手动查找并删除端口 25 的每个块要容易得多。(您使用集的事实可能会在一定程度上缓解这种情况;我不太熟悉规则集以及什么)可以和他们一起完成。)代替
iptables -A
和iptables -I
。-I
在顶部(或在指定索引之前,如果指定了)使用插入,确保阻止规则在服务接受规则之前执行。
我的假设是这样的:ipset的工作原理是向表中添加一个IP,下次该IP到达服务器时该IP将被阻止,但如果该IP已经连接到试图攻击的服务器,则连接不会断开。这是正确的吗?如果是,有没有办法中断正在进行的连接?
这取决于规则。如果 TCP 协议规则指定它应该仅在 SYN 数据包 ( --syn
) 上匹配,那么它只会在启动连接时匹配;但是,默认情况下是匹配每个数据包。 UDP 没有连接启动的概念,尽管您可以使用连接追踪出于类似目的。也就是说,如果您没有明确指定任何内容,如果放置得当新添加的规则将匹配下一个传入的数据包,该数据包将根据相关规则进行处理。如果规则规定-j DROP
,从远程方的角度来看,这与您刚刚拔掉网络电缆的情况大致相同。