nginx根据请求日志行为生成黑名单(无负载均衡版)
nginx请求日志经常看到一些疑似肉鸡扫描渗透的请求骚扰不断,看了下ip地址大部分是海外的。当然服务器如果在国内并且域名也是国内的也不打算给境外提供服务那么可以直接在域名服务商那里把DNS海外解析线路直接指向127.0.0.1这种地址,从域名解析这里拒绝到绝大部分请求。麻烦点也可以自己根据ip请求行为搞黑名单。这里记录下nginx根据请求日志搞黑名单。
先理清思路:nginx一般默认配置了请求日志,可以根据日志看客户端频繁请求了哪些疑似搞破坏的内容,然后把这部分ip加入到nginx的blacklist,重新加载nginx配置就完成。
linux下bash脚本大致是这样的:
<code>
#!/bin/bash
###### 根据nginx请求日志行为特征屏蔽渗透检查的ip ######
#假设nginx用的默认配置,请求日志文件为/var/log/nginx/access.log,脚本搜索是否有请求xmlrpc.php(wordpress的漏洞脚本)
#cat /var/log/nginx/access.log | grep xmlrpc.php | cut -d " " -f 1根据日志搜索结果按空格分隔获取到客户端的ip
#sed 's/^/deny &/g'|sed 's/$/&;/g' 在搜索到的ip前后分别加上deny 和 ;
#sort|uniq 避免重复的ip
#nginx.conf默认有配置 include /etc/nginx/conf.d/*.conf,然后把黑名单ip写入到 /etc/nginx/conf.d/blacklist.conf
#最后nginx -s reload 重新加载一下nginx配置
IPS=`cat /var/log/nginx/access.log | grep xmlrpc.php | cut -d " " -f 1|sed 's/^/deny &/g'|sed 's/$/&;/g'|sort|uniq`
FILE_PATH=/etc/nginx/conf.d/blacklist.conf
for IP in $IPS
do
if [ `grep "$IP" -i $FILE_PATH|wc -l` -eq 0 ] ; then
echo "$IPS" >> $FILE_PATH
echo "$IP 加入黑名单"
fi
done
echo "nginx重新加载配置"
/usr/sbin/nginx -s reload
</code>
以上脚本我写入到一个check_black_ip.sh文件里面,给个执行权限 chomod +x check_black_ip.sh,然后加入到crontab里面定时执行就可以了。这个脚本是在没有使用负载均衡或者代理转发的情况下有效果,如果本身请求是经过了代理或者负载均衡就要参考下nginx map 根据http_x_forwarded_for来加黑(白)名单的实现了。
更多>>