python分析nginx根据每日请求量自动屏蔽

本文介绍了一种利用Nginx日志实时分析并动态更新IP黑名单的系统,通过解析日志文件,识别高频率访问的可疑IP,并将其加入到黑名单中,以提高网络安全防护效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/local/python/bin/python
# -*- coding: utf-8 -*-
import sys,time,commands,linecache
import subprocess
from urlparse import urlparse
from tailf import tailf
import shutil,struct,socket

ip_max_count = 100

def str2int(str):
    uint = socket.ntohl(struct.unpack("I",socket.inet_aton(str))[0])
    return struct.unpack("i", struct.pack('I', uint))[0]
cur_ip_cache = {}
commands.getstatusoutput("/home/nginx/sbin/nginx -s reload")
time.sleep(5)
fh=open('/home/nginx/conf/v42_zhaoren_deny.conf.python','r')
for  line in  fh.readlines():
        if line[0:4] == "deny":
                ip_temp = line.split(' ')[1][0:-2].strip().lstrip()
                cur_ip_cache[ip_temp] = ip_max_count+1
fh.close()

log_file = "/home/nginx/logs/access.cn.log"
for line in tailf(log_file):
        parse_info = line.split(' ')
        ip_address = parse_info[0].strip()
        log_time = parse_info[1]+parse_info[2]
        if not cur_ip_cache.has_key(ip_address):
                cur_ip_cache[ip_address] = 1
        else:
                #print cur_ip_cache[ip_address]
                if cur_ip_cache[ip_address] < ip_max_count:
                        cur_ip_cache[ip_address] += 1
                if cur_ip_cache[ip_address] == ip_max_count:
                        f=open('zhaoren.log','a')
                        f.write(log_time+"\t\t"+ip_address+"\n")
                        f.close()
                        f=open('/home/nginx/conf/access_deny.conf.python','a')
                        f.write("deny \t"+ip_address+";\n")
                        f.close()
                        shutil.copyfile("/home/nginx/conf/access_deny.conf.python", "/home/nginx/conf/access_deny.conf")
                        #temp = commands.getstatusoutput("/home/nginx/sbin/nginx -s reload")


### 如何在 Nginx 中限制特定文件类型的访问 为了防止某些敏感文件被意外或恶意访问,可以通过配置 Nginx 来限制对特定文件类型的访问。以下是实现这一目标的具体方法: #### 方法一:通过 `location` 配置阻止特定文件类型 可以使用 `location` 块来匹配特定的文件扩展名并返回错误页面或者拒绝请求。 ```nginx server { listen 80; server_name example.com; # 禁止访问 .php 文件 location ~* \.php$ { deny all; } # 禁止访问 .sh 和 .py 文件 location ~* \.(sh|py)$ { deny all; } } ``` 这种方法会匹配所有以 `.php`、`.sh` 或 `.py` 结尾的文件,并拒绝任何对该类文件的访问[^1]。 --- #### 方法二:禁止解析指定目录下的特定程序文件 如果希望仅针对某个目录内的特定文件类型进行限制,则可以在该目录下应用更严格的规则。 ```nginx server { listen 80; server_name example.com; location /uploads/ { # 禁止解析 PHP 脚本 location ~* \.php$ { return 403; } # 禁止解析 Shell、Perl 和 Python 脚本 location ~* \.(sh|pl|py)$ { return 403; } } } ``` 此配置确保 `/uploads/` 目录中的脚本文件无法被执行,即使它们被上传到服务器上也不会构成威胁[^2]。 --- #### 方法三:全局范围禁用特定文件类型 对于整个站点而言,可能需要全面屏蔽某些危险文件类型。这可以通过正则表达式的全局匹配完成。 ```nginx server { listen 80; server_name example.com; # 全局范围内禁止访问以下文件类型 location ~* \.(php|sh|py|pl|cgi|asp|aspx|jsp|exe|dll|bat|cmd|hta|htaccess)$ { deny all; } } ``` 这种设置适用于保护整个 Web 应用免受潜在风险的影响,尤其是当存在未授权上传功能时[^3]。 --- #### 方法四:结合用户代理限制 除了基于文件类型外,还可以进一步增强安全性,比如根据客户端 User-Agent 进行过滤。 ```nginx server { listen 80; server_name example.com; # 如果检测到来自已知爬虫或其他工具的请求,则直接拒绝 if ($http_user_agent ~* (wget|curl|bot)) { return 403; } # 同时也可以配合文件类型限制一起生效 location ~* \.(php|sh|py|pl|cgi|asp|aspx|jsp|exe|dll|bat|cmd|hta|htaccess)$ { deny all; } } ``` 这种方式能够有效减少自动化攻击尝试的成功率[^3]。 --- #### 注意事项 - **测试配置有效性**:每次修改完成后记得运行命令 `nginx -t` 测试语法是否正确无误后再重新加载服务 (`systemctl reload nginx`)。 - **日志监控**:启用详细的访问日志以便于后续分析异常行为模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值