上段时间国内部分站点遭到了较大规模的拒绝服务(D.O.S)攻击(包括类似前期yahoo等大型国际网站所遭受的的Ddos攻击 --分布式拒绝服务攻击)。波及的网站包括知名的新闻网站、商业网站、证券网站,甚至是部分网络安全站点等。造成的症状为:站点无法访问,响应速度极慢,影响到周围相关网段的其他主机等,至今还 有很多站点未恢复正常,无法正常访问。
作为国内第一个网络安全站点,我们的主站www.isbase.com也同样受到了极其猛烈的拒绝服务攻击。公司技术人员立即做出响应:针对攻击的方式及可能采用的攻击手段,提出了切实可行的完整解决方 案,把攻击的危害降到了最低。现在网站一切正常,虽然攻击仍旧在继续,但对服务器的影响已经降到了最小,不会影响服务器的正常运作。同时,我们积极联系了其他受攻击的同行站点,表明攻击来自同 一类手法,可能来自某人(团体)蓄意所为。另外,对我们近期为其他站点所做的紧急响应情况来看,此次攻击的规模之广,强度之大令人发指。在采取了我公司应的解决方案后,接受紧急响应的网站都已 恢复正常。
我们根据自己站点所受攻击的来对此次大规模拒绝服务攻击做初步分析报告:
从被攻击的症状来看,这次的攻击大致有以下几种:分布式拒绝服务攻击、Syn-Flood攻击,icmp炸弹(ping of death)等几种。这个估计是根据审查我们站点被攻击后留下的纪录,分析这些记录后得出的初步结论。
要防范拒绝服务攻击,首先要从强化自身做起。
针对目前D.O.S攻击的实施手段,我们预先采取了以下的一些措施:
1.为防止Syn-Flood攻击(Syn-Flood攻击的具体原理参见本站的技术文章),我们对默认安装的系统进行了强化,主要是通过重新编译内核,以及设定相应的内核参数使得系统强制对超时的Syn请求连 接数据包复位,同时通过缩短超时常数和加长等候队列使得系统能迅速处理无效的Syn请求数据包。如果不强制对这些无效的数据包进行清除复位,将大大加重系统的负载,最终将导致系统失去响应。
2.为防止icmp炸弹的攻击,在系统内核中对icmp数据包的流量进行限定允许。并在系统参数中对此限定值调整。以防止系统由此而造成的失去响应。
3.在系统中加装防火墙系统,利用防火墙系统对所有出入的数据包进行过滤。
4.仔细调整服务器的各项参数。根据我们站点访问量大的特点,对Web服务器和Mail服务器进行适度的预加重处理,即通过预先使服务器达到一定的负载,以使得整个系统的负载变化在访问量变化时不 会出现很大的变化,如果出现了很大的变化,很有可能使得服务器崩溃。这和在建筑中广泛采用的预应力技术的原理是一致的。
在完成了对服务器的强化后,还必须使用一些有效的方法和规则来检测和发现拒绝服务攻击,并能在检测到拒绝服务攻击后采取相应的对策。
检测的手段很多,可以通过察看路由器纪录和系统纪录以及站点目前状态来实现。 通常,我们在设计防火墙的时候预先对某些特殊类型的IP数据包进行过滤(不需要纪录)。这些特殊的IP是不能在Internet网上出现的(无法路由)。而要进行拒绝服务攻击往往最需要这类有来无回的 数据包,来隐蔽攻击者的真实地址和身份。而一旦这类地址的出现,往往就标志着某种拒绝服务攻击的开始。 这一大类的地址是127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16这四个网段的地址。就我们的防火墙的规则而言,对这三个地址段是完全拒绝任何数据包的: deny all。然后通过检测对这些规则的计数,来判决是否存在某些攻击行为。如当我们发现在我们的计数器中发现如下的情况:
0 0 deny ip from any to 127.0.0.0/8 4552 553302 deny ip from 10.0.0.0/8 to any 0 0 deny ip from any to 10.0.0.0/8 0 0 deny ip from 172.16.0.0/12 to any 0 0 deny ip from any to 172.16.0.0/12 97601 11024404 deny ip from 192.168.0.0/16 to any 0 0 deny ip from any to 192.168.0.0/16
这时,我们就可以推断是有人在拒绝服务攻击,当我们利用""netstat –an|grep SYN_RCVD""来检测当时的网络连接数目时,我们会发现有大量的SYN_RCVD类型的连接:
tcp4 0 0 202.109.114.50.80 203.93.217.52.2317 SYN_RCVD tcp4 0 0 202.109.114.50.80 61.136.54.73.1854 SYN_RCVD
这就说明了此时服务器正在遭受Syn-Flood攻击。纪录这类攻击的IP地址是毫无意义的(因为这些IP地址都是在程序中通过改变数据包头而伪造的)。
而对于分布式拒绝服务攻击,由于采用了大流量攻击手法,会造成该网段路由器的阻塞,从而使得该网段内几乎所有的服务器可用的带宽都变的极小,对外造成不能访问的现象。而此时,该网段主干路 由器亦承受极大的负载。对于Linux系统来说可以考虑重新编译内核,将network中enable tcp_syncookie然后在使用新内核启动,并且在/etc/rc.d/rc.local中添加并在命令行运行echo 1 >/proc/sys/net/ipv4/tcp_syncookies来防止synflood攻击。
而对于ICMP包炸弹这里攻击,则可以通过在防火墙上设置纪录来实现检测。一旦发现在一定的时间内有量的ICMP包涌入,而内核由于ICMP包的流量过载而出现警告,则说明存在此类的攻击行为。这时, 可以从系统所纪录的日志上看到,类似于如下的纪录:
Deny ICMP 202.96.113.53 202.109.114.50 in Deny ICMP 202.96.113.53 202.109.114.50 in Deny ICMP 202.96.113.53 202.109.114.50 in Deny ICMP 202.96.113.53 202.109.114.50 in Deny ICMP 202.96.113.53 202.109.114.50 in
在检测到攻击行为后,就应该采取一些措施使得攻击的影响减至最小。
对于分布式攻击,目前还没有非常有效方法来防御,我们所能做的是让ISP对主干路由器进行限流措施来降低攻击所造成的影响。
对于SYN-FLOOD攻击,一方面要在服务器端打Syn-flood的补丁,另一方面需要在该网段的路由器上做些配置的调整。这些调整包括限制Syn半开数据包的流量和个数,在路由器的前端做必要的TCP拦截( 目前限于Cisco系列IOS12.0),并在路由器上设定相当严格的定时常数,利用路由器的TCP拦截技术使得只有完成TCP三次握手过程的数据包进入该网段,这样可以有效地保护本网段内的服务器不受此类攻击 。同时,在路由器的访问列表里拒绝10.0.0.0/8,172.16.0.0/12,192.168.0.0/16这三个虚拟网段的访问。对于linux可以考虑使用防火墙规则来限制来自这些数据报的命令:
ipchains -I input -i lo -s 127.0.0.02 -j ACCEPT
ipchains -I input -s 127.0.0.02 -j DENY
ipchains -I input -s 192.168.0.0/16 -j DENY
ipchains -I input -s 172.16.0.0/12 -j DENY
ipchains -I input -s 10.0.0.0/8 -j DENY
对于ICMP攻击可以采取的方法一:在服务器端拒绝所有的ICMP包;(对于Linux系统运行echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all,并将该命令添加到/etc/rc.d/rc.local最后)
要彻底杜绝拒绝服务攻击,只有追根溯源去找到正在进行攻击的机器和攻击者。 要追踪攻击者不是一件很容易的事情,一旦其停止了攻击行为,很难将其发现。唯一可行的方法就是在其进行攻击的时候,根据路由器的信息和攻击数据包的特征,采用一级一级回溯的方法来查找其攻击源 头。这时需要各级部门的协同配合才能很好的完成。