iptables 自动屏蔽访问网站频繁的 IP
场景:恶意访问,安全防范
屏蔽每分钟访问超过 200 的 IP
方法 1:根据访问日志(Nginx 为例)
#!/bin/bash
DATE=$(date +%d/%b/%Y:%H:%M)
ABNORMAL_IP=$(tail -n 5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)pri
nt i}')
#先 tail 防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk 不能直接过滤日志,因为包含特殊字符。
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
iptables -I INPUT -s $IP -j DROP
fi
done方法 2:通过 TCP 建立的连接
#!/bin/bash
ABNORMAL_IP=$(netstat -an |awk '$4~/:80$/ && $6~/ESTABLISHED/{gsub(/:[0-
9]+/,"",$5);{a[$5]++}}END{for(i in a)if(a[i]>100)print i}')
#gsub 是将第五列(客户端 IP)的冒号和端口去掉
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
iptables -I INPUT -s $IP -j DROP
fi
done屏蔽每分钟 SSH 尝试登录超过 10 次的 IP
方法 1:通过 lastb 获取登录状态:
方法 2:通过日志获取登录状态
根据 web 访问日志,封禁请求量异常的 IP,如 IP 在半小时后 恢复正常,则解除封禁
最后更新于