前言
经常检查apache的连接数,同样会发现很多无用的time_wait连接。
有人说这是正常的,是因为一个请求中途中断造成的;
还有人说微软的IE连接时产生的Time_wait会比用Firefox连接时多。
个人认为有一定的Time_wait是正常的,如果超过了连接数的比例就不是很正常,此时就需要找办法解决一下了。
检查net.ipv4.tcp_tw当前值,将当前的值更改为1分钟:
[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[root@aaa1 ~]# vi /etc/sysctl.conf
增加或修改net.ipv4.tcp_tw值:
使内核参数生效:
[root@aaa1 ~]# sysctl -p
[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
设置这两个参数: reuse是表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接; recyse是加速TIME-WAIT sockets回收
用netstat再观察正常
这里解决问题的关键是如何能够重复利用time_wait的值,我们可以设置时检查一下time和wait的值
#sysctl -a | grep time | grep wait
结合DDOS和TIME_WAIT过多,建议增加如下参数设置:
查看当前的连接数状况可以使用:
netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n
返回结果如下
1 established
1 State
2 LAST_ACK
4 CLOSING
4 FIN_WAIT2
9 LISTEN
17 FIN_WAIT1
18 SYN_RECV
27 ESTABLISHED
811 TIME_WAIT
上面的命令可以帮助分析哪种tcp状态数量异常
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
返回的结果非常简洁直接,就是句子有点长。
可以按IP连接数列出当前状况,发现异常的,可以封掉这个IP。