CentOS SYN Flood攻擊原理Linux下設置
特別值得一提的是CentOS SYN有很多值得學習的地方,這里我們主要介紹CentOS SYN攻擊,包括介紹CentOS SYN 原理等方面。CentOS SYN Flood攻擊利用的是IPv4中TCP協議的三次握手(Three-Way Handshake)過程進行的攻擊。
一:什么是CentOS SYN Flood攻擊
CentOS SYN Flood攻擊利用的是IPv4中TCP協議的三次握手(Three-Way Handshake)過程進行的攻擊。這個協議規定,如果一端想向另一端發起TCP連接,它需要首先發送TCP SYN (synchronize)包到對方。
對方收到后發送一個TCP SYN+ACK包回來,發起方再發送TCP ACK (ACKnowledge Character)包回去,這樣三次握手就結束了。在上述過程中,還有一些重要的概念。
未連接隊列:在三次握手協議中,服務器維護一個未連接隊列,該隊列為每個客戶端的CentOS SYN包 (syn=j)開設一個條目,該條目表明服務器已收到CentOS SYN包,并向客戶發出確認,正在等待客戶的確認包。
這些條目所標識的連接在服務器處于CentOS SYN_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。或者說TCP服務器收到TCP SYN request包時。
在發送TCP SYN+ACK包回TCP客戶機前,TCP服務器要先分配好一個數據區專門服務于這個即把形成的TCP連接。一般把收到CentOS SYN包而還未收到ACK包時的連 接狀態成為半開連接(Half-open Connection)。
Backlog參數:表示未連接隊列的最大容納數目。CentOS SYN -ACK 重傳次數:服務器發送完CentOS SYN -ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數。
系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同。半連接存活時間:是指半連接隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間。
該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間為Timeout時間、CentOS SYN _RECV存活時間。在最常見的CentOS SYN Flood攻擊中,攻擊者在短時間內發送大量的TCP SYN包給受害者,這時攻擊者是TCP客戶機,受害者是TCP服務器。
根據上面的描述,受害者會為每個TCP SYN包分配一個特定的數據區,只要這些CentOS SYN 包具有不同的源地址(這一點對于攻擊者來說是很容易偽造的)。這把給TCP服務器系統造成很大的系統負擔, 最終導致系統不能正常工作。
二:CentOS SYN Cookie原理
能夠有效防范CentOS SYN Flood攻擊的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk發明。CentOS SYN Cookie是對TCP服務器端的三次握手協議作一些修改,專門用來防范CentOS SYN Flood攻擊的一種手段。
它的原理是, 在TCP服務器收到TCP SYN包并返回TCP SYN+ACK包時,不分配一個專門的數據區,而是根據這個CentOS SYN包計算出一個cookie值。在收到TCP ACK包時,TCP服務器在根據那個cookie值檢查這個TCP ACK包的合法性。
如果合法,再分配專門的數據區進行處理未來的TCP連接。下面分Linux和FreeBSD來說說如何配置內核參數來實現CentOS SYN Cookie
三:Linux下設置
如果你的服務器配置不太好,TCP TIME_WAIT套接字數量達到兩、三萬,服務器很容易被拖死。通過修改Linux內核參數,可以減少服務器的TIME_WAIT套接字數量。
TIME_WAIT可以通過以下命令查看:以下是代碼片段:netstat -an | grep "TIME_WAIT" | wc -l 在Linux下,如CentOS,可以通過修改/etc/sysctl.conf文件來達到目的。
增加以下幾行:以下是代碼片段:
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_keepalive_time = 1200
- net.ipv4.tcp_syncookies = 1
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_tw_recycle = 1
- net.ipv4.ip_local_port_range = 102465000
- net.ipv4.tcp_max_syn_backlog = 8192
- net.ipv4.tcp_max_tw_buckets = 5000
- net.ipv4.tcp_synack_retries = 2
- net.ipv4.tcp_syn_retries = 2
說明:
net.ipv4.tcp_syncookies = 1 表示開啟CentOS SYN Cookies,這是個BOOLEAN。當出現CentOS SYN等待隊列溢出時,啟用cookies來處理,可防范少量CentOS SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用,這是個BOOLEAN。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,這是個BOOLEAN,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。單位為秒。
net.ipv4.tcp_keepalive_time = 1200 表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為20分鐘。單位為秒。
net.ipv4.ip_local_port_range = 102465000 表示用于向外連接的端口范圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示CentOS SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_tw_buckets = 5000 表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除并打印警告信息。
默認為180000,改 為5000。對于Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對于Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_synack_retries和net.ipv4.tcp_syn_retries是定義CentOS SYN重試次數。 執行以下命令使配置生效:以下是代碼片段:/sbin/sysctl -p 如果你不想修改/etc/sysctl.conf,你也可以直接使用命令修改:以下是代碼片段:/sbin/sysctl -w key=value
四:FreeBSD下設置
yayu個人學習的觀點:FreeBSD中對CentOS SYN的防御和Linux下可能不一樣,配置的參數也不完全相同,相關配置和理解可能不對:)TCP鏈接中有一個MSL(max segment lifetime)的概念,也就是最大生成時間,MSL 的值在一般的實現中取30s,有些實現采用2分鐘。
在TCP的狀態機中的“被動關閉”:從CLOSE_WAIT到LAST_ACK中有一個如下的規則:當 TCP執行一個主動關閉,并發回最后一個ACK,該連接必須在TIME_WAIT狀態停留的時間為2倍的MSL。這樣可讓TCP再次發送最后的ACK以防 這個ACK丟失(另一端超時并重發最后的 FIN)。
存在這個規則導致一個后果就是在這個2*MSL的時間內,該地址上的鏈接(客戶端地址、端口和服務器端的地址、端口)不能被使用。比如我們在建立一個鏈接后關閉鏈接然后迅速重啟鏈接,那么就會出現端口不可用的情況。
TIME_WAIT時間是2*MSL。因此可以通過調整net.inet.tcp.msl來減少TIME_WAIT時間。對于Web服務器完全可以將這個值調整為7500或2000(訪問一個web,超過4~15秒頁面還刷不出來,就可以考慮放棄了-_-)
參數設置參考:
以下是引用片段:net.inet.tcp.syncookies=1防止DOS攻擊net.inet.tcp.msl=7500防止DOS攻擊,默認為30000net.inet.tcp.blackhole=2接收到一個已經關閉的端口發來的所有包,直接drop,如果設置為1則是只針對TCP包
net.inet.udp.blackhole=1接收到一個已經關閉的端口發來的所有UDP包直接dropFreeBSD下,yayu沒看見“/sbin/sysctl -p”這樣的命令可以使/etc/sysctl.conf的內容生效,所以直接使用命令了:
以下是代碼片段:sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
五:其他
除了修改服務器的內核參數,還可以修改apache的配置文件中的Timeout、KeepAlive、MaxClients等參數來防止Dos攻擊,如果有接口調用,還要注意控制一下調用的時間。請聽下文分解。
ACK 英文縮寫: ACK (ACKnowledge Character) 中文譯名: 確認字符 分 類: 傳輸與接入 解 釋: 在數據通信傳輸中,接收站發給發送站的一種傳輸控制字符。它表示確認發來的數據已經接受無誤。
NAK是否定應答或者非應答的縮寫。它是一個用于數字通信中確認數據受到但是有小錯誤的信號。有時候NAK信號也叫REJ(拒絕)。
CentOS SYN 包(synchronize)
TCP連接的第一個包,非常小的一種數據包。CentOS SYN 攻擊包括大量此類的包,由于這些包看上去來自實際不存在的站點,因此無法有效進行處理。每個機器的欺騙包都要花幾秒鐘進行嘗試方可放棄提供正常響應。
在黑客攻擊事件中,CentOS SYN攻擊是最常見又最容易被利用的一種攻擊手法。CentOS SYN攻擊屬于DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和內存資源。
CentOS SYN攻擊除了能影響主機外,還可以危害路由 器、防火墻等網絡系統,事實上CentOS SYN攻擊并不管目標是什么系統,只要這些系統打開TCP服務就可以實施。服務器接收到連接請求(syn= j),將此信息加入未連接隊列,并發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。
當服務器未收到客戶端的確認包時,重 發請求包,一直到超時,才將此條目從未連接隊列刪除。配合IP欺騙,CentOS SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向服 務器不斷地發送syn包,服務器回復確認包,并等待客戶的確認。
由于源地址是不存在的,服務器需要不斷的重發直至超時,這些偽造的CentOS SYN包將長時間占用未 連接隊列,正常的CentOS SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。
關于CentOS SYN攻擊防范技術,人們研究得比較早。歸納起來,主要有兩大類,一類是通過防火墻、路由器等過濾網關防護,另一類是通過加固TCP/IP協議棧防范.但必須清楚的是,CentOS SYN攻擊不能完全被阻止,我們所做的是盡可能的減輕CentOS SYN攻擊的危害,除非將TCP協議重新設計。
【編輯推薦】