努力, 努力, 再努力
全部博文(220)
分类: 系统运维
2017-02-17 19:32:54
1. 环境描述: centos6.5
2. 应用环境: apache 2.4.23 , php-5.6.29
3. Web服务器响应很慢,通过netstat –atupno观察,发现大量状态为SYN_RECV,TIME_WAIT, CLOSE_WAIT的连接
问题1: 服务器响应慢,是什么造成的? 是大量的SYN_RECV半连接攻击导致的,还是太多的TIME_WAIT, CLOSE_WAIT造成的?无法分清
问题2:多少个半连接攻击SYN_RECV,会造成服务器响应慢甚至打不开页面
问题3: TIME_WAIT, CLOSE_WAIT状态的连接究竟产生了什么影响?
问题4:如果解决?
绘制TCP 4次断开状态转换图如下:
了解了以下问题:
1. TIME_WAIT状态产生原因以及他为何而存在, 造成何种影响:
为什么要设置这个状态,原因是有足够的时间让ACK包到达服务器端,如果服务器端没收到ACK包,超时了,然后重新发一个FIN包,直到服务器收到ACK 包
TIMEWAIT并不是多余的。在TCP协议被创造,经历了大量的实际场景实践之后,TIMEWAIT出现了
TIMEWAIT是友好的,TCP要保证在所有可能的情况下使得所有的数据都能够被正确送达
TIMEWAIT的负面影响也很明显:
高并发的请求在短时间内会占用0-65536中的大量端口,当服务器主动关闭连接时会进入time_wait状态,即等待2MSL时,在centOS6.X里MSL=60秒,2MSL就是服务器主动关闭连接后还要等待120秒,在这120秒里,新的连接不能占用处于time_wait状态连接的端口,最终会导致端口资源耗尽,另外,太多连接也会占用过多的内存。这就是time_wait状态将会造成的影响.
2. 要分清是半连接攻击导致响应慢,还是time_wait导致,分步解决
减少time_wait等待时间,减轻time_wait造成的影响
之后再考虑半连接攻击问题
偿试解决问题:根据实际情况选择修改
1. 修改内核参数:
命令:vim /etc/sysctl.conf 添加如下条目:
#开启快速回收,centos6.5 默认值1
net.ipv4.tcp_tw_recycle = 1
#减少time_wait等待时间, net.ipv4.tcp_fin_timeout是MSL, 2*MSL=60秒
net.ipv4.tcp_fin_timeout = 30 (centos6.5默认60秒)
#time_wait连接同时保持的最大数量, 默认262144
net.ipv4.tcp_max_tw_buckets = 1000
#tcp 已建立连接的保持时间调整为1800, 原为7200秒(两个小时)
net.ipv4.tcp_keepalive_time = 1800
# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表 示关闭
net.ipv4.tcp_tw_reuse = 1
2. netstat 命令输出:
(1) timer列显示的时间是倒计时
(2) keepalive (1797.70/0/0) 对应 net.ipv4.tcp_keepalive_time = 1800
(3) apache的配置文件中有以下两项:
KeepAlive On #开启长连接
KeepAliveTimeout 15 #apache保持长连接15秒超时
这两个条目的影响是:浏览器超过15秒没有访问web页面,apache会主动
断开连接,即发送fin包,正常情况下,该连接会迅速进入time_wait状态
Timewait(59.21/0/0) 对应 net.ipv4.tcp_fin_timeout = 30 (30秒=1MSL)