2017年5月11日 星期四

SYN_FLOOD Apache 的 SYN_RECV數 最大只有 256 ?

環境 CentOS 7,Apache 2.4

新安裝的Server,的確如遭遇SYN_FLOOD時,很容易就達到預設的SYN上限256。Google了很多,很多文章都教直接修改 net.ipv4.tcp_max_syn_backlog=128 ,去一個更大的值例如 1024。 但在Kernel2.6之後呢,有些文章指出,Apache的Backlog是依據另一個參數 net.core.somaxconn=128去做Backlog。因為兩個值的預設值都是128,所以可能比較容易混淆。兩個值都設到1024或以上(視乎RAM)是比較好。 

我的機器設置了兩個IP,同一個Apache服務器,當其中一個IP受到SYN_FLOOD攻擊時,另一個IP的Virtual Host居然沒受到影響,可見系統資源是遊刃有餘,可是因為SYN_RECV的上限是256,所以過長的隊列讓Virtual Host變得不穩定。

正題,設置
sysctl -w net.core.somaxconn=1024   

#修改 httpd.conf
vi httpd.conf
增加 ListenBacklog 800  #註: 如果沒加這句,預設值是511,因為ListenBacklog是mpm類,所以我是加到mpm中。如果不設置,他的值就是511,所以不設置也是OK的。

#重啟Apache
systemctl stop httpd.service
systemctl start httpd.service


#測試
輸入指令 ss -lti '( sport = :http )'
得出以下類似結果,注意Send-Q的Listen有你剛剛設置的數值
State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port   
LISTEN     0      800       :::http                    :::*
         cubic rto:1000 mss:536 cwnd:10 lastsnd:2605019262 lastrcv:2605019262 lastack:2605019262

以下是Send-Q的意義


而實際上,在你未設置時,他會選擇 min(somaxconn, ListenBacklog),作為backlog的數列大小,於是新安裝時這個Send-Q Listen值是 128。 而 Syn_RECV 是Send-Q x2 =256。 那麼設置後就是 800x2 = 1600個。  可以頂得住一時三刻,以效能去稍為舒緩SYN_FLOOD帶來的不穩定。 

後記
sysctl -w 是用作暫時性的修改變量,重開機後就變回預設值。要永久設置請

vi /etc/sysctl.conf
直接在下方空白處Insert

net.core.somaxconn=1024

每次重開機,都會調用/etc/sysctl.conf這個檔案。


參考文獻


Google