關於DDOS攻擊中TCP半連線數與FD的關係

2022-07-30 08:39:10 字數 1941 閱讀 3483

在tcp

應用中,

server

事先在某個固定埠監聽,

client

主動發起連線,經過三路握手後建立

tcp連線。那麼對單機,其最大併發

tcp連線數是多少?

在確定最大連線數之前,先來看看系統如何標識乙個tcp

連線。系統用乙個

4四元組來唯一標識乙個

tcp連線: 

。server

最大tcp

連線數server

通常固定在某個本地埠上監聽,等待

client

的連線請求。不考慮位址重用(

unix

的so_reuseaddr

選項)的情況下,即使

server

端有多個

ip,本地監聽埠也是獨佔的,因此

server

端tcp連線4

元組中只有

remote ip

(也就是

client ip

)和remote port

(客戶端

port

)是可變的,因此最大

tcp連線為客戶端ip數

×客戶端

port

數,對ipv4

,不考慮

ip位址分類等因素,最大

tcp連線數約為2的

32次方(

ip數)×2的

16次方(

port

數),也就是

server

端單機最大

tcp連線數約為2的

48次方。

上面給出的是理論上的單機最大連線數,在實際環境中,受到機器資源、作業系統等的限制,特別是sever

端,其最大併發

tcp連線數遠不能達到理論上限。在

unix/linux

下限制連線數的主要因素是記憶體和允許的檔案描述符個數(每個

tcp連線都要占用一定記憶體,每個

socket

就是乙個檔案描述符),另外

1024

以下的埠通常為保留埠。

在預設2.6

核心配置下,經過試驗,每個

socket

占用內存在

15~20k

之間。那麼也就是說tcp連線數與記憶體以及允許的最大描述符個數有關。對server端,通過增加記憶體、修改最大檔案描述符(fd)個數等引數,單機最大併發tcp連線數超過10萬 是沒問題的。那麼問題就來了,對於ddos攻擊,是如何進行的吶?

在ddos攻擊中,假如伺服器允許的tcp連線數超大,伺服器記憶體超大,那麼攻擊者針對於此種情況往往是傳送大量tcp半連線請求,使得連線數超過fd的最大值或者說fd沒有超過最大值,但是維護fd的記憶體之和超過伺服器記憶體,因為fd數對應與連線數,而大量半連線需要去維護需要大量記憶體,使得伺服器無法處理。另外,如果伺服器採用select/poll模式進行多路服用,那為此消耗的cpu資源也同樣是可怕的。因此針對於ddos攻擊,我們要做的就是限制半連線數的數目,使得它不會影響正常的請求,同時採用epoll模式進行i/o多路復用。這裡簡單的介紹一下epoll和select/poll:

epoll是linux下多路復用io介面select/poll的增強版本,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率,因為它會復用檔案描述符集 合來傳遞結果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的檔案描述符集合,另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符 集,只要遍歷那些被核心io事件非同步喚醒而加入ready佇列的描述符集合就行了。epoll除了提供select/poll那種io事件的電平觸發 (level triggered)外,還提供了邊沿觸發(edge triggered),這就使得使用者空間程式有可能快取io狀態,減少epoll_wait/epoll_pwait的呼叫,提高應用程式效率.et只讀取一次資料(就算沒讀完也不在通知,直到狀態改變),而lt只要還有資料就會一直通知,直到讀完。

通過調整tcp引數來防範DDOS攻擊

通過調整 tcp引數來 防範ddos 攻擊虛擬主機服務商在運營過程中可能會受到黑客攻擊,常見的攻擊方式有syn ddos 等。通過更換 ip,查詢被攻擊的站點可能避開攻擊,但是中斷服務的時間比較長。比較徹底的解決方法是添置硬體防火牆。不過,硬體防火牆 比較昂貴。可以考慮利用 linux 系統本身提供...

關於DDoS攻擊的趨勢與防禦

在 ddos 之前我們需要先對 dos 有所了解,dos泛指黑客試圖妨礙正常使用者使用網路上的服務,例如剪斷大樓的 線路造成使用者無法通話。而以網路來說,由於頻寬 網路裝置和伺服器主機等處理的能力都有其限制,因此當黑客產生過量的網路封包使得裝置處理不及,即可讓正常的使用者無法正常使用該服務。例如黑客...

TCP半連線佇列和全連線佇列

半連線佇列 syn queue 全連線佇列 accept queue ss lnt recv q send q local address port peer address port 0 100 8080 當連線處於時listen狀態,send q表示accept queue的最大值,recv q...