1. 程式人生 > >淺談iptables防SYN Flood攻擊和CC攻擊

淺談iptables防SYN Flood攻擊和CC攻擊

------------------------本文為自己實踐所總結,概念性的東西不全,這裡粗劣提下而已,網上很多,本文主要說下目前較流行的syn洪水攻擊和cc攻擊-------------------------------------

何為syn flood攻擊:

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

  正常原理是: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攻擊。

何為CC攻擊:

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

 攻擊檢測:

  當你發現發伺服器很卡,web訪問很慢 甚至連SSH操作都開始有點卡的時候,你就要非常注意了。

  檢測可以這樣做:

  top 檢視CPU使用率和CPU負載情況

      負載一般小於CPU核數*0.7算正常,負載內等於或者稍大於核數。說明CPU負載開始嚴重了,如果超過,說明有問題。

      看看哪些程式CPU使用率較高,是否為正常佔用,可以使用 pidof 程序名 檢視該程序名的所有程序號,然後ll /proc/程序號/exe、fd檢視是否為正常資訊。

  netstat檢視埠狀態

       netstat -n | grep "^tcp" | awk '{print $6}' | sort  | uniq -c | sort -n

         1 SYN_RECV

         13 FIN_WAIT1

         64 TIME_WAIT
         149 ESTABLISHED

     可以檢視當前連線狀態的數量,從而進行判斷。

         還有vmstat、sar、等檢測命令,網上有使用方法!

Syn Flood 一般的防禦:

    第一種:縮短SYN Timeout時間,由於SYN Flood攻擊的效果取決於伺服器上保持的SYN半連線數,這個值=SYN攻擊的頻度 x SYN Timeout,所以通過縮短從接收到SYN報文到確定這個報文無效並丟棄改連線的時間。

    第二種:設定SYN Cookie,就是給每一個請求連線的IP地址分配一個Cookie,如果短時間內連續受到某個IP的重複SYN報文,就認定是受到了攻擊,以後從這個IP地址來的包會被丟棄。

        (缺陷:縮短SYN Timeout時間僅在對方攻擊頻度不高的情況下生效,SYN Cookie更依賴於對方使用真實的IP地址,如果攻擊者以數萬/秒的速度傳送SYN報文,同時利用ARP欺騙隨機改寫IP報文中的源地址,以上的方法將毫無用武之地。)

    vim /etc/sysctl.conf

    增加或者修改如下:(修改儲存後記得sysctl -p 使之生效)

    net.ipv4.tcp_syncookies = 1

    net.ipv4.tcp_fin_timeout = 1

    net.ipv4.tcp_tw_reuse = 1

    net.ipv4.tcp_max_tw_buckets = 6000

    net.ipv4.tcp_tw_recycle = 1

    net.ipv4.tcp_syn_retries = 1

    net.ipv4.tcp_synack_retries = 1

    net.ipv4.tcp_max_syn_backlog = 262144

    net.core.netdev_max_backlog = 262144

    net.ipv4.tcp_max_orphans = 262144

    net.ipv4.tcp_keepalive_time = 30

 

 

  iptables性質防禦:

  限制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

  Tips:攻擊這東西只能防禦不能完全根除!只能緩解,降低到最低的風險。有錢可以上第三方公司的產品服務!嘿嘿。

 

CC攻擊一般防禦:

    1、一般而言,CC攻擊都是真實的IP,所以一般的做法通俗點就是封IP

    2、更改web埠,預設CC攻擊都是攻擊伺服器的80埠  

    3、域名欺騙,我們可以使用cdn等加速工具代理我們的伺服器,從而實現防禦,(網上有人說把域名解析到127.0.0.1 讓攻擊者自己攻擊自己,不知道有沒有用,沒試過。而且正式業務,你怎麼可能去做這樣的解析,那業務怎麼辦?)

    使用抓包命令,抓取訪問伺服器80的IP數  

     tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20

       tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

       listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
       100 packets captured
        101 packets received by filter
        0 packets dropped by kernel
           78 IP 221.239.28.142
                  17 IP 124.65.101.82
                 13 IP 14.123.162.69
                 7 IP 183.238.49.188
                7 IP 120.234.19.186

可以看到221.239.28.142的包最多,所以我們進行封IP處理。

  iptables -I INPUT -s 221.239.28.142 -j REJECT 

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

 (上面recent規則只適用於預設規則為DROP中,如果要適用預設ACCEPT的規則,需要--set放前面 並且無-j ACCEPT)