我有以下IPTables和IPSet作为阻止攻击IP的规则源,但是当我向IPSet添加攻击IP时,在我的Nginx访问日志中,我仍然看到攻击IP的连续访问.过了一会儿,也许是3~5分钟,知识产权被封锁了.
iptables的
~$sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 317K packets,230M bytes)
num pkts bytes target prot opt in out source destination
1 106K 6004K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 match-set Blacklist src
Chain FORWARD (policy ACCEPT 0 packets,0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 match-set Blacklist src
Chain OUTPUT (policy ACCEPT 350K packets,58M bytes)
num pkts bytes target prot opt in out source destination
IPSET
sudo ipset -L
Name: Blacklist
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 60
Size in memory: 13280
References: 2
Members:
xxx.xxx.xxx.xxx(attacker ip) timeout 0
我不知道为什么规则没有立即生效,这让我疯狂就像攻击者在嘲笑我一样.
我使用-I选项将ipset添加到iptables规则,这应该将规则保持在第一个位置.那么也许Chain INPUT(政策接受)可以做到这一点?
请帮帮我,非常感谢.
BTW.
我使用Nginx Djano / uWSGI来部署我的应用程序,并使用shell脚本来分析Nginx日志以将邪恶的ip放入Blacklist ipset.
防火墙分析到达线路中的每个数据包可能效率低下,因此,出于性能原因,发生的情况是用户创建的规则通常仅适用于建立连接的初始数据包(称为TCP的SYN,SYN ACK,ACK) – 随后,所述连接自动列入白名单(更准确地说,它是原始规则已创建的列入白名单的状态),直到终止(FIN).
这里可能发生的是,由于Nginx擅长的流水线和保持连接,单个连接可用于发出和处理多个独立的HTTP请求.
因此,为了解决问题,您可以在Nginx中禁用流水线操作和保持连接(不是一个好主意,因为它会影响性能),或者删除现有的白名单连接,例如,使用类似于tcpdrop(8)
on *BSD的连接 – 肯定也必须有一个Linux等效工具.
但是,如果您只是遇到单个客户端执行过多请求的问题,并因此使您的后端过载,那么适当的操作方法可能是根据IP地址对客户端进行速率限制,并提供帮助标准limit-req
directive of nginx.(但是,请注意,您的一些客户可能是操作符级NAT的背后,请注意您应用限制的程度,以确保误报不会成为问题.)