修改內核參數有3種辦法:一種臨時修改,兩種永久修改。
臨時修改是使用sysctl [選項] [參數名=值]命令;永久修改是修改/etc/sysctl.conf文件或修改/proc/sys/目錄下的對應文件(例如,修改net.ipv4.tcp_synack_retries=0,即echo 0 > /proc/sys/net/ipv4/tcp_synack_retries)。
最常見的內核參數調優就是為了防止DoS(拒絕服務攻擊)和DDoS(分布式拒絕服務攻擊)。其中SYN Flood是當前最流行的DoS與DDoS的方式之一,這是一種利用TCP協議缺陷,發送大量偽造的TCP連接請求,常用假冒的IP或IP號段發來的海量請求連接的第一個握手包(SYN包),被攻擊服務器回應第二個握手包(SYN+ACK包),因為對方是假冒IP,對方永遠收不到包且不會回應第三個握手包。導致被攻擊服務器保持大量SYN_RECV狀態的“半連接”,並且會重試默認5次回應第二個握手包,塞滿TCP等待連接隊列,資源耗盡(CPU滿負荷或內存不足),讓正常的業務請求連接不進來。
解決辦法就是配置相關參數,可以添加到/etc/sysctl.conf文件中,也可以直接修改/proc/sys/目錄下的對應文件。
[root@youxi1 ~]# vim /etc/sysctl.conf //添加或修改參數 net.ipv4.tcp_synack_retries = 0 net.ipv4.tcp_syn_retries = 1 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 = 65535 net.core.rmem_max = 1024123000 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 165536 net.ipv4.ip_local_port_range = 10000 65535
參數說明:
1)主要參數
net.ipv4.tcp_synack_retries 表示回應第二個握手包(SYN+ACK包)給客戶端IP后,如果收不到第三次握手包(ACK包),進行重試的次數(默認為5)。修改這個參數為0,可以加快回收半連接,減少資源消耗,但是有一個副作用:網絡狀況很差時,如果對方沒收到第二個握手包,可能連接服務器失敗,但對於一般網站,用戶刷新一次頁面即可。根據抓包經驗,這種情況很少,但為了保險起見,可以只在被tcp洪水攻擊時臨時啟用這個參數。之所以可以把tcp_synack_retries改為0,因為客戶端還有tcp_syn_retries參數,默認是5,即使服務器端沒有重發SYN+ACK包,客戶端也會重發SYN握手包。
net.ipv4.tcp_syn_retries 表示當沒有收到服務器端的SYN+ACK包時,客戶端重發SYN握手包的次數(默認為5)。
net.ipv4.tcp_max_syn_backlog 半連接隊列長度(默認為1024),加大SYN隊列長度可以容納更多等待連接的網絡連接數,具體多少數值受限於內存
2)輔助參數
fs.file-max 系統允許的文件句柄的最大數目(也就是能打開文件的最大數量),因為連接需要占用文件句柄。注意:/etc/security/limits.conf文件內對nofile的配置(使用ulimit -n查看),還有/etc/security/limits.d/20-nproc.conf文件內對nproc的配置(使用ulimit -u查看),最好配置玩這兩個參數重啟下系統。
net.core.somaxconn 用來應對突發的大並發connect 請求
net.core.rmem_max 最大的TCP 數據接收緩沖(字節)
net.core.wmem_max 最大的TCP 數據發送緩沖(字節)
net.core.netdev_max_backlog 網絡設備接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目
net.ipv4.ip_local_port_range 本機主動連接其他機器時的端口分配范圍,比如說,在vsftpd主動模式會用到
3)次級輔助參數
注意:以下參數面對外網時,不要打開。因為副作用很明顯。
net.ipv4.tcp_syncookies 當出現半連接隊列溢出時是否向對方發送syncookies(默認為0),1表示啟用cookies來處理,可防范少量SYN攻擊;0表示關閉。調大半連接隊列后沒必要
net.ipv4.tcp_tw_reuse TIME_WAIT狀態的連接重用功能是否開啟(默認為0),1表示允許將TIME-WAIT sockets重新用於新的TCP連接;0表示關閉。
net.ipv4.tcp_tw_recycle 時間戳選項,與前面net.ipv4.tcp_tw_reuse參數配合,1表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout TIME_WAIT狀態的連接回收功能,默認值是 60,對於本端斷開的socket連接,TCP保持在FIN_WAIT_2狀態的時間
擴展:TCP三次握手
Client-------------------------Server
SYN ------------------------->
<------------------------SYN+ACK
ACK -------------------------> (SYN Flood就是這一步不回)