论坛故障现象:
2005年7月9日,晚上我登陆S8S8论坛后发现数据库居然连接错误,我第一反应以为数据库出了问题,于是迅速登陆服务器,发现登陆过程非常缓慢,好不容易登陆以后连运行个简单的命令都非常慢,所以这让我感觉可能遭到攻击,相信这个时候CPU肯定是100%占用,加上运行速度慢,所以跳过CPU的检查,直接查看网络访问状态,果然分析没错,论坛的并发连接达到几百个,而这几百个都来自同一个IP为219.133.48.220,而连接状态不是以SYN为主,全是ESTABLISHED,证明建立的是正常的连接,而且是一个完整的连接。我设置防火墙规则把该IP拒绝掉,之后,服务器马上恢复正常,S8S8论坛也马上恢复正常。
论坛故障定位:
解决了这个攻击者的IP以后,我开始分析:既然建立的是完整的连接,而且在netstat命令中能看到该IP和服务器之间有数据流量,证明这些连接都有发送和读取服务器数据,那么HTTP日志里肯定有记录。于是从论坛的日志里过滤出所有有关219.133.48.220的信息,果然不出我所料,记录发现大量的HTTP请求,而且是循环操作,这些请求有某个页面的读取,还有login登陆动作,由于并发连接数量非常大,所以导致服务器数据库负荷增加,看来攻击着的目的就是要耗尽服务器的资源。而这种攻击和以往的synflood等攻击有些不同,synflood利用协议的漏洞进行攻击,属于协议层,而这次的是利用HTTP以及数据库的瓶劲进行攻击,属于应用层攻击,看来攻击者用心比较险恶。
解决方法:
攻击者既然是应用层的攻击,那么他的所有IP连接都为真实有效的,而要达到拒绝服务的程度,就必须建立超过普通连接数量的程度才行。根据这个特性,我在服务器写了一个脚本,专门检查服务器的连接状态,当发现这样的连接以后,自动把攻击者的IP加进防火墙内,而我是一个搞FreeBSD的,FreeBSD用的是IPFIREWALL防火墙,所以我的脚本自然也是针对FreeBSD。脚本如下:
CODE
#!/bin/sh
#
#compile by iceblood 2005/07/10
#Web:
http://www.nettf.net/
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
#找到所有超过30个连接的IP并设置成规则写入/etc/ipfw.dynamic文件里
netstat -n | grep tcp4 | awk '{print $5}' | awk -F'.' '{print $1"."$2"."$3"."$4}' | sort | uniq -c | awk '$1>30' | awk '{print "add deny tcp from "$2" to me 80"}' >> /etc/ipfw.dynamic
#由于难免会出现一些重复规则,所以把规则整理一下再写入/etc/ipfw.rule.tmp文件里
cat /etc/ipfw.dynamic | sort | uniq -i > /etc/ipfw.rule.tmp
#让历史动态规则同样保持没有重复规则
cp -f /etc/ipfw.rule.tmp /etc/ipfw.dynamic
#服务器静态规则,这个规则就自己写了
cat /etc/ipfw.static >> /etc/ipfw.rule.tmp
#验证新生成的规则和老规则的md5码
OLDRULE=`md5 /etc/ipfw.rule | awk '{print $4}'`
NEWRULE=`md5 /etc/ipfw.rule.tmp | awk '{print $4}'`
#如果新老规则的md5码不一样就把新规则替换老规则,并且应用新规则。
if [ "$OLDRULE" != "$NEWRULE" ]; then
mv -f /etc/ipfw.rule.tmp /etc/ipfw.rule
sh /etc/rc.firewall
TIME=`date '+%Y/%m/%d %H:%M:%S'`
echo "$TIME Apply new ipfw rule!" >> /var/log/applyipfw.log
fi
rm -f /etc/ipfw.rule.tmp
这里顺便再提供一下我的ipfw.static的内容:
CODE
add deny log ip from any to any ipoptions rr
add deny log ip from any to any ipoptions ts
add deny log ip from any to any ipoptions ssrr
add deny log ip from any to any ipoptions lsrr
add deny log tcp from any to any in tcpflags syn,fin
#以上为过滤部分扫描包
add allow all from any to any via lo0
add deny all from any to 127.0.0.0/8
add deny all from 127.0.0.0/8 to any
#以上为允许内部回环,以及拒绝127.0.0这样的非Internet IP
#
# tcp rule
#
add allow tcp from any to xxx.xxx.xxx.xxx 80 in
add allow tcp from xxx.xxx.xxx.xxx 80 to any out
add allow tcp from any to xxx.xxx.xxx.xxx 22 in
add allow tcp from xxx.xxx.xxx.xxx 22 to any out
#允许静态的http和ssh服务,必须这样,否则当规则发生变化的时候,你和服务器会自动断开一次连接
add check-state
#启动动态规则检查
add deny tcp from any to any established
add allow tcp from any to me 21 in setup keep-state
#add allow tcp from any to xxx.xxx.xxx.xxx 22 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 25 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 53 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 80 in setup keep-state
#add allow tcp from any to xxx.xxx.xxx.xxx 110 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 465 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 995 in setup keep-state
add allow tcp from any to any out setup keep-state
#
# udp rule
#
add allow udp from any to xxx.xxx.xxx.xxx 53 in keep-state
add allow udp from 204.123.2.5 123 to xxx.xxx.xxx.xxx 123 in keep-state
add allow udp from any to any out keep-state
#
# icmp rule
#
add allow icmp from any to any out keep-state
add allow icmp from any to me icmptypes 3 in
add allow icmp from any to me icmptypes 11 in
#ICMP的动态允许,允许自己ping其他服务器,其他服务器不允许ping自己
关于防火墙的建立请参考我以前的文章《利用 FreeBSD 组建安全的网关》
http://bbs.nettf.net/forums/index.php?showtopic=12866
文章用的是FreeBSD 4.x,但大部分建立过程基本不变。
脚本等东西设置完成以后,就设置crontab,让crond进程每过5分钟运行一次脚本,这样服务器就能自动的封杀那些恶意攻击的IP了。
总结:
D.o.S攻击是一个很广义的名称,要防止D.o.S是几乎不可能的,如果真要防止只能改造上网的人的心态,建立法律来阻断D.o.S攻击的发起。然而我们很难做到这些,所以我们就先采用这些捷径来解决问题吧,虽然并不满意,比如这个脚本绝对无法判断出某一个IP有很多人使用的情况,这样的情况连人都难分析出来,又何况一个脚本呢?
2005年7月9日,晚上我登陆S8S8论坛后发现数据库居然连接错误,我第一反应以为数据库出了问题,于是迅速登陆服务器,发现登陆过程非常缓慢,好不容易登陆以后连运行个简单的命令都非常慢,所以这让我感觉可能遭到攻击,相信这个时候CPU肯定是100%占用,加上运行速度慢,所以跳过CPU的检查,直接查看网络访问状态,果然分析没错,论坛的并发连接达到几百个,而这几百个都来自同一个IP为219.133.48.220,而连接状态不是以SYN为主,全是ESTABLISHED,证明建立的是正常的连接,而且是一个完整的连接。我设置防火墙规则把该IP拒绝掉,之后,服务器马上恢复正常,S8S8论坛也马上恢复正常。
论坛故障定位:
解决了这个攻击者的IP以后,我开始分析:既然建立的是完整的连接,而且在netstat命令中能看到该IP和服务器之间有数据流量,证明这些连接都有发送和读取服务器数据,那么HTTP日志里肯定有记录。于是从论坛的日志里过滤出所有有关219.133.48.220的信息,果然不出我所料,记录发现大量的HTTP请求,而且是循环操作,这些请求有某个页面的读取,还有login登陆动作,由于并发连接数量非常大,所以导致服务器数据库负荷增加,看来攻击着的目的就是要耗尽服务器的资源。而这种攻击和以往的synflood等攻击有些不同,synflood利用协议的漏洞进行攻击,属于协议层,而这次的是利用HTTP以及数据库的瓶劲进行攻击,属于应用层攻击,看来攻击者用心比较险恶。
解决方法:
攻击者既然是应用层的攻击,那么他的所有IP连接都为真实有效的,而要达到拒绝服务的程度,就必须建立超过普通连接数量的程度才行。根据这个特性,我在服务器写了一个脚本,专门检查服务器的连接状态,当发现这样的连接以后,自动把攻击者的IP加进防火墙内,而我是一个搞FreeBSD的,FreeBSD用的是IPFIREWALL防火墙,所以我的脚本自然也是针对FreeBSD。脚本如下:
CODE
#!/bin/sh
#
#compile by iceblood 2005/07/10
#Web:
![url.gif](http://jcszjswkzhou.itpub.net/images/small/url.gif)
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
#找到所有超过30个连接的IP并设置成规则写入/etc/ipfw.dynamic文件里
netstat -n | grep tcp4 | awk '{print $5}' | awk -F'.' '{print $1"."$2"."$3"."$4}' | sort | uniq -c | awk '$1>30' | awk '{print "add deny tcp from "$2" to me 80"}' >> /etc/ipfw.dynamic
#由于难免会出现一些重复规则,所以把规则整理一下再写入/etc/ipfw.rule.tmp文件里
cat /etc/ipfw.dynamic | sort | uniq -i > /etc/ipfw.rule.tmp
#让历史动态规则同样保持没有重复规则
cp -f /etc/ipfw.rule.tmp /etc/ipfw.dynamic
#服务器静态规则,这个规则就自己写了
cat /etc/ipfw.static >> /etc/ipfw.rule.tmp
#验证新生成的规则和老规则的md5码
OLDRULE=`md5 /etc/ipfw.rule | awk '{print $4}'`
NEWRULE=`md5 /etc/ipfw.rule.tmp | awk '{print $4}'`
#如果新老规则的md5码不一样就把新规则替换老规则,并且应用新规则。
if [ "$OLDRULE" != "$NEWRULE" ]; then
mv -f /etc/ipfw.rule.tmp /etc/ipfw.rule
sh /etc/rc.firewall
TIME=`date '+%Y/%m/%d %H:%M:%S'`
echo "$TIME Apply new ipfw rule!" >> /var/log/applyipfw.log
fi
rm -f /etc/ipfw.rule.tmp
这里顺便再提供一下我的ipfw.static的内容:
CODE
add deny log ip from any to any ipoptions rr
add deny log ip from any to any ipoptions ts
add deny log ip from any to any ipoptions ssrr
add deny log ip from any to any ipoptions lsrr
add deny log tcp from any to any in tcpflags syn,fin
#以上为过滤部分扫描包
add allow all from any to any via lo0
add deny all from any to 127.0.0.0/8
add deny all from 127.0.0.0/8 to any
#以上为允许内部回环,以及拒绝127.0.0这样的非Internet IP
#
# tcp rule
#
add allow tcp from any to xxx.xxx.xxx.xxx 80 in
add allow tcp from xxx.xxx.xxx.xxx 80 to any out
add allow tcp from any to xxx.xxx.xxx.xxx 22 in
add allow tcp from xxx.xxx.xxx.xxx 22 to any out
#允许静态的http和ssh服务,必须这样,否则当规则发生变化的时候,你和服务器会自动断开一次连接
add check-state
#启动动态规则检查
add deny tcp from any to any established
add allow tcp from any to me 21 in setup keep-state
#add allow tcp from any to xxx.xxx.xxx.xxx 22 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 25 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 53 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 80 in setup keep-state
#add allow tcp from any to xxx.xxx.xxx.xxx 110 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 465 in setup keep-state
add allow tcp from any to xxx.xxx.xxx.xxx 995 in setup keep-state
add allow tcp from any to any out setup keep-state
#
# udp rule
#
add allow udp from any to xxx.xxx.xxx.xxx 53 in keep-state
add allow udp from 204.123.2.5 123 to xxx.xxx.xxx.xxx 123 in keep-state
add allow udp from any to any out keep-state
#
# icmp rule
#
add allow icmp from any to any out keep-state
add allow icmp from any to me icmptypes 3 in
add allow icmp from any to me icmptypes 11 in
#ICMP的动态允许,允许自己ping其他服务器,其他服务器不允许ping自己
关于防火墙的建立请参考我以前的文章《利用 FreeBSD 组建安全的网关》
![url.gif](http://jcszjswkzhou.itpub.net/images/small/url.gif)
脚本等东西设置完成以后,就设置crontab,让crond进程每过5分钟运行一次脚本,这样服务器就能自动的封杀那些恶意攻击的IP了。
总结:
D.o.S攻击是一个很广义的名称,要防止D.o.S是几乎不可能的,如果真要防止只能改造上网的人的心态,建立法律来阻断D.o.S攻击的发起。然而我们很难做到这些,所以我们就先采用这些捷径来解决问题吧,虽然并不满意,比如这个脚本绝对无法判断出某一个IP有很多人使用的情况,这样的情况连人都难分析出来,又何况一个脚本呢?
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-124931/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-124931/