Linux系統-抵禦SYN洪水攻擊
本文源鏈接地址: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洪水攻擊