前提
最近在网上浏览其他博客时发现nginx可以拒绝指定ip访问,虽然本站目前还未遭到过攻击,不过还是防范于未然,将过程记录一下
获取访问ip
nginx的日志中都有访问者的详细记录
首先我们需要将访问者的ip提取出来并统计,使用一下命令
tail -n 30000 /var/log/nginx/access.log | awk '{print $1,$7,$9}' | grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou|360|bing|soso" | awk '{print $1}'|sort|uniq -c|sort -rn | awk '$1 > 1000{print $2}' > /etc/nginx/blockip.conf
tail -n 30000 /var/log/nginx/access.log
查看日志3W条记录
awk '{print $1,$7,$9}'
根据自己的需求截取相应的内容 $1必不可少是IP
grep -i -v -E "google|yahoo|baidu|....
过滤掉正常的多访问记录百度蜘蛛。。。。相信大家都知道
awk '{print $1}'|sort|uniq -c|sort -rn
对单个IP访问量进行统计并记数
awk '$1 > 1000{print $2}' > /etc/nginx/blockip.conf
将访问量大于1000的ip写入文件中
nginx配置文件
在nginx
的配置文件http
或者server
中添加include blockip.conf;
重启nginx就可
python脚本
# -*- encoding:utf-8 -*-
import datetime
import os
#保存黑名单文件路径
confpath = '/etc/nginx/blockip.conf'
#nginx日志路径
logpath = '/var/log/nginx/access.log'
getip = os.popen(" tail -n 30000 %s |awk '{print $1,$12}' |grep -i -v -E \"google|yahoo|baidu|msnbot|FeedSky|sogou\" |awk '{print $1}'|sort|uniq -c|sort -rn|awk '$1 > 1000{print $2}'"%logpath).readlines()
for i in getip:
#去除ip左右的换行符
i = i.strip('\n')
with open(confpath,'r+') as file:
#读取黑名单ip的文件
ip = file.read()
#如果不存在则写入文件
if i not in ip:
os.system("echo 'deny %s;' >> %s"%(i,confpath))
#重启nginx
os.system('systemctl reload nginx')
#print('重启nginx!')
#下面的代码可根据实际情况添加
#获取当前时间(时:分)
date = datetime.datetime.now().strftime('%H:%M')
#每日凌晨清空黑名单和nginx日志
if date == '00:00':
os.system('echo '' > %s'%logpath)
os.system('echo '' > %s'%confpath)
os.system('systemctl reload nginx')
添加任务计划:
crontab -e
#每5分钟执行一次
*/5 * * * * python /root/run/blockip.py