淺談iptables防SYN Flood攻擊和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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux之靜態庫

命名規則: lib 庫的名字 .a 制作步驟 生成對應.o文件 .c .o 將生成的.o文件打包 ar rcs 靜態庫的名字(libMytest.a) 生成的所有的.o 發布和使用靜態庫: 1) 發布靜態 2) 頭文件 文件如下圖所示&…

iptables詳解和練習

防火墻,其實說白了講,就是用于實現Linux下訪問控制的功能的,它分為硬件的或者軟件的防火墻兩種。無論是在哪個網絡中,防火墻工作的地方一定是在網絡的邊緣。而我們的任務就是需要去定義到底防火墻如何工作,這就是防火墻…

Linux之動態庫

命令規則 lib 名字 .so 制作步驟 1)生成與位置無關的代碼(生成與位置無關的代碼) 2)將.o打包成共享庫(動態庫) 發布和使用共享庫 動態庫運行原理: 生成動態庫: gcc -fPIC -c *.c -…

linux下源碼安裝vsftpd-3.0.2

1)在http://vsftpd.beasts.org/網站中查找并下載 vsftpd-3.0.2.tar.gz源碼包 2)如果自己的機器上安裝有yum可以用yum grouplist | less指令查看以下開發環境,當然這一步不做也行 3)拆解源碼包 4)查看源碼包 5)編輯…

Linux之GDB調試命令

gdb啟動 gdb 程序名 l 查看源代碼(默認顯示十行) l 文件名:行數 l 文件名:函數名 添加斷點 break 行數 (b 也行) b 15 if i 15 條件斷點 i b 查看斷點信息 start 程序執行一步 n 單步調試 s 單步&#xf…

Gdb 調試core文件詳解

一,什么是coredump 我們經常聽到大家說到程序core掉了,需要定位解決,這里說的大部分是指對應程序由于各種異常或者bug導致在運行過程中異常退出或者中止,并且在滿足一定條件下(這里為什么說需要滿足一定的條件呢&#…

Linux之GDB命令(二)

gdb命令: 前提條件:可執行文件必須包含調試信息 gcc -ggdb 文件名 –啟動gdb調試查看代碼命令 當前文件: list 行號(函數名) 指定文件: list 文件名:行號(函數名&#x…

Windows下編譯openssl庫

1、概述 OpenSSL是一個開放源代碼的軟件庫包,它實現了 SSL(Secure SocketLayer)和 TLS(Transport Layer Security)協議,所以應用程序可以使用這個包來進行安全通信,避免竊聽,同時確…

Makefile規則介紹

Makefile 一個規則 三要素:目標,依賴,命令 目標:依賴命令 1、第一條規則是用來生成終極目標的規則 如果規則中的依賴不存在,向下尋找其他的規則 更新機制:比較的是目標文件和依賴文件的時間 兩個函…

windows環境下C語言socket編程

最近由于實驗需要,要求寫一個c程序與java程序通信的軟件,為了測試首先寫了一個windows環境下c語言的socket(tcp)通信程序。 首先socket通信的步驟: 圖一 socket通信步驟(轉載) 圖二 三次握手協議&…

進程控制塊(PCB)

進程控制塊PCB 我們知道,每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。 /usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct…

網絡層攻擊防御

網絡層攻擊防御 網絡層攻擊防御主要分為以下三類: TCP類報文攻擊防御 UDP類報文攻擊防御 ICMP類報文攻擊防御 TCP類報文攻擊防御 TCP正常的交互過程: 圖:TCP正常交互過程 在TCP/IP協議中,TCP協議提供可靠的連接服務&#xff0c…

Linux之環境變量

常見環境變量 按照慣例,環境變量字符串都是namevalue這樣的形式,大多數name由大寫字母加下劃線組成,一般把name的部分叫做環境變量,value的部分則是環境變量的值。環境變量定義了進程的運行環境,一些比較重要的環境變量…

環境變量操作函數

getenv獲取環境變量值的函數&#xff1b; setenv改變或者添加環境變量函數&#xff1b; unsetenv 取消環境變量&#xff1b; &#xff08;可以在終端上man 函數名來獲取詳細的函數信息&#xff09; #include<stdio.h> #include<stdlib.h> #include<string.h>…

Makefile(三)

在平時使用中&#xff0c;可以使用以下的makefile來編譯單獨的代碼 src $(wildcard *.c) obj $(patsubst %.c, %.o, $(src))CC gcc CFLAGS -Wall -gall:$(target)$(target):%:%.c$(CC) $< -o $ $(CFLAGS).PHONY: clean all clean:-rm -rf $(target) 使用方法就是make 后…

位運算(C++)

C輸出十六進制 #include<iostream> #include<iomanip> using namespace std;int main() {int a 60;int b 13;int c a &b;cout << "a : hex "<<hex << a << endl;cout << "b : hex "<<hex <<…

數學函數(C/C++)

C中包含頭文件<math.h> C包含頭文件<cmath> 函數 double cos&#xff08;double&#xff09; 該函數返回弧度角&#xff08;double型&#xff09;的余弦 double tan&#xff08;double&#xff09; 該函數返回弧度角&#xff08;double型&#xff09;的正切…

數據類型(C++)

不同系統會有不同差異&#xff1a; 類型 位(byte) 范圍 char 1 -128—127 or 0 – 255 unsigned char 1 0 – 255 signed int 1 -128—127 int 4 -2^31 – 2^32-1 unsigned int 4 0 – 2^32 signed int 4 -2^31 – 2^32-1 short int 2 2^15 – 2^15-1 …

日期與時間(C/C++)

C繼承了C語言用于日期和時間操作的結構和函數&#xff0c;使用之前程序要引用<ctime>頭文件 有四個與時間相關的類型:clock_t、time_t、size_t、和tm。類型clock_t、size_t、和time_t能夠把系統時間和日期表示為某種整數。 結構體tm把時間和日期以C結構的形式保存&#x…

標準輸入輸出(C++)

輸入輸出流函數&#xff08;模板&#xff09; #include<iostream> #include<iomanip> using namespace std; int main() {cout << setiosflags(ios::left|ios::showpoint); //設左對齊cout.precision(5); //設置除小數…