萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 防禦 DDoS 實戰:從 SYN Flood 缓解到 ICMP 封鎖與 ipset 黑名單

威脅模型:常見攻擊向量

  • SYN Flood:利用 TCP 三次握手機制,發送大量偽造源 IP 的 SYN 封包,耗盡伺服器半連接隊列,導致正常連接無法建立。
  • ICMP Flood / Ping of Death:大量 ICMP Echo Request 佔用頻寬與 CPU。
  • 應用層攻擊 (CC/HTTP Flood):模擬正常用戶行為,耗盡應用資源 (PHP-FPM、DB 連接池)。

第一道防線:核心參數調優 (抗 SYN Flood)

修改 /etc/sysctl.d/99-ddos-hardening.conf 並執行 sysctl --system 生效:

# 擴大半連接隊列容量 (預設 1024/128,視核心版本)
net.ipv4.tcp_max_syn_backlog = 8192

# 啟用 SYN Cookies (核心機制,不分配 socket 結構體即可驗證 ACK)
net.ipv4.tcp_syncookies = 1

# 減少 SYN+ACK 重試次數 (預設 5,加快釋放半連接)
net.ipv4.tcp_synack_retries = 2

# 減少主動發起連接的 SYN 重試 (客戶端行為,可選)
net.ipv4.tcp_syn_retries = 3

# 啟用 TCP Fast Open (TFO) 減少握手延遲 (核心 3.7+)
net.ipv4.tcp_fastopen = 3

# 防止 TCP 時間等待堆積
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

第二道防線:ICMP 速率限制與封鎖

方法一:核心參數 (全局)

# 完全禁用 Ping 回應 (隱藏主機)
net.ipv4.icmp_echo_ignore_all = 1

# 或 僅限制速率 (推薦,保留診斷能力)
net.ipv4.icmp_ratelimit = 100          # 最小間隔 100ms (10pps)
net.ipv4.icmp_ratemask = 6168          # 僅限制 Echo Request (type 8) 等特定類型

方法二:iptables 精細控制 (推薦生產環境)

# 允許每秒 6 個 ICMP Echo Request,突發 2 個,其餘拒絕
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 6/s --limit-burst 2 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable

# 保留必要的 ICMP 類型 (不可達、超時、參數問題) - PMTUD 依賴此類
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT

第三道防線:ipset + iptables 高效 IP 黑名單 (應對海量惡意 IP)

單純用 iptables 加成千上萬條 -s IP -j DROP 規則會嚴重拖慢封包處理 (O(N) 線性匹配)。ipset 使用哈希表/位圖實現 O(1) 查找。

部署步驟

# 1. 安裝
apt/dnf install ipset iptables

# 2. 建立集合 (hash:net 支援 CIDR 區段)
ipset create blacklist hash:net maxelem 1000000

# 3. 加入惡意 IP/網段
ipset add blacklist 192.168.1.100
ipset add blacklist 10.0.0.0/8

# 4. 掛載至 iptables (單條規則匹配整個集合)
iptables -I INPUT -m set --match-set blacklist src -j DROP

# 5. 持久化 (重啟後自動載入)
ipset save > /etc/ipset/blacklist.set
# 在啟動腳本/服務中執行: ipset restore < /etc/ipset/blacklist.set
# iptables 規則持久化: iptables-save > /etc/iptables/rules.v4

自動化威脅情報餵養

使用 iblocklist2ipset 等工具自動抓取公開威脅情報 (如 AbuseIPDB、Spamhaus、Emerging Threats) 並轉換為 ipset 格式:

pip install iblocklist2ipset
iblocklist2ipset generate --ipset blacklist "https://lists.blocklist.de/lists/all.txt" > blacklist.txt
ipset restore -f blacklist.txt

第四道防線:應用層防護 (超出本文範圍但必須提及)

  • Nginx limit_req/limit_conn:限制單 IP 請求率/並發連接數。
  • WAF (ModSecurity/Coraza):規則引擎攔截 SQLi、XSS、掃描器特徵。
  • CDN/雲端防護 (Cloudflare, AWS Shield, Akamai):清洗大流量攻擊於邊緣節點,源站隱藏真實 IP。

總結防禦分層策略

層級技術應對威脅關鍵指標
核心網路堆疊sysctl TCP/ICMP 參數SYN Flood, ICMP Flood半連接隊列溢出率, CPU 使用率
主機防火牆iptables + ipset已知惡意 IP, 掃描器, 暴力破解黑名單命中率, 規則匹配延遲
應用層Nginx/WAF/Rate LimitCC 攻擊, API 濫用, 爬蟲QPS, 錯誤率, 延遲 P99
邊緣/雲端CDN/DDoS 防護服務大流量體積型攻擊 (>10Gbps)清洗能力, 誤封率

原則:盡早攔截 (核心層 > 主機層 > 應用層 > 邊緣層),善用高效資料結構 (ipset),自動化威脅情報更新,建立監控告警閉環。

copyright © 萬盛學電腦網 all rights reserved