本篇介紹一套我親自實作、已成功抵擋上千次攻擊的 自動封鎖系統腳本,專門對付 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 層的資源消耗型攻擊。
✅ 黑盾守門員的核心邏輯:
- 每分鐘掃描
ss -tanp | grep SYN-RECV
中的連線 - 解析來源 IP(含
::ffff:x.x.x.x
格式) - 每個 IP 若連線數 > 門檻(例如 10),就用
ipset
封鎖 - 封鎖一段時間(如一小時),之後自動解除
- 可設定白名單,避免誤殺管理者或內網
✍ 最新修正版腳本(支援 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 主機上。
📬 最後附註
歡迎轉載或自行改寫本腳本,若你也有實戰經驗與更強化的技巧,歡迎留言交流!如果你覺得「黑盾守門員」有幫助,也歡迎分享給更多站長朋友!