LINUX下SYN FLOOD攻擊及LINUX下SYN攻防簡述

龐順龍發表於2019-05-10

LINUX下SYN攻防戰如下     

(一)SYN攻擊原理

SYN攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過傳送大量的半連線請求,耗費伺服器CPU和記憶體資源。SYN攻擊聊了能影響主機外,還可以危害路由器,防火牆等網路系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統開啟TCP服務就可以實施.我們知道,在網路中兩臺電腦建立TCP連線 時需要進行三次握手過程,客戶端首先向伺服器發關TCP SYN資料包,接著伺服器會向客戶端發關相應的SYN ACK資料包,最後客戶端會以ACK進行響應.從而建立正常的握手過程。在具體的連線細節中,伺服器最早接受到SYN包時,在TCP協議棧中會將相應的半連線記錄新增到佇列中,之後等待接受下面準備握手的資料包,如果握手成功,那麼這個半連線記錄將從佇列中刪除.或者當伺服器未收到客戶端的確認包時,會重發請求包,一直到超時才將此條目從未連線佇列刪除。但是在伺服器中的TCP協議棧中儲存的半連線記錄是有限的,當伺服器受到SYN型的DOS攻擊後,隊 列會很快處於充滿狀態,客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地傳送SYN包,伺服器回覆確認包,並等待客戶的確認,由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列,正常的SYN請求被丟棄,目標系統執行緩慢嚴重者引起網路堵塞甚至系統癱瘓,伺服器隨後就不再接受新的網路連線,從而造成正常的客戶端無法訪問伺服器的情況發生。

(二)實戰SYN攻擊過程

SYN攻擊實現起來非常的簡單,網際網路上有大量面成的SYN攻擊工具可以直接利用.假設在Linux伺服器中安裝了Web服務,在 Linux的命令提示符中執行"service httpd start"命令,即可開啟Web服務,接著執行"netstat -ant | grep 80"命令,可以看到80埠已經處於開啟狀態了.在網路的其它機器上利用SYN攻擊軟體(例如"synkill"等)對Linux伺服器的80埠進行 DOS攻擊,之後在Linux伺服器中執行命令"netstat -ant | grep 80",可以看到大量的網路連線資訊,包括連線的型別,原地址,目標直地址,連線狀態等,當然,因為SYN工具通常會偽告客戶端地址,因此在連線列表中是 找不到真實地址的.在連線狀態中顯示"SYN_RECV",表示當前處於半連線狀態.我們可以每隔幾秒鐘執行命令"netstat -n -p TCP | grep SYN_RECV |grep 80 | wc -l",來檢查某個埠(這裡為80)的未連線佇列的條目數,當發現該條目數增大到某個極大值,並處於平衡狀態時,那麼就很有可能是Linux的TCP協 議棧中的佇列滿了,此時使用者就無法建立新的連線了。

 (三)如可在Linux中防禦SYN型DOS攻擊

在Linux中防禦SYN型DOS攻擊的方法比較常見的有增大佇列SYN最大半連線數,減小超時值,利用SYN cookie技術,過濾可疑的IP地址等常用方法,下面分別進行分析。

(四)增大佇列SYN最大半連線數

在Linux中執行命令"sysctl -a|grep net.ipv4.tcp_max_syn_backlog",在返回的"net.ipv4.tcp_max_syn_backlog=256"中顯示 Linux佇列的最大半連線容量是256.這個預設值對於Web伺服器來說是遠遠不夠的,一次簡單的SYN攻擊就足以將其完全佔用.因此,防禦DOS攻擊 最簡單的辦法就是增大這個預設值,在Linux中執行命令"sysctl -w et.ipv4.tcp_max_syn_backlog=3000",這樣就可以將佇列SYN最大半連線數容量值改為3000了。  

(五)減小超時值

在Linux中建立TCP連線時,在客戶端和伺服器之間建立握手過程中,當伺服器未收到客戶端的確認包時,會重發請求包,一直到超時才將此條目從未連線隊 列是刪除,也就是說半連線存在一定的存活時間,超過這個時間,半連線就會自動斷開,在上述SYN攻擊測試中,當經過較長的的時間後,就會發現一些半連線已經自動斷開了。半連線存活時間實際上是系統所有重傳次數等待的超時時間之和,這個值越大半連線數佔用的Backlog佇列的時間就越長,系統能處理的 SYN請求就越少,因此,縮短超時時間就可以有效防禦SYN攻擊,這可以通過縮小重傳超時時間和減少重傳次數來實現.在Linux中預設的重傳次數為5 次,總超時時間為3分鐘,在Linux中執行命令"sysctl -w net.ipv4.tcp_synack_retries=1",將超時重傳次數設定為。     

(六)利用SYN cookie來防禦DOS攻擊

除了在TCP協議棧中開闢一個記憶體空間來儲存半連線數之外,為避免因為SYN請求數量太多,導致該佇列被填滿的情況下,Linux伺服器仍然可以處理新的SYN連線,可以利用SYN Cookie技術來處理SYN連線。什麼是SYN Cookie呢?SYN Cookie是用一個Cookie來響應TCP SYN請求的,在正常的TCP連線過程中,當伺服器接收一個SYN資料包,就會返回一個SYN -ACK包來應答,然後進入TCP -SYN -RECV(半開放連線)狀態來等待最後返回的ACK包。伺服器用一個資料空間來描述所有未決的連線,然而這個資料空間的大小是有限的,所以攻擊者將塞滿 這個空間,在TCP SYN COOKIE的執行過程中,當伺服器收到一個SYN包的時候,他返回一個SYN -ACK包,這個資料包的ACK序列號是經過加密的,它由TCP連線的源地址和埠號,目標地址和埠號,以及一個加密種子經過HASH計算得出的,然後 伺服器釋放所有的狀態.如果一個ACK包從客戶端返回後,伺服器重新計算COOKIE來判斷它是不是上個SYN -ACK的返回包.如果是的話,伺服器就可以直接進入TCP連線狀態並開啟連線.這樣伺服器就可以避免守候半開放連線了,在Linux中執行命令"echo "echo "1" > / proc/sys/net/ipv4/tcp_syncookies"> > /etc/rc_local",這樣即可啟動SYN Cookie,並將其新增到了Linux的啟動檔案,這樣即使系統重啟也不影響SYN Cookie的啟用狀態。

(七)過濾可疑的IP直址

當客戶機對伺服器進行攻擊時,在伺服器上可以進行抓包操作,這樣可以對資料包中的IP進行檢測,然後再對這些可疑的潮行過濾,從而將其無法正常連線伺服器。利用Linux自帶的"tcpdump"命令可以實現抓包操作,執行命令"tcpdump -c 1000 -l eth 0 -n dst port 80 > test.txt",就可以在當前目錄下建立一個。

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章