🛡 黑盾守門員:我如何打造一套自動反制 SYN Flood 的伺服器防火牆系統(含腳本更新)

本篇介紹一套我親自實作、已成功抵擋上千次攻擊的 自動封鎖系統腳本,專門對付 TCP SYN Flood 攻擊。適用於 Linux + Apache + ipset 環境,完全開源,輕巧高效,歡迎自由使用與改造!


🔥 問題起點:SYN Flood 攻擊讓我 HTTPS 掛點

某天,我的伺服器連線數飆升,Apache 回應延遲,ss -tanp | grep "SYN-RECV" 看到數百條類似這樣的紀錄:

SYN-RECV   0 0 [::ffff:10.140.0.3]:443 [::ffff:179.107.51.201]:37425

這表示 TCP 三次握手被卡住,對方故意不回 ACK,讓伺服器卡在 SYN_RECV 狀態,進而癱瘓。


🧠 我的想法:伺服器需要一個「黑盾守門員」

我需要一個 自動偵測+即時反制 的防火牆腳本,來對抗這種 TCP 層的資源消耗型攻擊。


✅ 黑盾守門員的核心邏輯:

  1. 每分鐘掃描 ss -tanp | grep SYN-RECV 中的連線
  2. 解析來源 IP(含 ::ffff:x.x.x.x 格式)
  3. 每個 IP 若連線數 > 門檻(例如 10),就用 ipset 封鎖
  4. 封鎖一段時間(如一小時),之後自動解除
  5. 可設定白名單,避免誤殺管理者或內網

✍ 最新修正版腳本(支援 IPv6 包裝格式)

請將下列內容儲存為 /usr/local/bin/synflood-defender.sh

#!/bin/bash

IPSET_NAME="blacklist"
IPSET_TIMEOUT=3600
SYN_THRESHOLD=10
WHITELIST=("127.0.0.1" "你的管理員IP")

# 建立 ipset(若尚未存在)
ipset list $IPSET_NAME >/dev/null 2>&1 || ipset create $IPSET_NAME hash:ip timeout $IPSET_TIMEOUT

# 判斷是否白名單
is_whitelisted() {
for white_ip in "${WHITELIST[@]}"; do
[[ "$1" == "$white_ip" ]] && return 0
done
return 1
}

# 掃描 SYN_RECV 並解析 IP
ss -tanp | grep "SYN-RECV" \
| awk '{print $5}' \
| grep -oP '(?<=::ffff:)(\d{1,3}(\.\d{1,3}){3})' \
| sort | uniq -c \
| awk -v thr=$SYN_THRESHOLD '$1 >= thr {print $2}' \
| while read ip; do
if is_whitelisted "$ip"; then
echo "[略過] 白名單 IP:$ip"
continue
fi
echo "[封鎖] $ip 達到 SYN_RECV 門檻,封鎖中..."
ipset add $IPSET_NAME "$ip" timeout $IPSET_TIMEOUT 2>/dev/null
done

# 輸出目前封鎖總數
COUNT=$(ipset list $IPSET_NAME | grep -c 'add ')
echo "[done] 當前 SYN 封鎖 IP 數:$COUNT"

⏰ 自動化建議(每分鐘執行)

請加入 crontab:

sudo crontab -e

加入以下內容:

* * * * * /usr/local/bin/synflood-defender.sh >> /var/log/synflood.log 2>&1

✅ 搭配 iptables DROP 設定(只要設定一次)

sudo iptables -I INPUT -m set --match-set blacklist src -j DROP

🧪 附加工具:查看 SYN 攻擊 IP 排行榜

ss -tanp | grep "SYN-RECV" \
| awk '{print $5}' \
| sed -E 's/.*::ffff:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):.*/\1/' \
| sort | uniq -c | sort -nr | head

🧰 總結與延伸

這套「黑盾守門員」方案,結合了:

  • Linux 原生網路工具(ss + ipset + iptables)
  • 自動化執行(cron)
  • 白名單控管
  • 對 SYN Flood 針對性防禦

適用於 VPS、自架伺服器,或任何可能暴露在公網的 Apache/Nginx 主機上。


📬 最後附註

歡迎轉載或自行改寫本腳本,若你也有實戰經驗與更強化的技巧,歡迎留言交流!如果你覺得「黑盾守門員」有幫助,也歡迎分享給更多站長朋友!

codeant