求:一款 1 分钟(或指定时间内)请求次超过 x 次就将 ip 加入封禁的运维工具

2023-01-06 18:32:19 +08:00
 herozzm
Linux 服务器上用的,太多私人爬虫机器人了,变换着 ua 和使用着 ip 爬虫库爬,服务器都爬死了
1298 次点击
所在节点    问与答
15 条回复
ik
2023-01-06 18:44:21 +08:00
shell 写一个
bjzhush
2023-01-06 18:49:13 +08:00
我第一反应是 ngx_http_limit_req_module ,不过看了下你好像不是要限制频率,要直接封禁。
我目前有一个在用的方案,稍微有点麻烦,不过也不复杂,用 filebeat 推 nginx log 到 redis 队列,然后自己解析后,需要封禁的 ip 加入 ip 黑名单池。Nginx 每个请求都会通过 lua 脚本读取黑名单池,在池子里面的直接 403 。
也有个优点,就是可以自己定制封禁逻辑,比较灵活
Puteulanus
2023-01-06 18:56:57 +08:00
永久 ban ip 误伤了运营商 NAT 的出口 IP 可能大范围打不开,前面加个 cf 之类的 cdn 吧
herozzm
2023-01-06 18:59:11 +08:00
@Puteulanus 已经套了 cdn ,但是 cdn 的封锁措施有限
zhailw
2023-01-06 18:59:38 +08:00
fail2ban 自己针对日志写配置文件,还是挺方便的
datocp
2023-01-06 19:10:32 +08:00
用 iptables recent hacker 搜索一下,
现在都是配合 ipset 使用。
israinbow
2023-01-06 19:10:35 +08:00
https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker

配合 #5 说的 fail2ban 防御, 效果不错.
Jirajine
2023-01-06 19:18:54 +08:00
别永久 ban ,限流就行,而且只 ban /32 不要扩大 ban 子网的范围,动态 ip 太容易误伤。
用的一些节点打开 Debian wiki 总是 403 ,一查整个 /24 段早就被拉黑了。
herozzm
2023-01-06 19:20:17 +08:00
@Jirajine 比起拉黑动态 ip ,我更在乎是服务器被爬死,不在乎哪些被人利用的动态 ip 返回 403
sky96111
2023-01-06 19:28:14 +08:00
@herozzm 他的意思是动态 IP ,过段时间这个 IP 就不是之前爬你网站的那个人的了。如果后来获取到这个被 ban IP 的无辜人是你网站的潜在用户,你很可能会失去他
herozzm
2023-01-06 19:35:07 +08:00
@sky96111 设置一个时间段吧,封禁 1 周
lower
2023-01-06 19:45:54 +08:00
不知道 限流工具或策略 对服务器性能影响大么?
请求没进应用就返回结果了。。。应该对性能影响微乎其微吧
billgong
2023-01-06 19:47:45 +08:00
@zhailw f2b 正解 此类根据某种特征识别主机并 ban 掉的操作都是 f2b 能搞定的范畴

如果你说的爬虫指的是爬 SSH 弱密码、爬 SMTP 中继的那类,规则可以设置的严格一些,我这边都是直接 ban 终身的

有的时候并不需要在源头上 ban 一个 IP 。资源够的话可以先从应用层面 ban ,然后升级至防火墙 ban 端口,最后彻底 ban ,可以有效减少误杀的可能。
psirnull
2023-01-06 20:02:40 +08:00
iptables 写一个

1.编写脚本
mkdir /root/bin
vi /root/bin/dropip.sh
#!/bin/bash
/bin/netstat -nagrep ESTABLISHEDawk ‘{print $5}’awk -F: ‘{print $1}’sortuniq -csort -rnhead -10grep -v -E ’192.168127.0′awk ‘{if ($2!=null && $1>4) {print $2}}’>/tmp/dropip for i in $(cat /tmp/dropip) do /sbin/iptables -A INPUT -s $i -j DROP echo "$i kill at `date`">>/var/log/ddos done
2.增加执行权限 chmod +x /root/bin/dropip.sh

3.添加到计划任务,每分钟执行一次 crontab -e */1 * * * * /root/bin/dropip.sh 可以根据实际需要修改下。
Dukec
2023-01-06 23:51:14 +08:00
Fail2ban

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907071

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX