系统安全:一次DOS事件的解决办法
0.分析过程
首先,分析了DOS的类型、特征、攻击方法。
使用netstat -na|grep SYN_RECV|wc,发现当前存在大量SYN_RECV状态连接,源地址都是伪造的,netstat -na|grep SYN_RECV|wc显示数量为1024个,这个是当然,Linux默认的Syn_Backlog对列就是1024,超过的SYN都丢弃了。
针对的攻击端口是80:WWW服务,当然,Web服务器也已经无法访问了。
在打开SYN_Cookie防护之后,攻击得到了一些缓解,但随后攻击流量又增大了,情况也好不到哪儿去,而Linux的Iptables又不能做syn_proxy的,那么只好从其他方面下手,用tcpdump -w抓下了当时的数据流量,计数分析流量大约在1.8w pps左右,其中99%以上都是伪造源地址的syn包。
既然是伪造地址,那就比较难处理,不过经过仔细的统计和分析,还是分析出了这次攻击中主要数据的特征,主要有以下几条:
这样,注意看其中的3、4、5几条,这是对我们来说最重要的线索。
3. ip identifier字端固定为0x0100,而在TCP/IP规范中,这个字段是为了防止一个连接中的分片包重复而作的包内序列号。虽然大多数操作系统没有严格准循着一条规范,但这个数值的来源却是确定的,即在正常的TCP/IP堆栈中,这个字段的值应该是发送此数据包是的TCB(TCP控制块,一个内核空间的TCP数据结构)的序列号。而即使系统也没有严格准循这一条,那么在网络中传输的数据,identifier字段的内容也应该是随机分布的,正常的操作系统网络堆栈不可能发送出大量0x0100这样固定的字段内容来。
4. TTL值平均分布在74 - 95之间。按照常识也知道,大多数操作系统默认的TTL应该为32、64、128这样的2的整数次方;而另一个方面,TTL在网络传输的过程中每过一个路由器就会自动减一,而现在的Internet路由设计已经是比较良好的,从任何一点到达Intetnet的另一端,一般来说TTL条数不会超过20-30,这个我也测试过,从国内网通和电信的网络看来,到达国内和国际的大多数网站,TTL跳数都在20以内,而从Windows的Tracert命令也可以看出--它假设的最大TTL超时条数也只是30。超过30条的正常Internet路由是很罕见的。那么我们来做一个简单的减法:
所以一个数据包,在正常的传输过程中,当到达端点时,它的TTL数分布范围应该是:代码:
而在本次数据采样中,大多数伪造地址的SYN数据,TTL都在74 - 95之间。
其他附加特征,例如IP长度、TCP窗口、TCP SYN_Flag等,也可以作为附加判断标志。这样我们提取出这次攻击的主要特征码为:
这样四条特征。
[2] 下一页
- 最新评论