你還在花錢(qián)防御DDoS?巧用iptables 5招免費(fèi)搞定 SYN洪水攻擊!
SYN Flood (SYN洪水) 是種典型的DoS (Denial of Service,拒絕服務(wù)) 攻擊,屬于DDos攻擊的一種。遭受攻擊后服務(wù)器TCP連接資源耗盡,停止響應(yīng)正常的TCP連接請(qǐng)求。盡管這種攻擊已經(jīng)出現(xiàn)了十多年,但它的變種至今仍能看到。雖然能有效對(duì)抗SYN洪泛的技術(shù)已經(jīng)存在,但是沒(méi)有對(duì)于TCP實(shí)現(xiàn)的一個(gè)標(biāo)準(zhǔn)的補(bǔ)救方法出現(xiàn)。今天小編將詳述這種攻擊原理以及對(duì)抗SYN洪水的方法~
攻擊原理
正常的三次握手:
- 先發(fā)起一個(gè) SYN=1 的包,并且?guī)б粋€(gè)序列號(hào)( Seq );
- 服務(wù)器收到這個(gè)包以后,將這個(gè)數(shù)據(jù)放入到一個(gè)隊(duì)列中,這個(gè)隊(duì)列叫 syn_table 。并且發(fā)送一個(gè)返回包,作為響應(yīng),這個(gè)返回包有自己的序列號(hào)( Seq ),以及一個(gè) Ack , Ack 的值就是客戶(hù)端發(fā)來(lái)的 Seq 值加一;
- 客戶(hù)端收到返回信息以后,將服務(wù)器的 Seq 加一作為 Ack 又發(fā)給服務(wù)器;
- 服務(wù)器收到這第三個(gè)包,驗(yàn)證沒(méi)問(wèn)題以后,就將這個(gè)連接放入到 request_sock_queue,三次握手完成。

SYN Flood 主要是利用了TCP協(xié)議的三次握手的缺陷,在這個(gè)攻擊中,F(xiàn)lood帶有一系列的syn數(shù)據(jù)包,每個(gè)數(shù)據(jù)包都會(huì)導(dǎo)致服務(wù)端發(fā)送SYN-ACK響應(yīng),然后服務(wù)器等待SYN+ACK之后的第三次握手ACK,由于客戶(hù)端是軟件生成的虛擬IP,永遠(yuǎn)不會(huì)再發(fā)送ACK響應(yīng)服務(wù)端,服務(wù)端會(huì)利用從傳機(jī)制直到超時(shí)后刪除,整個(gè)系統(tǒng)資源也會(huì)被隊(duì)列積壓消耗,導(dǎo)致服務(wù)器無(wú)法對(duì)正常的請(qǐng)求進(jìn)行服務(wù)。

如何判斷自己是否遭受 SYN 攻擊?
檢測(cè)SYN攻擊非常的簡(jiǎn)單,當(dāng)你在服務(wù)器上看到大量的半連接狀態(tài)時(shí),特別是源IP地址是隨機(jī)的,基本上可以斷定這是一次SYN攻擊。我們使用系統(tǒng)自帶的netstat 工具來(lái)檢測(cè)SYN攻擊:
- # netstat -n -p TCP
反饋如圖

防御 SYN Flood攻擊
配置iptables規(guī)則
Iptables防火墻我們可以理解為L(zhǎng)inux系統(tǒng)下的訪(fǎng)問(wèn)控制功能,我們可以利用Iptables來(lái)配置一些規(guī)則來(lái)防御這種攻擊。強(qiáng)制SYN數(shù)據(jù)包檢查,保證傳入的tcp鏈接是SYN數(shù)據(jù)包,如果不是就丟棄。
- #iptables -A INPUT -p tcp --syn -m state --state NEW -j DROP
強(qiáng)制檢查碎片包,把帶有傳入片段的數(shù)據(jù)包丟棄。
- #iptables -A INPUT -f -j DROP
丟棄格式錯(cuò)誤的XMAS數(shù)據(jù)包。
- #iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
丟棄格式錯(cuò)誤的NULL數(shù)據(jù)包。
- #iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
當(dāng)Iptables配置完成后我們可以使用nmap命令對(duì)其驗(yàn)證
- # nmap -v -f FIREWALL IP
- # nmap -v -sX FIREWALL IP
- # nmap -v -sN FIREWALL IP
例如:

其他防御方式:
除此之外針對(duì)SYN攻擊的幾個(gè)環(huán)節(jié),我們還可以使用以下處理方法:
方式1:減少SYN-ACK數(shù)據(jù)包的重發(fā)次數(shù)(默認(rèn)是5次)
- sysctl -w net.ipv4.tcp_synack_retries=3
- sysctl -w net.ipv4.tcp_syn_retries=3
方式2:使用SYN Cookie技術(shù)
- sysctl -w net.ipv4.tcp_syncookies=1
方式3:增加backlog隊(duì)列(默認(rèn)是1024):
- sysctl -w net.ipv4.tcp_max_syn_backlog=2048
方式4:限制SYN并發(fā)數(shù):
- iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s