探討使用 sh 腳本和 crontab來自動封鎖 SSH 失敗和 Nginx 破解。 這些方法可以增強伺服器安全性,防止不必要的入侵。
主要是阻擋 ssh 亂連 和 nginx 呼叫 400 404 五次以上
- 創建一個 Shell 腳本 block_failed_ips.sh:
#!/bin/bash
# 設定閾值
threshold=5
# 讀取過去一小時的 auth.log,查找連接失敗的 IP
failed_ips=$(grep "$(date --date='-1 hour' '+%b %e %H:')" /var/log/auth.log | grep 'sshd.*Failed' | grep -oP '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort -u)
# 從 nginx 日誌中獲取 HTTP 狀態 400 的 IP
nginx_log_file="/var/log/nginx/access.log"
if [ -f "$nginx_log_file" ]; then
status_400_ips=$(awk '$9 ~ /^(400|404)$/ {print $1}' $nginx_log_file | sort | uniq -c | awk -v threshold=$threshold '$1 >= threshold {print $2}')
else
status_400_ips=""
fi
# 結合兩個 IP 列表
ips_to_block=$(echo -e "$failed_ips\n$status_400_ips" | sort | uniq)
# 創建日誌目錄
log_dir="$(dirname $0)/block_log"
mkdir -p $log_dir
# 設置日誌文件名
log_file="$log_dir/$(date '+%Y-%m-%d_%H-%M-%S').log"
# 設定要跳過的 IP
skip_ips=("127.0.0.1" "127.0.0.2")
# 遍歷 IP 列表,印出並使用 ufw 封鎖,將封鎖的 IP 寫入日誌文件
for ip in $ips_to_block; do
if ! sudo ufw status verbose | grep -q "$ip"; then
skip=false
for skip_ip in "${skip_ips[@]}"; do
if [ "$ip" == "$skip_ip" ]; then
skip=true
break
fi
done
if ! $skip; then
echo "Blocking IP: $ip"
echo $ip >> $log_file
sudo ufw deny from $ip
fi
fi
done
# 重新加載 ufw 以應用新規則
sudo ufw reload
- 使腳本可執行:
chmod +x block_failed_ips.sh
- 打開 cron 定時器:
crontab -e
- 在 cron 文件中添加以下條目,使腳本每五分鐘自動運行:
*/5 * * * * /bin/bash -c '/path/to/block_failed_ips.sh' >> /tmp/log.txt 2>&1