本文介紹幾種利用Nginx日志監(jiān)控惡意訪問的方法,有效提升服務(wù)器安全性。
方法一:利用limit_req模塊限制訪問頻率
nginx的limit_req模塊可限制單個IP在特定時間段內(nèi)的請求次數(shù)。例如,設(shè)定每分鐘最多20次請求,超過則返回503錯誤。
http { limit_req_zone $binary_remote_addr zone=onelimit:10m rate=20r/m; server { ... location / { limit_req zone=onelimit burst=5 nodelay; limit_req_log_level warn; } } }
方法二:使用deny模塊屏蔽高頻訪問IP
針對瞬時高并發(fā)攻擊,deny模塊結(jié)合監(jiān)控腳本可有效阻止特定IP。腳本定時分析日志,更新需要屏蔽的IP列表,并重新加載Nginx配置。
示例配置及腳本(php):
- 創(chuàng)建blocksip.conf文件,存儲需屏蔽的IP地址。
- 使用php腳本(例如blocksip.php)分析Nginx日志,將訪問次數(shù)超過閾值的IP添加到blocksip.conf,并重啟Nginx。
<?php $blockFile = "/etc/nginx/blocksip.conf"; $logs = ["/var/log/nginx/access-site1.log", "/var/log/nginx/access-site2.log"]; $blocks = file_get_contents($blockFile); $n = 0; foreach($logs as $log) { $data = shell_exec("cat $log | awk -F ' ' '{print $1}' | sort | uniq -c | sort -n -r | head -n 20"); $lines = explode(" ", $data); foreach($lines as $line) { list($ip, $count) = explode(" ", $line); if ($count > 10) { file_put_contents($blockFile, "deny $ip; ", FILE_APPEND); } } } ?>
方法三:借助日志分析工具
專業(yè)的日志分析工具能更有效率地監(jiān)控和分析Nginx日志。
示例工具:
- GoAccess: 開源實時日志分析工具,支持多種日志格式。
- elk Stack (Elasticsearch, Logstash, Kibana): 強大的日志分析和可視化平臺。
- Fluentd: 開源數(shù)據(jù)收集器,可將日志推送到監(jiān)控平臺如Prometheus、grafana。
方法四:自定義腳本分析日志并屏蔽惡意IP
可編寫Python等腳本自動識別并屏蔽高頻訪問IP。
示例腳本(bash):
#!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/access.log ABNORMAL_IP=$(tail -n5000 $LOG_FILE | grep $DATE | awk '{a[$1]++} END {for(i in a) if(a[i]>10) print i}') for IP in $ABNORMAL_IP; do if [ $(iptables -vnL | grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP echo "$(date +'%F_%T') $IP" >> /tmp/drop_ip.log fi done
總結(jié):
合理運用以上方法,結(jié)合limit_req、deny模塊和日志分析工具,可以有效監(jiān)控和防御惡意訪問,保障服務(wù)器安全。 選擇何種方法取決于實際需求和技術(shù)能力。