哥使用Linux
分类: LINUX
2008-01-16 16:07:25
从历年来对公司服务器DOS攻击案例的汇总中,我们可以获知攻击类型90%都是syn-flood攻击。SYN攻击是最常见又最容易被利用的一种攻击手法,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。我们被攻击的案例中就有一些是由于被攻击机器前的防火墙负载急剧上升,造成其后面的所有服务器都不可访问。
为了有效的防范这种类型攻击,我们准备了一些技术方案,并对这些方案做了实验环境的测试。在实际环境中可以灵活的将这些防范方法组合起来使用。
准备“转发服务器”(一个机房准备一台),某台服务器被攻击时,就让所有的访问包都通过这些“抗攻击转发服务器” 做转发,我们在上面事先做好抗DOS的配置,过滤掉攻击包,将正常包发给被保护服务器。方案的基本思路是采用的是负载均衡的原理。
转发服务器的过滤方法:
n 单关键字的包过滤(iptables u32规则)
n 双关键字的包过滤(iptables u32规则)
n 基于亚太地区的IP过滤 (从whois上收集)
转发服务器的转发方法:
n DNAT(iptables)
n 应用代理(Apache反向代理,只能针对网站)
syn-flood的攻击抓包后分析后,如有唯一的一个特征与别的合法包不同,,例如ttl=123或者window=10000.就可以利用这个方法来过滤。
n 优点:用此方法效率高,对系统的负载最小。最大可过滤
n 缺点:带有此种包特征的syn-flood比较少,出现误过滤的可能性比较大。
n 实验室测试结果:转发服务器测试机cpu,双P4
流量 效率 |
|
|
|
|
没有测试更大流量 |
cpu |
10% |
25% |
45% |
90% |
—— |
内存 |
无变化 |
无变化 |
无变化 |
无变化 |
—— |
被攻击机访问 |
正常访问 |
正常访问 |
正常访问 |
1秒左右 |
—— |
synflood攻击流量
n 正常流量数据包随机采样分析结果:
Window值单条件分布表:
Window |
65535 |
8192 |
16384 |
64240 |
64800 |
14600 |
其它 |
包数量 |
2359 |
1960 |
831 |
724 |
337 |
328 |
660 |
百分比 |
32.76% |
27.23% |
11.54% |
10.06% |
4.68% |
4.50% |
9.18% |
TTL值(1-64)单条件分布表:
TTL |
<46 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54-63 |
包数量 |
154 |
114 |
9 |
92 |
90 |
170 |
272 |
502 |
381 |
97 |
百分比 |
|
|
|
|
|
|
|
6.97% |
|
|
TTL值(>=64)单条件分布表:
TTL |
64-111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
>119 |
包数量 |
303 |
333 |
350 |
559 |
692 |
1165 |
996 |
551 |
243 |
123 |
百分比 |
|
|
|
|
9.6% |
16.2% |
13.8% |
7.6% |
|
|
注:随机采样BNB网站20万个包,其中SYN包有7199个。
n 方案
修改/etc/ddos.sh,加入
iptables –A FORWARD –m u32 –u32 “5&0xFF=
iptables –A FORWARD –m u32 –u32 “32&0xFFFF=
注:如果采用TTL特征过滤和DNAT一起用的方法,TTL值必须减一。
基于单关键字包过滤可适用的机率少以及误过滤的可能性比较大。可以采取双关键字的包过滤。
n 优点:可以过滤大量的syn-flood包,而且误过滤的可能性比较小。
n 缺点:抓包后分析出双关键字的特征比较慢。
n 实验室测试结果:转发服务器测试机cpu,双P4
流量 效率 |
|
|
|
|
没有测试更大流量 |
cpu |
10% |
25% |
45% |
90% |
—— |
内存 |
无变化 |
无变化 |
无变化 |
无变化 |
—— |
被攻击机访问 |
正常访问 |
正常访问 |
正常访问 |
1秒左右 |
—— |
经测试双关键字和单关键字过滤效果几乎相同
n 正常流量数据包随机采样分析结果:
Window,TTL双值条件分布表
Window\TTL |
115 |
116 |
117 |
118 |
注:随机采样BNB网站20万个包,其中SYN包有7199个。
n 方案
修改/etc/ddos.sh,加入
Iptables –A FORWORD –m u32 –u32 “5&0xFF=118&&32&0xFFFF=
注:如果采用TTL特征过滤和DNAT一起用的方法,TTL值需减一。
有时,syn-flood的攻击包伪装得很好,比较难取特征值,这时就可以用基于亚太地区IP过滤的方法。
n 优点:如果synflood中,来源IP是随机分布的,过滤效果较好。
n 缺点:亚太地区外的用户无法访问被攻击机。
n 实验室测试结果:
根据实际测试,此方法在攻击为随机IP的情况下,可以过滤掉92%的流量。
n 方案
修改/etc/ddos.sh,加入
iptables -A INPUT -p tcp -s 58.0.0.0/7 -j ACCEPT
iptables -A INPUT -p tcp -s 60.0.0.0/7 -j ACCEPT
iptables -A INPUT -p tcp -s 124.0.0.0/7 -j ACCEPT
iptables -A INPUT -p tcp -s 126.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp -s 169.208.0.0/12 -j ACCEPT
iptables -A INPUT -p tcp -s 196.192.0.0/13 -j ACCEPT
iptables -A INPUT -p tcp -s 210.0.0.0/7 -j ACCEPT
iptables -A INPUT -p tcp -s 218.0.0.0/7 -j ACCEPT
iptables -A INPUT -p tcp -s 220.0.0.0/7 -j ACCEPT
iptables -A INPUT -p tcp -s 222.0.0.0/8 -j ACCEPT
iptables -A INPUT -j DROP
将过滤后的正常包转发给保护机。采用iptables的DNAT方式。
n 方案
1. 开启内核转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward
2. 修改/etc/ddos.sh,加入
iptables -t nat -A PREROUTING –dst 本器IP -p tcp –dport 80 -j DNAT –to-destination 被保护服务器IP
iptables -t nat -A POSTROUTING -p tcp –dst 被保护服务器IP -j SNAT –to-source 本机IP
n 优点:在无明显的包特征时,可以采用应用代理。
每台转发服务器能防
n 缺点:
仅可防御针对网站的攻击。
n 实验室测试结果 (SYN_Cookie + 亚太过滤 +apache转发):
流量 效率 |
|
|
|
没有测试更大流量 |
注:一定要启用SYN_Cookie 。
n 配置
1.修改apache配置文件并启用apache
ServerName hostname
RewriteEngine on
ProxyRequests off
UseCanonicalName off
DocumentRoot /usr/local/apachenew/htdocs
RewriteRule ^/(.*)$ http://保护机/$1 [P,L]
硬件抗DOS设备基本是使用syncookie和synproxy方法。
SynProxy原理,当客户端SYN包到达“抗攻击转发服务器”时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击。
SynCookie原理,当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端, 如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。如果相等,直接完成三次握手。
目前对4款抗dos的设备做过测试,基本百兆的设备可以档
使用BSD服务器做syncookie和synproxy只能达到
n 各地机房准备1台linux服务器,共7台。
n 硬件配置要求,双P4 cpu2.8或以上,512内存。(最好是双cpu,测试中cpu是硬件瓶颈)
1、 进入iptables插件目录,执行以下操作
export KERNEL_DIR=”/usr/src/linux-2.4″
export IPTABLES_DIR=”iptables的源码目录”
./runme extra
目前只需要安装u32插件
2、 编译linux内核
cd /usr/src/linux-2.4
make mrproper
make menuconfig
进入“Networking options”->”IP: Netfilter Configuration”,选择刚才加入的扩展功能。
make dep
make bzImage
make modules
make modules_install
make install
修改/etc/grub.conf使启动新内核
重启服务器。
3、 进入iptables源码目录
export KERNEL_DIR=”/usr/src/linux-2.4″
export IPTABLES_DIR=”iptables源码目录“
make install
make install-devel
4、 修改文件/etc/sysctl.conf
net.ipv4.ip_forward=1
1、 编译apache
./configure –prefix=/usr/local/apache –enable-module=rewrite –enable-shared=rewrite –enable-module=proxy –enable-shared=proxy
2、 修改apache配置文件httpd.conf文件
加入: LoadModule rewrite_module libexec/mod_rewrite.so
LoadModule proxy_module libexec/libproxy.so
MaxClients 4096 #设置最大客户数为4096
《VirtualHost 本机IP:80》
ServerName hostname
RewriteEngine on
ProxyRequests off
UseCanonicalName off
DocumentRoot /usr/local/apachenew/htdocs
RewriteRule ^/(.*)$ http://保护机IP/$1 [P,L]
《/VirtualHost》
进入snort源码目录
./configure –prefix=/usr/local/snort
make;make install
snort抓包的命令snort –edv > snort.txt
进入ifstat源码目录
./configure
make;make install
命令行ifstat检测流量
防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有增加最大半连接和缩短超时时间等。
# sysctl -w net.ipv4.tcp_max_syn_backlog=”2048″ 增加最大半连接数
# echo 1 > /proc/sys/net/ipv4/tcp_synack_retries 缩短超时时间,重传次数改为1
iptables –F
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#允许公司管理和办公IP访问,默认开放。
iptables -A INPUT -s 61.172.247.98/32 -j ACCEPT
iptables -A INPUT -s 61.172.247.100/32 -j ACCEPT
iptables -A INPUT -s 222.66.40.68/32 -j ACCEPT
iptables -A INPUT -s 222.66.40.69/32 -j ACCEPT
iptables -A INPUT -s 61.172.247.99/32 -j ACCEPT
iptables -A INPUT -s 61.152.122.33/32-j ACCEPT
iptables -A INPUT -s 61.152.132.97/32 -j ACCEPT
#包过滤策略,攻击时开放,默认不开放。
#iptables –A FORWARD –m u32 –u32 “32&0xFFFF=
#iptables –A FORWARD –m u32 –u32 “5&0xFF=117&&32&0xFFFF=
#允许亚太地址访问, 攻击时开放,默认不开放。
#iptables -A INPUT -s 58.0.0.0/7 -j ACCEPT
#iptables -A INPUT -s 60.0.0.0/7 -j ACCEPT
#iptables -A INPUT -s 124.0.0.0/7 -j ACCEPT
#iptables -A INPUT -s 126.0.0.0/8 -j ACCEPT
#iptables -A INPUT -s 169.208.0.0/12 -j ACCEPT
#iptables -A INPUT -s 196.192.0.0/13 -j ACCEPT
#iptables -A INPUT -s 210.0.0.0/7 -j ACCEPT
#iptables -A INPUT -s 218.0.0.0/7 -j ACCEPT
#iptables -A INPUT -s 220.0.0.0/7 -j ACCEPT
#iptables -A INPUT -s 222.0.0.0/8 -j ACCEPT
#允许被保护的服务器数据通讯
#iptables –A INPUT –s 被保护的机器ip –j ACCEPT
#DNAT,攻击时开放,默认不开放。
#iptables -t nat -A PREROUTING –dst 本机IP -p tcp –dport 80 -j DNAT –to-destination 被保护服务器IP
#iptables -t nat -A POSTROUTING -p tcp –dst 被保护服务器IP -j SNAT –to-source 本机IP
#禁止其它所有访问
iptables -A INPUT -j DROP
原文出处网站架构华人社区: