Linux Shell 腳本功能強大,可自動化分析 Nginx 存取日誌,針對小規模 DDoS 攻擊(如大量 POST 請求消耗資源)進行即時封鎖。本文介紹一個實用的 Shell 腳本範例,透過分析日誌識別攻擊 IP 並自動加入 iptables 封鎖清單。
#!/bin/bash
WEBSITES=(example.com)
minute_now=$(date +%M)
max_connections=50
banips="/wwwdata/jobs/banips.txt"
for site in "${WEBSITES[@]}"; do
access_log_file="/wwwdata/logs/${site}.access.log"
if [ -f "${access_log_file}" ]; then
cat ${access_log_file} | grep POST | awk '{print $1}' | sort | uniq -c | sort -nr > /wwwdata/jobs/ip_records.txt
lines=$(wc -l /wwwdata/jobs/ip_records.txt | awk '{print $1}')
i=1
while [ ${i} -le ${lines} ]; do
ip_record=$(head -${i} /wwwdata/jobs/ip_records.txt | tail -1 | sed 's/^[ \t]*//g')
ip_count=$(echo ${ip_record} | awk '{print $1}')
ip_address=$(echo ${ip_record} | awk '{print $2}')
if [ ${ip_count} -gt ${max_connections} ]; then
banned=$(cat ${banips} | grep ${ip_address} | wc -l)
if [ ${banned} -lt 1 ]; then
iptables -A INPUT -s ${ip_address} -p tcp -m state --state NEW -m tcp --dport 80 -j DROP
echo ${ip_address} >> ${banips}
fi
fi
i=$((i+1))
done
service iptables save
service iptables restart
if [ ${minute_now} -eq 30 ]; then
cat ${access_log_file} >> /wwwdata/logs/olds/${site}.access.log
cat /dev/null > ${access_log_file}
fi
fi
done
if [ ${minute_now} -eq 30 ]; then
service nginx restart
fi
/usr/local/bin/anti_ddos.sh 並賦予執行權限 (chmod +x)。crontab -e 設定每分鐘執行一次:* * * * * /usr/local/bin/anti_ddos.sh。/wwwdata/jobs/banips.txt 確認封鎖清單,誤封 IP 可手動移除並執行 iptables -D INPUT -s -j DROP 解封。透過 Shell 腳本自動分析 Nginx 日誌並動態更新 iptables 規則,可有效緩解小規模 DDoS 攻擊帶來的資源耗盡問題,為伺服器提供第一道自動化防線。
Linux 記憶體緩存釋放實戰:drop_caches 參數詳解、安全釋放流程與自動化策略
Ubuntu 13.10 啟用 VLC 桌面通知:LibNotify 外掛設定完整步驟
Ubuntu 配置 OpenDNS 保護電腦安全:修改 /etc/dhcp/dhclient.conf 指定安全 DNS 伺服器
Fedora 19 安裝 NixNote (Evernote Linux 客戶端) 完整教程
Ubuntu 下 arm-linux-insight 無法設定 Target 兩種解決辦法
Shell 腳本調用另一個腳本的三種方式差異詳解:source、. 與 fork 執行