iptables 防DDOS攻擊方法


syn flood攻擊:SYN Flood是一種廣為人知的DoS(拒絕服務攻擊)是DDoS(分布式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,發送大量偽造的TCP連接請求,從而使得被攻擊方資源耗盡(CPU滿負荷或內存不足)的攻擊方式(TCP協議的缺陷,所以沒辦法根除,除非重做TCP協議,目前不可能)。

CC攻擊(Challenge Collapsar):CC是DDOS(分布式拒絕服務)的一種,也是一種常見的網站攻擊方法,攻擊者通過代理服務器或者肉雞(被黑客黑的電腦)向受害主機不停地發大量數據包,造成對方服務器資源耗盡,一直到宕機崩潰。CC主要是用來攻擊頁面的,每個人都有這樣的體驗:當一個網頁訪問的人數特別多的時候,打開網頁就慢了,CC就是模擬多個用戶(多少線程就是多少用戶)不停地進行訪問那些需要大量數據操作(就是需要大量CPU時間)的頁面,造成服務器資源的浪費,CPU長時間處於100%,永遠都有處理不完的連接直至就網絡擁塞,正常的訪問被中止。

正常原理是:

1、TCP三次握手,客戶端向服務器端發起連接的時候發送一個包含SYN標志的TCP報文,SYN即同步(Synchronize),同步報文會指明客戶端使用的端口以及TCP連接的初始序號

2、服務器在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgment),夾帶也發送一個SYN包給客戶端,並且服務器分配資源給該連接。

3、客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。

  syn flood攻擊利用TCP三次握手的缺陷,在TCP連接的第三次握手中,當服務器收到客戶端的SYN包后並且返回客戶端ACK+SYN包,由於客戶端是假冒IP,對方永遠收不到包且不會回應第三個握手包。導致被攻擊服務器保持大量SYN_RECV狀態的“半連接”,並且會有重試默認5次回應第二個握手       包,塞滿TCP等待連接隊列,資源耗盡(CPU滿負荷或內存不足),讓正常的業務請求連接不進來。通常SYN Flood會和ARP欺騙一起使用,這樣就造成了SYN攻擊。

緩解攻擊的方法:

限制syn的請求速度(這個方式需要調節一個合理的速度值,不然會影響正常用戶的請求)

    iptables -N syn-flood   (新建一條鏈)

    iptables -A INPUT -p tcp --syn -j syn-flood 

    iptables -A syn-flood  -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN

    iptables -A syn-flood -j DROP

iptabes 其他限制規則:            

#防御太多DOS攻擊連接,可以允許外網每個IP最多15個初始連接,超過的丟棄,第二條是在第一條的基礎上允許已經建立的連接和子連接允許

iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP  (--connlimit-mask 32為主機掩碼,32即為一個主機ip,也可以是網段)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

#抵御DDOS ,允許外網最多24個初始連接,然后服務器每秒新增12個,訪問太多超過的丟棄,第二條是允許服務器內部每秒1個初始連接進行轉發
iptables -A INPUT  -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

#允許單個IP訪問服務器的80端口的最大連接數為 20 

iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 20 -j REJECT 

 #對訪問本機的22端口進行限制,每個ip每小時只能連接5次,超過的拒接,1小時候重新計算次數

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

#對多個ip進行封鎖

例:某服務器被CC攻擊,經過抓包或者一序列手段發現有一批IP是源攻擊ip,因此我們需要封掉這些IP,如果用iptables一條一條加就麻煩些了。
 
#對TIME_WAIT的外部ip以及此對ip出現的次數經行求重排序。
netstat -ptan | grep TIME_WAIT | awk '{print $5}' | awk -F: '{print $1}' |sort |uniq -c | sort -n -r
 
#tcpdump 抓取100個包,訪問本機80的ip進行求重排序  只顯示前20個,數量多的ip可能為攻擊源IP,我們需要封掉它
tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20
 
#新建一個setname.txt文件,以如下格式加入這些ip (有多少個ip就多少行)
vim setname.txt
  add setname xxx.xxx.xxx.xxx
 
#導入setname.txt文件到ipset集
ipset restore -f setname.txt
 
#查看是否導入成功 (成功的話會發現一個新ipset名為 sername,且Members里就是那些攻擊IP)
ipset list
 
#建立一條iptables規則,攔截這些攻擊ip訪問服務器80,也可以直接禁止這些ip的所有訪問
iptables -I INPUT -m set --match-set setname src -p tcp --destination-port 80 -j DROP

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM