面對 SYN Flood、CC 等 DDoS 攻擊,Linux 管理員需具備快速檢測連接異常、調整核心網路參數、配置防火牆封鎖的能力。本文提供從 netstat 狀態分析到 sysctl 參數調優、iptables 封鎖策略的完整實戰手冊。
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
# 輸出範例:
# SYN_RECV 150
# ESTABLISHED 80
# TIME_WAIT 200
# 統計 80 埠 SYN_RECV 數量
netstat -n -p -t | grep SYN_RECV | grep :80 | wc -l
# 列出所有 SYN_RECV 來源 IP
netstat -n -p -t | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
| 狀態 | 含義 | 異常判斷 |
|---|---|---|
| SYN_RECV | 收到 SYN,等待 ACK(半連接) | 大量不同 IP 為 SYN Flood |
| TIME_WAIT | 主動關閉端等待 2MSL | 過多可能為攻擊或需調優 |
| ESTABLISHED | 正常傳輸 | 單 IP 連接數異常高為 CC 攻擊 |
| FIN_WAIT1/2 | 關閉握手中 | - |
編輯 /etc/sysctl.conf 加入:
# 啟用 SYN Cookie(核心 2.6+ 預設開啟)
net.ipv4.tcp_syncookies = 1
# 增加半連接隊列長度(預設 1024,視記憶體調大)
net.ipv4.tcp_max_syn_backlog = 2048
# 減少 SYN+ACK 重試次數(預設 5,攻擊時降為 1-2)
net.ipv4.tcp_synack_retries = 2
# 減少主動發起 SYN 重試次數
net.ipv4.tcp_syn_retries = 2
# 縮短 SYN_RECV 超時時間(預設 60s)
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 30
套用:sysctl -p。未受攻擊時不建議激進修改,可能增加正常連接失敗率。
iptables -I INPUT -s 211.1.0.0 -j DROP
iptables -I INPUT -s 211.1.0.0/16 -j DROP
iptables -I INPUT -s 61.37.80.0/24 -j DROP
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j REJECT
# CentOS 6
service iptables save
# CentOS 7 / RHEL 7
iptables-save > /etc/sysconfig/iptables
# 或
service iptables save
# 抓取 80 埠前 1000 個封包,統計來源 IP TOP 20
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -20
netstat 狀態,異常告警;tcp_syncookies,攻擊時動態調整 syn_backlog、synack_retries;limit_req_zone、limit_conn_zone、WAF 規則;工欲善其事,必先利其器。平時熟練掌握檢測指令,戰時才能從容應對。
