Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1576004
  • 博文数量: 317
  • 博客积分: 10283
  • 博客等级: 上将
  • 技术积分: 3566
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-04 11:38
个人简介

哥使用Linux

文章分类

全部博文(317)

分类: LINUX

2008-01-16 16:07:25

从历年来对公司服务器DOS攻击案例的汇总中,我们可以获知攻击类型90%都是syn-flood攻击。SYN攻击是最常见又最容易被利用的一种攻击手法,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。我们被攻击的案例中就有一些是由于被攻击机器前的防火墙负载急剧上升,造成其后面的所有服务器都不可访问。

为了有效的防范这种类型攻击,我们准备了一些技术方案,并对这些方案做了实验环境的测试。在实际环境中可以灵活的将这些防范方法组合起来使用。

 

1 技术准备方案

1.1 转发服务器方案

准备“转发服务器”(一个机房准备一台),某台服务器被攻击时,就让所有的访问包都通过这些“抗攻击转发服务器” 做转发,我们在上面事先做好抗DOS的配置,过滤掉攻击包,将正常包发给被保护服务器。方案的基本思路是采用的是负载均衡的原理。

转发服务器的过滤方法:

n 单关键字的包过滤(iptables u32规则)

n 双关键字的包过滤(iptables u32规则)

n 基于亚太地区的IP过滤 (从whois上收集)

转发服务器的转发方法:

n DNATiptables

n 应用代理(Apache反向代理,只能针对网站)

1.1.1 单关键字的包过滤

syn-flood的攻击抓包后分析后,如有唯一的一个特征与别的合法包不同,,例如ttl123或者window=10000.就可以利用这个方法来过滤。

n 优点:用此方法效率高,对系统的负载最小。最大可过滤35M左右的流量。

n 缺点:带有此种包特征的syn-flood比较少,出现误过滤的可能性比较大。

n 实验室测试结果:转发服务器测试机cpu,双P4 2.8G

流量 效率

10M

20M

35M

75M

没有测试更大流量

cpu

10%

25%

45%

90%

——

内存

无变化

无变化

无变化

无变化

——

被攻击机访问

正常访问

正常访问

正常访问

1秒左右

——

synflood攻击流量1M/秒=2150/

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=118” –j DROP #过滤TTL=118

iptables –A FORWARD –m u32 –u32 “32&0xFFFF=16384” –j DROP #过滤window=16384

注:如果采用TTL特征过滤和DNAT一起用的方法,TTL值必须减一。

1.1.2 双关键字的包过滤

基于单关键字包过滤可适用的机率少以及误过滤的可能性比较大。可以采取双关键字的包过滤。

n 优点:可以过滤大量的syn-flood包,而且误过滤的可能性比较小。

n 缺点:抓包后分析出双关键字的特征比较慢。

n 实验室测试结果:转发服务器测试机cpu,双P4 2.8G

流量 效率

10M

20M

35M

75M

没有测试更大流量

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=16384” –j DROP #过滤TTL=118并且window=16384

注:如果采用TTL特征过滤和DNAT一起用的方法,TTL值需减一。

1.1.3 基于亚太地区IP过滤

有时,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

1.1.4 DNAT

将过滤后的正常包转发给保护机。采用iptablesDNAT方式。

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

1.1.5 应用代理

n 优点:在无明显的包特征时,可以采用应用代理。

每台转发服务器能防30M的流量,配合亚太IP过滤可防御高达70M

n 缺点:

仅可防御针对网站的攻击。

n 实验室测试结果 SYN_Cookie + 亚太过滤 +apache转发):

流量

效率

15M

35M

72M

没有测试更大流量

 

注:一定要启用SYN_Cookie

n 配置

1.修改apache配置文件并启用apache

本机IP:80>

ServerName hostname

RewriteEngine on

ProxyRequests off

UseCanonicalName off

DocumentRoot /usr/local/apachenew/htdocs

RewriteRule ^/(.*)$ http://保护机/$1 [P,L]

1.2 硬件抗DOS设备

硬件抗DOS设备基本是使用syncookiesynproxy方法。

SynProxy原理,当客户端SYN包到达“抗攻击转发服务器”时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击。

SynCookie原理,当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端, 如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。如果相等,直接完成三次握手。

目前对4款抗dos的设备做过测试,基本百兆的设备可以档70M11万包/秒)的流量(天元、黑洞),千兆的设备(foundryF5)可以挡70M以上。(没有测试环境,无法再往上测试了)

使用BSD服务器做syncookiesynproxy只能达到10M左右的流量,和硬件设备相差太大。


 

1 转发服务器准备工作

1.1 准备转发服务器

n 各地机房准备1linux服务器,共7台。

n 硬件配置要求,双P4 cpu2.8或以上,512内存。(最好是双cpu,测试中cpu是硬件瓶颈)

1.2 编译内核,安装iptables及其插件

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.3 安装apache反向代理

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》

1.4 安装snort

进入snort源码目录

./configure –prefix=/usr/local/snort

make;make install

snort抓包的命令snort –edv > snort.txt

1.5 安装ifstat

进入ifstat源码目录

./configure

make;make install

命令行ifstat检测流量

1.6 系统优化

防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有增加最大半连接和缩短超时时间等。

# sysctl -w net.ipv4.tcp_max_syn_backlog=”2048″ 增加最大半连接数

# echo 1 > /proc/sys/net/ipv4/tcp_synack_retries 缩短超时时间,重传次数改为1

1.7 /etc/ddos.sh初始文件

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=16384” –j DROP #过滤window=16384

#iptables –A FORWARD –m u32 –u32 “5&0xFF=117&&32&0xFFFF=16384” –j DROP #过滤TTL=118并且window=16384

#允许亚太地址访问, 攻击时开放,默认不开放。

#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

 

原文出处网站架构华人社区:

阅读(2031) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~