1. 程式人生 > >Linux系統-抵禦SYN洪水攻擊

Linux系統-抵禦SYN洪水攻擊

情況下 如果 速度 ron 數據 參數 fault vim class

本文源鏈接地址:https:www.93bok.com

說明:

本文中所提到的這些內核配置參數應該在每臺服務器上線之前配置好的,防止意外。

SYN攻擊:

SYN攻擊是利用TCP/IP協議3次握手的原理,發送大量的建立連接的網絡SYN包,但不實際建立連接,最終導致被攻擊服務器的網絡隊列被占滿,無法被正常用戶訪問。

原理圖:


正常情況下TCP三次握手:

技術分享圖片


SYN攻擊情況:

技術分享圖片


SYN Flood是當前最流行的DoS(拒絕服務攻擊)與DDoS(分布式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,發送大量偽造的TCP連接請求,常用假冒的IP或IP號段來發送海量的請求連接的第一個握手包(SYN包),被攻擊服務器回應第二個握手包(SYN+ACK包),因為對方是假冒IP,對方永遠收不到包且不會回應第三個握手包,導致被攻擊服務器保持大量SYN_RECV狀態的“辦連接”,並且會重試默認5次回應第二個握手包,塞滿TCP等待連接隊列,耗盡資源(CPU滿負荷或內存不足),讓正常的業務請求連接不進來。

解決:

一、添加以下參數

vim /etc/sysctl.conf
#在文件末尾添加:

net.ipv4.tcp_synack_retries = 0
net.ipv4.tcp_syn_retries = 0
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
fs.file-max = 819200
net.core.somaxconn = 65536
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 165536
net.ipv4.ip_local_port_range = 10000 65535

二、參數生效

sysctl -p

三、參數詳解

1)net.ipv4.tcp_synack_retries = 0

表示回應第二個握手包(SYN+ACK包)給客戶端IP後,如果收不到第三次握手包(ACK包)後,不進行重試,加快回收“半連接”,不要耗光資源。不修改這個參數,模擬攻擊,10秒後被攻擊的80端口即無法服務,機器難以ssh登錄; 用命令 netstat -na | grep SYN_RECV檢測“半連接”hold住180秒;

2)net.ipv4.tcp_syn_retries = 0

默認是5,當沒有收到服務器端的SYN+ACK包時,客戶端重發SYN握手包的次數。

3)net.ipv4.tcp_max_syn_backlog = 20480

半連接隊列長度,增加SYN隊列長度到20480:加大SYN隊列長度可以容納更多等待連接的網絡連接數,具體多少數值受限於內存。

4)fs.file-max = 819200

系統允許的文件句柄的最大數目,因為連接需要占用文件句柄

5)net.core.somaxconn = 65536

用來應對突發的大並發connect請求

6)net.core.wmem_max = 16777216

最大的TCP數據發送緩沖(字節)

7)net.core.netdev_max_backlog = 165536

網絡設備接收數據包的速度比內核處理這些包的速度快時,允許送到隊列的數據包的最大數目

8)net.ipv4.ip_local_port_range = 10000 65535

本機主動連接其他機器時的端口分配範圍,比如說,在vdftpd主動模式會用到,如果只是開啟22端口,不會使用到net.ipv4.ip_local_port_range這個功能

9)net.ipv4.tcp_syncookies = 1

表示開啟SYN Cookies,當出現半鏈接隊列溢出時啟用cookies來處理,調大半鏈接隊列,可防範少量SYN攻擊,默認為0,改為1開啟

10)net.ipv4.tcp_tw_reuse = 1

表示開啟tcp連接重用,允許將TIME-WAIT sockets重新用於建立新的tcp連接,默認為0,改為1開啟

11)net.ipv4.tcp_tw_recycle = 1

表示開啟tcp連接中TIME-WAIT sockets的快速回收,默認為0,改為1開啟

這個是什麽意思呢,我來演示一下給大家看看,現在我先看看阿裏雲上邊80端口的狀態

技術分享圖片

接下來我訪問我阿裏雲的網站,然後多刷新幾次,刷新完了之後,我們再來看看80的狀態是不是有TIME_WAIT狀態的,那上邊這個參數的作用就是快速釋放這些TIMA_WAIT來達到快速回收的作用

技術分享圖片

12)net.ipv4.tcp_fin_timeout = 10

對於本端斷開的socket連接,tcp保持在FIN_WAIT_2狀態的時間。對方可能會斷開連接或一直不結束或不可預料的進程死亡

Linux系統-抵禦SYN洪水攻擊