利用Nginx日志进行防盗链主要涉及到以下几个步骤:
首先,你需要定期分析Nginx的访问日志,以识别出哪些请求是非法的防盗链请求。常见的防盗链请求特征包括:
Referer字段或Referer字段指向非法域名。Nginx提供了多种防盗链的方法,最常用的是通过valid_referers指令和if指令来实现。
server {
listen 80;
server_name example.com;
location /protected/ {
valid_referers none blocked server_names example.com *.example.com;
if ($invalid_referer) {
return 403 "Forbidden";
}
# 其他配置
}
}
在这个示例中:
valid_referers指令指定了允许的引用来源,包括none(无引用)、blocked(被阻止的引用)、以及指定的域名。if ($invalid_referer)指令用于检查引用是否有效,如果无效则返回403 Forbidden状态码。Nginx有一些第三方模块可以帮助更精细地控制防盗链,例如ngx_http_referer_module和ngx_http_xff_module。
ngx_http_referer_module)server {
listen 80;
server_name example.com;
location /protected/ {
valid_referers none blocked server_names example.com *.example.com;
if ($invalid_referer) {
return 403 "Forbidden";
}
# 其他配置
}
}
你可以编写脚本来定期分析Nginx日志,识别出异常请求并采取相应措施。以下是一个简单的Python脚本示例:
import re
from collections import defaultdict
# 配置
log_file = '/var/log/nginx/access.log'
blocked_ips = set()
blocked_domains = set()
# 正则表达式匹配Referer
referer_pattern = re.compile(r'"GET /protected/.*" 403')
# 分析日志
with open(log_file, 'r') as f:
for line in f:
match = referer_pattern.search(line)
if match:
# 提取IP地址和域名
ip = re.search(r'\d+\.\d+\.\d+\.\d+', line).group()
domain = re.search(r'"GET /protected/(.*) " 403', line).group(1)
# 阻止IP地址
blocked_ips.add(ip)
# 阻止域名
blocked_domains.add(domain)
# 输出阻止的IP和域名
print("Blocked IPs:", blocked_ips)
print("Blocked Domains:", blocked_domains)
# 可以在这里添加进一步的处理逻辑,例如将IP和域名加入防火墙规则
你可以将上述脚本集成到定时任务(如cron job)中,定期运行并更新防火墙规则或其他安全措施。
设置监控系统(如Prometheus、Grafana)来实时监控Nginx日志,并在检测到异常请求时发送报警通知。
通过以上步骤,你可以有效地利用Nginx日志进行防盗链,保护你的资源不被非法访问。