前提

最近在网上浏览其他博客时发现nginx可以拒绝指定ip访问,虽然本站目前还未遭到过攻击,不过还是防范于未然,将过程记录一下

获取访问ip

nginx的日志中都有访问者的详细记录
20180612100417.png

首先我们需要将访问者的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

参考博客:https://www.cnblogs.com/wloveh/p/4434919.html

最后修改:2022 年 04 月 27 日
如果觉得我的文章对你有用,请随意赞赏