HTTPERR的日志中出现大量Timer_MinBytesPerSecond,Timer_ConnectionIdle错误
在\LogFiles\HTTPERR的日志中发现了大量Timer_MinBytesPerSecond,Timer_ConnectionIdle错误,
根据网上的介绍,做了如下更改:
1) 从 IIS 管理器右键单击 本地计算机 选择 属性。勾选允许直接编辑配置数据库。
2) 在记事本中打开 C:\Windows\system32\inetsrv\MetaBase.xml 文件,
搜索MinFileBytesPerSec,将 MinFileBytesPerSec 设置从 240 更改为 0。
搜索ConnectionTimeout,将 ConnectionTimeout 设置从 120 更改为 600。
MinFileBytesPerSec如果不在C:\Windows\system32\inetsrv\MetaBase.xml 文件 就是在C:\Windows\system32\inetsrv\MBSchema.xml 文件
3)重新启动 IIS 。
在修改MBSchema尤其注意,停止IIS进程,第一步修改
MetaBase
•在“IIsComputer”节点中,将 EnableEditWhileRunning 的值从 0 (FALSE) 更改为 1 (TRUE)。所做更改应如下所示:
<IIsComputer Location ="/LM"
EnableEditWhileRunning="1"
EnableHistory="1"
MaxBandwidth="4294967295"
MaxHistoryFiles="10">
•将所做更改保存到 MetaBase.xml 文件中。
然后才能修改MBSchema文件。。。
-------------------------------另一种见解
前些天发现自己的网站无法访问,询问机房这边,说是机器最近常死机,我就把网站迁移到一个朋友的主机上, 结果没过几天机器又挂了,问朋友的机房那边说是硬件防火墙被攻击了而死掉了,详细情况不知。看来不是硬件问题,多半是被SYN FLOOD或者CC攻击了。恰好原来的机房说最近购买了新的防火墙,我又放了回去。
既然不是硬件问题而可能是攻击,我就开始检查IIS log了,发现 IIS 里面很多Timer_ConnectionIdle和Timer_MinBytesPerSecond的错误,到网络上google了一下,常见说法是说错误是因为IIS的设置不当引起的,是因为连接超时时间设置太小,解决方法是设置连接超时为600秒,把MinFileBytesPerSec的设置从240修改到0(相当于关掉该设置)。觉得这些解决方法都有问题,假如车辆防盗警报经常响,正确的解决方法是看看有谁常来打你车子的主意,或者把车子放在更安全的地方,而绝对不是关掉警报。
因为HTTP服务需要占用TCP连接,而TCP连接时是需要占用系统资源的,而且IIS为每个连接也需要分配相应的资源。目前的主机能够处理上万的连接就可以说是软硬件设计都很不错了(可以参见C10K )。假如恶意人员通过一台或者多台机器发起大量的连接,而不请求内容(这样不需要消耗多少攻击机器的带宽),就可以大量消耗服务器资源而达到拒绝服务的目的。
所以 IIS 需要关闭长时间非活动的连接,这个就是Timer_ConnectionIdle 的错误由来。
既然盾牌改进了,当然矛也要发展一下,攻击者可以给服务器故意缓慢的发送和接收内容而消耗服务器的资源,这样可以避免服务器对于Timer_ConnectionIdle 的保护,相应的IIS的防范就是 MinFileBytesPerSec 设置,MinFileBytesPerSec 属性通过以最小的数据量保持连接,来禁止恶意的或软件工作不正常的客户端消耗资源。如果吞吐量低于 MinFileBytesPerSec 设置的值,则终止连接。LOG里面就会显示Timer_MinBytesPerSecond错误(一些Timer_MinBytesPerSecond错误是因为 windows 2003 的http.sys错误引起的,解决方式是打上最新 ServicePack : http://support.microsoft.com/kb/919797 http://support.microsoft.com/kb/919797/en-us )
所以说这些设置都是用来保护IIS服务器的,可以一定程度上抵御一些恶意的行为消耗服务器的资源,所以我反而将IIS连接超时从原来的600秒改到了30秒
不过经过我们解决问题发现时因为网站所在的应用程序池中请求队列限制,限制在1000,根据自己的网站流量,果断设置为 5000-10000就解决了,默认的1000确实有点少了