1.簡介 SYN Flood是當前最流行的DoS(拒絕服務攻擊)與DDoS(分布式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,發送大量偽造的TCP連接請求,常用假冒的IP或IP號段發來海量的請求連接的第一個握手包(SYN包),被攻擊服務器回應第二個握手包(SYN+ACK包),因為對方是假冒IP,對方永遠收不到包且不會回應第三個握手包。導致被攻擊服務器保持大量SYN_RECV狀態的“半連接”,并且會重試默認5次回應第二個握手包,塞滿TCP等待連接隊列,資源耗盡(CPU滿負荷或內存不足),讓正常的業務請求連接不進來。
詳細的原理,網上有很多介紹,應對辦法也很多,但大部分沒什么效果,這里介紹我們是如何診斷和應對的。
2. 診斷 我們看到業務曲線大跌時,檢查機器和DNS,發現只是對外的web機響應慢、CPU負載高、ssh登陸慢甚至有些機器登陸不上,檢查系統syslog:
代碼如下: # tail -f /var/log/messages Apr 18 11:21:56 web5 kernel: possible SYN flooding on port 80. Sending cookies.
檢查連接數增多,并且SYN_RECV 連接特別多: 代碼如下: # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 16855 CLOSE_WAIT 21 SYN_SENT 99 FIN_WAIT1 229 FIN_WAIT2 113 ESTABLISHED 8358 SYN_RECV 48965 CLOSING 3 LAST_ACK 313
根據經驗,正常時檢查連接數如下: 代碼如下: # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 42349 CLOSE_WAIT 1 SYN_SENT 4 FIN_WAIT1 298 FIN_WAIT2 33 ESTABLISHED 12775 SYN_RECV 259 CLOSING 6 LAST_ACK 432
以上就是TCP洪水攻擊的兩大特征。執行netstat -na>指定文件,保留罪證。
3.優化Linux阻擋SYN洪水攻擊 如果在Linux服務器下遭受SYN洪水攻擊,可以進行如下一些設置: 代碼如下: #縮短SYN- Timeout時間: iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT iptables -A INPUT -i eth0 -m limit –limit 1/sec –limit-burst 5 -j ACCEPT #每秒 最多3個 syn 封包 進入 表達為 : iptables -N syn-flood iptables -A INPUT -p tcp –syn -j syn-flood iptables -A syn-flood -p tcp –syn -m limit –limit 1/s –limit-burst 3 -j RETURN iptables -A syn-flood -j REJECT #設置syncookies: sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_max_syn_backlog=3072 sysctl -w net.ipv4.tcp_synack_retries=0 sysctl -w net.ipv4.tcp_syn_retries=0 sysctl -w net.ipv4.conf.all.send_redirects=0 sysctl -w net.ipv4.conf.all.accept_redirects=0 sysctl -w net.ipv4.conf.all.forwarding=0 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 #防止PING: sysctl -w net.ipv4.icmp_echo_ignore_all=1 #攔截具體IP范圍: iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j Drop
|