查看nginx日志经常会看到一些特殊的访问地址(包含十六禁止字符串请求),怀疑这些请求为非法请求,禁止包含特定字符请求对应的ip地址访问,保护服务器资源。

使用python实现一个定时脚本,分析 Nginx 日志中的异常请求并自动将可疑 IP 添加到黑名单,可以使用 Python 和一些基本的正则表达式。
实现思路
-
读取 Nginx 日志文件:打开并读取
/var/log/nginx/access.log文件,逐行分析。 -
检测异常请求:使用正则表达式,查找包含特定十六进制字符串的请求(如
\x16\x03\x01等)。这些字符串可能表示非正常访问或攻击请求。 -
提取 IP 地址:从符合条件的日志条目中提取 IP 地址。
-
更新黑名单文件:将新提取的 IP 地址添加到
/etc/nginx/includes/blackListIp.conf文件中,确保不会重复添加。 -
刷新 Nginx 配置:使用命令
nginx -s reload使更改生效。 -
定时执行脚本:使用
cron作业或schedule库每隔一段时间执行脚本。
详细代码
import re
import subprocess
from datetime import datetime
# 日志文件和黑名单文件路径
NGINX_LOG_FILE = '/var/log/nginx/access.log'
BLACKLIST_FILE = '/etc/nginx/includes/blackListIp.conf'
# 正则表达式匹配含十六进制特殊字符的请求
HEX_PATTERN = re.compile(r'\\x[0-9A-Fa-f]{2}')
IP_PATTERN = re.compile(r'(\d{1,3}\.){3}\d{1,3}')
def extract_suspicious_ips(log_file):
"""从Nginx日志中提取可疑的IP地址"""
suspicious_ips = set()
with open(log_file, 'r') as file:
for line in file:
# 检查行中是否包含特殊十六进制字符
if HEX_PATTERN.search(line):
# 提取IP地址
match = IP_PATTERN.search(line)
if match:
ip_address = match.group(0)
suspicious_ips.add(ip_address)
return suspicious_ips
def update_blacklist(blacklist_file, suspicious_ips):
"""更新黑名单文件,添加新的可疑IP"""
# 读取现有的黑名单文件
existing_ips = set()
with open(blacklist_file, 'r') as file:
for line in file:
ip_match = IP_PATTERN.search(line)
if ip_match:
existing_ips.add(ip_match.group(0))
# 计算新的IP列表
new_ips = suspicious_ips - existing_ips
if not new_ips:
print(f"{datetime.now()}: 没有新的可疑IP需要添加。")
return False
# 将新的IP写入黑名单文件
with open(blacklist_file, 'a') as file:
for ip in new_ips:
file.write(f"deny {ip};\n")
print(f"{datetime.now()}: 添加新的可疑IP到黑名单: {', '.join(new_ips)}")
return True
def reload_nginx():
"""重新加载Nginx配置"""
try:
subprocess.run(['nginx', '-s', 'reload'], check=True)
print(f"{datetime.now()}: 成功重新加载Nginx配置。")
except subprocess.CalledProcessError:
print(f"{datetime.now()}: 重新加载Nginx配置失败。")
def main():
suspicious_ips = extract_suspicious_ips(NGINX_LOG_FILE)
if update_blacklist(BLACKLIST_FILE, suspicious_ips):
reload_nginx()
if __name__ == "__main__":
main()


说明
- 提取可疑 IP:
extract_suspicious_ips函数会读取 Nginx 日志文件并识别包含十六进制字符的请求。 - 更新黑名单:
update_blacklist函数将新检测到的 IP 添加到黑名单文件中,避免重复添加。 - 刷新 Nginx 配置:
reload_nginx函数通过命令nginx -s reload使黑名单更新生效。
定时运行脚本
可以使用 cron 每隔一定时间(如每小时)自动运行此脚本:
# 编辑crontab
crontab -e
# 添加以下行,每小时运行脚本
0 * * * * /usr/bin/python3 /home/pythontools/script.py
注意事项
- 脚本需要 root 权限来修改黑名单文件并重新加载 Nginx 配置。
- 确保黑名单文件路径正确配置,并在
nginx.conf中正确引用 - 需要优化,考虑每次整个nginx日志文件读取内容长度很大,存在耗时并占用过多服务器资源,需要间隔时间内针对已经分析过的nginx日志不用重复分析,给出具体的优化策略提供选择
如果你使用过程中遇到什么问题,公众号回复咨询。
当前文章价值6元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章
分类:nginx
标签:nginx自动拦截恶意ip, python自动化脚本
评论已关闭!