- net.ipv4.tcp_max_tw_buckets
畢竟它也是會占用一定的資源,所以應該有一個最大值,當超過這個值,系統就會刪除最早的連接,這樣始終保持在一個數量級。
這個數值就是由net.ipv4.tcp_max_tw_buckets這個參數來決定的。
CentOS7系統,你可以使用sysctl-a|greptw_buckets來查看它的值,默認為32768,
你可以適當把它調低,比如調整到8000,畢竟這個狀態的連接太多也是會消耗資源的。
但你不要把它調到幾十、幾百這樣,因為這種狀態的tcp連接也是有用的,
如果同樣的客戶端再次和服務端通信,就不用再次建立新的連接了,用這個舊的通道,省時省力。
- net.ipv4.tcp_tw_recycle=1
所以該參數設置為1就可以讓timewait狀態的連接快速回收,它需要和下面的參數配合一起使用。
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_syncookies=1
假如客戶端發送請求后直接斷開和服務端的連接,不接收服務端發起的這個請求,服務端會重試多次,
這個重試的過程會持續一段時間(通常高于30s),當這種狀態的連接數量非常大時,服務器會消耗很大的資源,從而造成癱瘓,
正常的連接進不來,這種惡意的半連接行為其實叫做synflood攻擊。
設置為1,是開啟SYNCookies,開啟后可以避免發生上述的synflood攻擊。
開啟該參數后,服務端接收客戶端的ack后,再向客戶端發送ack+syn之前會要求client在短時間內回應一個序號,
如果客戶端不能提供序號或者提供的序號不對則認為該客戶端不合法,于是不會發ack+syn給客戶端,更涉及不到重試。
- net.ipv4.tcp_max_syn_backlog
該參數決定最多能記錄幾個這樣的連接。在CentOS7,默認是256,當有synflood攻擊時,這個數值太小則很容易導致服務器癱瘓,
實際上此時服務器并沒有消耗太多資源(cpu、內存等),所以可以適當調大它,比如調整到30000。
- net.ipv4.tcp_syn_retries
- net.ipv4.tcp_synack_retries
- net.ipv4.ip_local_port_range
當客戶端和服務端建立連接時,比如說訪問服務端的80端口,客戶端隨機開啟了一個端口和服務端發起連接,
這個參數定義隨機端口的范圍。默認為3276861000,建議調整為102561000。
- net.ipv4.tcp_fin_timeout
該參數定義不屬于任何進程的該連接狀態的超時時間,默認值為60,建議調整為6。
- net.ipv4.tcp_keepalive_time
客戶端或服務端會告訴對方要關閉連接,此時狀態就會變為timewait,如果客戶端沒有告訴服務端,
并且服務端也沒有告訴客戶端關閉的話(例如,客戶端那邊斷網了),此時需要該參數來判定。
比如客戶端已經斷網了,但服務端上本次連接的狀態依然是established,服務端為了確認客戶端是否斷網,
就需要每隔一段時間去發一個探測包去確認一下看看對方是否在線。這個時間就由該參數決定。它的默認值為7200秒,建議設置為30秒。
- net.ipv4.tcp_keepalive_intvl
此時服務端還不能認定為對方不在線,而是要嘗試多次。該參數定義重新發送探測的時間,即第一次發現對方有問題后,過多久再次發起探測。
默認值為75秒,可以改為3秒。
- net.ipv4.tcp_keepalive_probes