Nginx 封锁恶意 IP,并且定时取消的两种脚本

2017-04-14 00:20:05 +08:00
 liuliliuli2017

有时候博客会有莫名其妙的人进来,腾云阁看到这个解决方法待试试

收录待用,修改转载已取得腾讯云授权


代码节选:

使用 nginx 封锁

...

-封锁 IP

#!/bin/bash
max=500    #我们设定的最大值,当访问量大于这个值得时候,封锁
confdir=/usr/local/data/nginx/conf/blockip.conf #nginx 封锁配置文件路径
logdir=/usr/local/data/nginx/logs/access_huke88.log  #nginx 访问日志文件路径
#检测文件
test -e ${confdir} || touch ${confdir}
drop_ip=""
#循环遍历日志文件取出访问量大于 500 的 ip
for drop_ip  in $(cat $logdir | awk '{print $1}' | sort | uniq -c | sort -rn  | awk '{if ($1>500) print $2}')
do
  grep  -q  "${drop_Ip}" ${confdir} && eg=1 || eg=0;
  if (( ${eg}==0 ));then
     echo "deny ${drop_Ip};">>$confdir  #把“ deny IP ;”语句写入封锁配置文件中
     echo ">>>>> `date '+%Y-%m-%d %H%M%S'` - 发现攻击源地址 ->  ${drop_Ip} " >> /usr/local/data/nginx/logs/nginx_deny.log  #记录 log
  fi
done
service nginx reload

-解锁 IP

#!/bin/bash
sed -i 's/^/#&/g' /usr/local/nginx/conf/
blockip.conf  #把 nginx 封锁配置文件中的内容注释掉
service nginx reload   #重置 nginx 服务,这样就做到了解锁 IP

使用 iptables 封锁

...

-封锁 IP 脚本

#!/bin/bash
max=500    #我们设定的最大值,当访问量大于这个值得时候,封锁
logdir=/usr/local/data/nginx/logs/access_huke88.log  #nginx 访问日志文件路径
port=80
drop_ip=""
#循环遍历日志文件取出访问量大于 500 的 ip
for drop_ip  in $(cat $logdir | awk '{print $1}' | sort | uniq -c | sort -rn  | awk '{if ($1>500) print $2}')
do
  grep  -q  "${drop_Ip}" ${confdir} && eg=1 || eg=0;
  if (( ${eg}==0 ));then
     iptables -I INPUT -p tcp --dport ${port} -s ${drop_Ip} -j DROP
     echo ">>>>> `date '+%Y-%m-%d %H%M%S'` - 发现攻击源地址 ->  ${drop_Ip} " >> /usr/local/data/nginx/logs/nginx_deny.log  #记录 log
  fi
done

...

加入计划任务每五分钟执行一次

chmod +x /home/scripts/deny_ip.sh
#####nginx 封 ip######
*/5 * * * * /bin/sh /home/scripts/deny_ip.sh >/dev/null 2>&1

原文链接: https://www.qcloud.com/community/article/281027001490538345

8501 次点击
所在节点    NGINX
21 条回复
hcymk2
2017-04-14 00:30:46 +08:00
还是用 ipset 吧
其实 fail2ban 也可以。
cxbig
2017-04-14 06:56:19 +08:00
不是有 fail2ban ?
现在比较流行 WAF ,服务器几乎只用处理正常的访问。
ic3z
2017-04-14 08:56:31 +08:00
日志文件大的时候,这个取地址会不会炸?
$(cat $logdir | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if ($1>500) print $2}')
AnonymousAccout
2017-04-14 08:58:40 +08:00
@cxbig fail2ban 不是对 ssh 作限制的吗?
BOYPT
2017-04-14 09:06:24 +08:00
IP 数据量大了会导致很多 iptables 规则,会严重影响入站流量;应该考虑使用 ipset 。
lgpqdwjh
2017-04-14 09:08:18 +08:00
应该使用 nglua
usernametoolong
2017-04-14 09:48:43 +08:00
这个脚本是几年前从 hostloc 流出来的,纯粹的蒙古大夫。。。。。。。。。
Havee
2017-04-14 10:49:43 +08:00
ipset +1
tylerdurden
2017-04-14 10:58:00 +08:00
这种方法有点笨重。
app13
2017-04-14 11:08:17 +08:00
@AnonymousAccout #4 fail2ban 可以 ban 挺多东西的,你可以去看下它的配置文件
jarell
2017-04-14 11:13:06 +08:00
@usernametoolong 蒙古大夫这个说法真形象
msg7086
2017-04-14 11:24:35 +08:00
@AnonymousAccout fail2ban 是对 ssh 做限制的啊,但是人家也没说不能限别的嘛……
ningcool
2017-04-14 13:22:15 +08:00
@Havee fail2ban 和 ipset 用哪个好?
lixuda
2017-04-14 13:41:24 +08:00
还有比较简单的方式吗?小白
j4fun
2017-04-14 14:00:35 +08:00
这种脚趾头想想就能写出来的。。。。还要取得授权╮(╯▽╰)╭
cabing
2017-04-14 14:49:29 +08:00
找找 nginx 的插件
rrfeng
2017-04-14 15:41:47 +08:00
fail2ban 也是用 iptables
holinhot
2017-04-14 15:59:24 +08:00
攻击来了日志一会就几百 MB 了
cxbig
2017-04-14 17:35:44 +08:00
@AnonymousAccout 看看 fail2ban 的文档,它的功能可不仅仅限于 ssh 登录哦。
hyperxu
2017-04-14 19:11:36 +08:00

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

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

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

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

© 2021 V2EX