SYN flooding引發的網路故障

鄭子明發表於2016-02-24

故障現象:

1.應用無法通過外網訪問,應用伺服器所在的內網網段之間(web和db資料庫之間訪問丟包嚴重)不能互相訪問
其他網段正常


2.懷疑是網路裝置問題,將連線該網段裝置的交換機重啟後故障依舊,通過檢視個埠的IP報文資料
發現28號口疑似出現環路現象,接收INPUT資料大大超出傳送OUTPUT資料


28號口連線的是OA伺服器,OA伺服器是一臺放在centos6.3下的apache web伺服器


懷疑連線該伺服器埠或者網線有問題,更換網線和交換機介面後問題依舊




3.拔掉該機器的網線後發現內網恢復正常,問題出在OA伺服器上


但單臺伺服器引起類似環路問題令人費解


4.重啟伺服器後內網恢復正常


5.通過檢視該OA伺服器的日誌/ var/log/messages 發現了部分報錯日誌:

localhost kernel: possible SYN flooding on port 8888. Sending cookies




可能是遭到了syn flood流量惡意訪問




=======================================




SYN Flood是當前最流行的DoS(拒絕服務攻擊)與DDoS(分散式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,傳送大量偽造的TCP連線請求,常用假冒的IP或IP號段發來海量的請求連線的第一個握手包(SYN包),被攻擊伺服器迴應第二個握手包(SYN+ACK包),因為對方是假冒IP,對方永遠收不到包且不會迴應第三個握手包。導致被攻擊伺服器保持大量SYN_RECV狀態的“半連線”,並且會重試預設5次迴應第二個握手包,塞滿TCP等待連線佇列,資源耗盡(CPU滿負荷或記憶體不足),讓正常的業務請求連線不進來。

SYN攻擊是最常見又最容易被利用的一種攻擊手法,也應該算為DDOS攻擊的一種,我們都知道,TCP協議有一個缺陷,華三交換機是經過三次握手後面需要等待確認,傳送很多這樣的連線通訊資料包請求華三交換機,使得CPU資源和記憶體被耗盡,SYN攻擊不但影響著網速和路由器,還對主機本身也產生影響,這種攻擊威力強大,不管對方是什麼系統,只要這些系統開啟了TCP這個埠服務華三交換機就可以進行攻擊。如果在配合IP欺騙,這種攻擊方式會達到非常好的效果。


此次處攻擊的物件為OA伺服器由兩臺centos組成,OA系統本身沒有什麼大的影響,通過內網可以繼續訪問。流量同時打在了連線OA系統的交換機上,該交換機效能較差,導致同網段的windows伺服器如tomcat web服務和sqlserver資料庫伺服器收到牽連掉包驗證而不能正常提供服務,可能是windows伺服器對網路的要求比較高,此時應該更換交換機

後續診斷:

檢查系統syslog:


# tail -f /var/log/messages
Feb 23 09:48:15 localhost kernel: possible SYN flooding on port 8888. 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 612
CLOSE_WAIT 2
FIN_WAIT1 3
FIN_WAIT2 535
ESTABLISHED 257
SYN_RECV 4


應急處理


根據netstat檢視到的對方IP特徵:
# netstat -na |grep SYN_RECV|more


利用iptables臨時封掉最大嫌疑攻擊的IP或IP號段,例如對方假冒173.*.*.*號段來攻擊,短期禁用173.*.*.*這個大號段(要確認小心不要封掉自己的本地IP了!)
# iptables -A INPUT -s  173.0.0.0/8  -p tcp  –dport 80 -j DROP


再分析剛才保留的罪證,分析業務,用iptables解封正常173.*.*.*號段內正常的ip和子網段。這樣應急處理很容易誤傷,甚至可能因為封錯了導致ssh登陸不了伺服器,並不是理想方式。


tcp_synack_retries = 0是關鍵,表示迴應第二個握手包(SYN+ACK包)給客戶端IP後,如果收不到第三次握手包(ACK包)後,不進行重試,加快回收“半連線”,不要耗光資源。


總結:


對於SYN flood攻擊,調整下面三個引數就可以防範絕大部分的攻擊了。




增大tcp_max_syn_backlog  /proc/sys/net/ipv4目錄下tcp_max_syn_backlog檔案
減小tcp_synack_retries   /proc/sys/net/ipv4目錄下tcp_synack_retries
啟用tcp_syncookies
現在的核心預設都是開啟tcp_syncookies的
可以統一通過調整 /etc/sysctl.conf 檔案來調整三個引數:


net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syn_retries = 2


使配置生效:

# sysctl -p


相關文章