服务器出现ddos攻击,服务器apache进程数严重超过日常平均数,查看会话状态,有大量的CLOSE_WAIT状态会话。
解决方法:
vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测监控秒数
net.ipv4.tcp_keepalive_intvl=2
保存退出后执行:sysctl -p
以上为修改系统参数,告诉内核及时的断掉CLOSE_WAIT会话。
其次在前端防火墙中配置规则,加了一条:
从any来到服务器IP去,每IP并发会话数为100
##以下内容来源于网络搜集
CLOSE_WAIT状态的生成原因首先我们知道,如果我们的Client程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!因为如果是Server端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:
Server —> FIN —> Client
Server <— ACK <— Client
这时候Server端处于FIN_WAIT_2状态;而我们的程序处于CLOSE_WAIT状态。
Server <— FIN <— Client这时Client发送FIN给Server,Client就置为LAST_ACK状态。
Server —> ACK —> Client
Server回应了ACK,那么Client的套接字才会真正置为CLOSED状态。
我们的程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Server,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。
原因知道了,那么为什么不发FIN包呢,难道会在关闭己方连接前有那么多事情要做吗?还有一个问题,为什么有数千个连接都处于这个状态呢?难道那段时间内,服务器端总是主动拆除我们的连接吗?
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/572.html