Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 使用 Cron 定時腳本自動封鎖 Web 攻擊 IP 實戰

編輯:Linux 教學

前言

面對大量惡意請求(如暴力破解 wp-login、CC 攻擊),透過分析 Nginx/Apache 存取日誌,自動識別高頻異常 IP 並加入 iptables 封鎖,是低成本有效的應急防禦手段。

腳本設計邏輯

  • 掃描指定日誌檔(支援多站點)
  • 統計最近 N 筆請求中,單一 IP 請求次數超過閾值者判定為攻擊 IP
  • 排除白名單(如管理員 IP、已知爬蟲)
  • 檢查 iptables 是否已封鎖,未封則新增 DROP 規則
  • 支援針對特定頁面(wp-login.php、wp-comments-post.php)與全站統計

部署步驟

1. 建立腳本檔案


mkdir -p /opt/scripts
vi /opt/scripts/block_attack_ips.sh

2. 腳本內容(完整可用版)


#!/bin/bash
# 封鎖高頻攻擊 IP 腳本
# 作者:參考社區優化版
# 用途:分析 access.log,自動封鎖異常 IP

# ===== 配置區 =====
LOGFILES=(
    "/var/log/nginx/site1_access.log"
    "/var/log/nginx/site2_access.log"
)
# 白名單:從 last 取得近期登入 IP,避免誤封自己
WHITELIST=$(last | awk '{print $3}' | grep -E '^[0-9]' | sort -u | xargs)

# 閾值設定
POST_LOGIN_THRESHOLD=100      # wp-login.php 10000筆中超過100次
POST_COMMENT_THRESHOLD=100    # wp-comments-post.php 同
ALL_REQUEST_THRESHOLD=1000    # 全站 10000筆中超過1000次
TAIL_LINES=10000              # 分析最近多少行
# ====================

check_root() {
    if [[ $EUID -ne 0 ]]; then
        echo "ERROR: This script must run as root"
        exit 1
    fi
}

block_ips() {
    local blacklist=("$@")
    if [[ ${#blacklist[@]} -eq 0 ]]; then return; fi

    for ip in "${blacklist[@]}"; do
        # 跳過白名單
        if echo "$WHITELIST" | grep -wq "$ip"; then
            echo "SKIP: $ip in whitelist"
            continue
        fi
        # 檢查是否已封鎖
        if iptables-save | grep -wq "$ip"; then
            echo "SKIP: $ip already blocked"
            continue
        fi
        echo "BLOCK: $ip"
        iptables -I INPUT -s "$ip"/32 -p tcp -m tcp --dport 80 -j DROP
        iptables -I INPUT -s "$ip"/32 -p tcp -m tcp --dport 443 -j DROP
    done
}

analyze_log() {
    local logfile="$1"
    [[ ! -f "$logfile" ]] && { echo "WARN: $logfile not found"; return; }

    # 1. 針對登入頁
    local cmd="grep -w POST '$logfile' | tail -n $TAIL_LINES | grep -w 'wp-login.php' | awk '{print \$1}' | sort | uniq -c | awk '(\$1 > $POST_LOGIN_THRESHOLD){print \$2}'"
    local blacklist=($(eval "$cmd"))
    block_ips "${blacklist[@]}"

    # 2. 針對留言頁
    cmd="grep -w POST '$logfile' | tail -n $TAIL_LINES | grep -w 'wp-comments-post.php' | awk '{print \$1}' | sort | uniq -c | awk '(\$1 > $POST_COMMENT_THRESHOLD){print \$2}'"
    blacklist=($(eval "$cmd"))
    block_ips "${blacklist[@]}"

    # 3. 全站總請求
    cmd="tail -n $TAIL_LINES '$logfile' | awk '{print \$1}' | sort | uniq -c | awk '(\$1 > $ALL_REQUEST_THRESHOLD){print \$2}'"
    blacklist=($(eval "$cmd"))
    block_ips "${blacklist[@]}"
}

main() {
    check_root
    for logfile in "${LOGFILES[@]}"; do
        analyze_log "$logfile"
    done
}

main "$@"

3. 賦予執行權限


chmod +x /opt/scripts/block_attack_ips.sh

4. 加入 Crontab 定時執行(每 5 分鐘)


vi /etc/crontab
# 加入:
*/5 * * * * root /opt/scripts/block_attack_ips.sh >> /var/log/block_attack_ips.log 2>&1

# 每天凌晨 1 點重置 iptables(避免規則過多影響效能,視需求決定)
0 1 * * * root /etc/init.d/iptables restart

或使用 crontab -e(root 身分):


*/5 * * * * /opt/scripts/block_attack_ips.sh >> /var/log/block_attack_ips.log 2>&1
0 1 * * * /sbin/iptables -F && /sbin/iptables-save > /etc/sysconfig/iptables

進階優化建議

  1. 日誌輪轉配合:確保 logrotate 不會切斷腳本分析窗口,建議日誌保留至少 10 萬行。
  2. 白名單機制強化:維護固定白名單檔 /opt/scripts/whitelist.txt,包含辦公室 IP、監控伺服器、CDN 回源 IP。
  3. 封鎖通知:封鎖時發送郵件或 Webhook 通知管理員。
  4. 持久化儲存:封鎖規則寫入 /etc/sysconfig/iptables 或使用 ipset 管理大量 IP。
  5. 整合 Fail2ban:生產環境建議直接部署 Fail2ban,功能更完善(支援多協定、遞增封禁時間、解封機制)。

驗證測試


# 手動執行測試
/opt/scripts/block_attack_ips.sh

# 查看封鎖規則
iptables -L INPUT -n -v | grep DROP

# 模擬攻擊測試(另一台機器)
for i in {1..200}; do curl -s https://target_ip/wp-login.php; done
# 等待 5 分鐘後檢查是否被封鎖

注意事項

  • 腳本需 root 權限操作 iptables。
  • 高流量站點建議調大 TAIL_LINES 與閾值,避免誤封正常用戶。
  • 若使用 CDN(Cloudflare 等),日誌中 client IP 為 CDN 邊緣節點,需解析 X-Forwarded-For 或使用 CDN 官方防護。
  • iptables 規則過多(超過數萬)會影響網路效能,大規模封鎖請改用 ipset。

總結

此方案適合中小型站點作為輕量級應急防禦。長期運維建議導入 WAF(ModSecurity、OpenResty+Lua)、CDN 防護或專業抗 DDoS 服務,構建多層次防禦體系。

Copyright © Windows教程網 All Rights Reserved