全部博文(297)
分类: LINUX
2007-07-18 16:59:07
曾几何时,系统还被追捧为性较好的系统,很多系统管理员为自己管理的服务器很少被攻击成功而感到自豪。但步入新的Internet年代,各种各样的攻击逐步盯上了,而TCP/IP固有的缺陷也被Cracker大肆利用。
很不走运,手下管理的多台服务器也遭到了不同类型、不同程度的攻击,包括SYN攻击,CLOSE_WAIT攻击,抢占资源(如web的连接等)等等。如果是那些少量ip组成的大规模攻击,一般情况下封ip就能比较好的解决问题了。
如果是就更难办了。这两天,有2台服务器遇到了大规模的SYN_RECV 攻击。主要是针对web的,导致了web访问缓慢并停止服务,甚至机器失去了响应。要对付SYN攻击,得从多个方面入手,如果是分布很广的攻击,还得从交换机、等更高一级的层次进行杜绝。
下面是应付这几天攻击的基本方法:
1)SYN cookie
在linux下以root权限执行:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
这个方法打开了syncookie功能,但实际效果几乎感觉不到。
2)增大backlog
通过增加backlog的数值,可以一定程度减缓大量SYN请求导致TCP连接阻塞的状况,一般这个数值系统默认是1024,实验增加到1280~2048:
echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog
这样在强度不是很高的攻击下,系统响应能力提高了一点。
3)缩短retries次数
系统默认的tcp_synack_retries是5次,将这个数值减少可以提高系统响应能力,实验改为2次:
echo "2" > /proc/sys/net/ipv4/tcp_synack_retries
修改后,SYN_RECV的数量有了少量减少,系统响应也快了一些。
4)限制SYN频率
上述的几个方法实际效果并不理想,尤其是攻击基本无效,目前比较有效的是对SYN的频率和次数进行限制,这样最大限度的控制了单个IP地址发动攻击的能力。
例如将SYN请求的次数限制在30次每分钟,系统默认是5次/秒,显然太高,同时将burst从默认的5个降低到2个。
/sbin/iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m \
limit --limit 30/m --limit-burst 2 -j ACCEPT
注意: 该命令在shell下输入,'\'符号表示续行。
进行此操作后,对正常的用户而言无任何感觉上的差异,而并发的SYN请求量下降了不少,服务响应基本正常了。
5)封锁IP/IP段
对于某些单独IP的DOS攻击,封ip简单有效,方法也非常容易:
/sbin/iptables -A INPUT -s a.b.c.d -j REJECT
为了大规模快速的封IP地址/段,我写个小脚本:
#!/bin/sh
IPSRC=`cat ip.txt`
for i in $IPSRC;do
/sbin/iptables -A INPUT -s $i -j REJECT
done
在ip.txt里保存如下格式的ip地址段:
211.95.208.0/24
219.78.190.0/24
4.7.220.0/24
68.163.195.0/24
211.162.165.0/24
......
结束语
虽然采取了种种手段,但是攻击依然没停止过,上述的方法只是减弱了攻击的影响,但却不能彻底解决问题。除了利用IPTables外,还可在应用软件层做一定的连接频率,连接数等限制,例如Apache有一个mod_limitipconn模块就可以实现类似功能。