Skip to content

撰寫可以自動封鎖 ssh error 和 nginx 破解的 sh

Published: at 下午07:08

探討使用 sh 腳本和 crontab來自動封鎖 SSH 失敗和 Nginx 破解。 這些方法可以增強伺服器安全性,防止不必要的入侵。

主要是阻擋 ssh 亂連 和 nginx 呼叫 400 404 五次以上

  1. 創建一個 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
  1. 使腳本可執行:
chmod +x block_failed_ips.sh
  1. 打開 cron 定時器:
crontab -e
  1. 在 cron 文件中添加以下條目,使腳本每五分鐘自動運行:
*/5 * * * * /bin/bash -c   '/path/to/block_failed_ips.sh' >> /tmp/log.txt 2>&1