LINUX下SYN攻防戰以下 服務器
(一)SYN攻擊原理cookie
SYN攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,經過發送大量的半鏈接請求,耗費服務器CPU和內存資源。SYN攻擊聊了能影響主機外,還能夠危害路由器,防火牆等網絡系統,事實上SYN攻擊並無論目標是什麼系統,只要這些系統打開TCP服務就能夠實施.咱們知道,在網絡中兩臺電腦創建TCP鏈接 時須要進行三次握手過程,客戶端首先向服務器發關TCP SYN數據包,接着服務器會向客戶端發關相應的SYN ACK數據包,最後客戶端會以ACK進行響應.從而創建正常的握手過程。在具體的鏈接細節中,服務器最先接受到SYN包時,在TCP協議棧中會將相應的半鏈接記錄添加到隊列中,以後等待接受下面準備握手的數據包,若是握手成功,那麼這個半鏈接記錄將從隊列中刪除.或者當服務器未收到客戶端的確認包時,會重發請求包,一直到超時纔將此條目從未鏈接隊列刪除。可是在服務器中的TCP協議棧中存儲的半鏈接記錄是有限的,當服務器受到SYN型的DOS攻擊後,隊 列會很快處於充滿狀態,客戶端在短期內僞造大量不存在的IP地址,向服務器不斷地發送SYN包,服務器回覆確認包,並等待客戶的確認,因爲源地址是不存在的,服務器須要不斷的重發直至超時,這些僞造的SYN包將長時間佔用未鏈接隊列,正常的SYN請求被丟棄,目標系統運行緩慢嚴重者引發網絡堵塞甚至系統癱瘓,服務器隨後就再也不接受新的網絡鏈接,從而形成正常的客戶端沒法訪問服務器的狀況發生。網絡
(二)實戰SYN攻擊過程tcp
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了。 ip
(五)減少超時值內存
在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",就能夠在當前目錄下建立一個。