Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155884
  • 博文数量: 41
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-14 10:16
文章分类
文章存档

2011年(1)

2010年(5)

2009年(35)

我的朋友

分类: LINUX

2009-10-15 12:04:00

利用上一章分析结果,本章将研究基于Linux抵御拒绝服务(Denial of Services,DoS)攻击防火墙。

系统设计

4.1.1  系统模块设计

本防火墙系统的模块可划分三层:最底层为Linuxnetfilter内核,然后是基本模块层(实现防火墙所必备的功能),最上层为抵御DoS攻击的模块层(见图4-1)

4-1  防火墙系统模块

4.1.2  系统环境配置

1.系统拓扑图

 

4-2  系统拓扑图

2.常量定义:

EXTERNAL INTERFACE="eth0"         //防火墙与Internet连接网卡

INTERNAL INTERFACE="ethl"         //防火墙与内部连接网卡

DMZ INTERFACE="eth2''             //防火墙与DMZ区连接网卡

LOOPBACK INTERNET="LO"            //系统回环接口

LOOPBACK="127.0.0.0/8"            //保留的回环地址范围

FIREWALLADDR="202.101.123.1"      //防火墙IP地址,合法IP地址

ANYWHERE="any/0"                  //任何地址

INTERNALADDR=" 172.16.0.0/16"     //内部网络地址

DMZADDR=" 192.168.9.0/24"         //DMZ区网络地址,内部地址

WWWADDR=" 192.168.9.1/24"         //WWW服务器地址,内部地址

CLASS D="224.0.0.0/4"             //D类多播地址

CLASS E="240.0.0.0/5"             //E类保留地址

4.1.3  系统默认策略

Linux防火墙中,每个数据包都要经过检查,即与已建立的防火墙规则逐条匹配,并执行匹配规则策略,或执行默认策略。

前面已经叙述有两个基本策略可供选择:一个是默认允许一切:另一个是默认禁止一切。在本系统中采用的是默认禁止一切的防火墙默认策略,它使得流经iptables防火墙的数据包除非特别允许否则都将被丢弃。

系统基本模块

本节在netfilter框架基础上,利用iptable脚本语一言实现系统基本模块。

4.2.1  包过滤模块实现

通过对数据包头的过滤,控制数据包进出内部网络,从而实现对内部网络的管理。对内部局域网,包过滤是一种简单有效的手段。由于此模块是建立在netfilter内核框架上的,而netfilte:又提供对连线跟踪的支持(见上章),因此此模块支持状态检测(Linux中称状态检测为连线跟踪)功能。

第一步,设置默认策略:

iptables -P INPUT DROP

iptables -P OUTPUT REJECT

iptables -P FORWARD REJECT

上面三条命令意思为:经过INPUT(输入)OUTPUT(输出)FORWARD(转发)三条链的所有数据包在默认情况下都被丢弃或拒绝。

第二步,允许所有从内部网络发出的数据包进入Internet;激活状态包检查允许任何相关的返回流量回到防火墙,

iptables -A OUTPUT -i eth0 -s$FIREWALLADDR –d $ ANYWHERE –j ACCEPT

iptables -A INTPUT-m state -state ESTABLISHED,RELATED –j ACCEPT

第三步,实现内部网络接口和网络外部接口之间的数据转发,激活状态包检查:

iptables -A FORWARD -i  ethleth0 –s $ FIREWALLADDR -d $ ANYWHERE –j ACCEPT

iptables -A FORWARD -m state -state ESTABLISHED,RELATED -j ACCEPT

NAT模块实现:

如果内部网络的主机使用Internet合法地址,包过滤模块是可以正常运行的。但如用保留的公共IP地址(172.16.0.0/16,则必须采用网络地址转换技术实现网络内部主机和Internet的连接。

1.通过NAT屏蔽内部网络

目标:通过NAT屏蔽内部网络,并允许内部网络访问Internet。但不允许Internet向内部网络发送网络连接请求。

第一步,设置默认策略:

iptables -P INPUT DROP

iptables -P OUTPUT REJECT

iptables -P FORWARD REJECT

第二步,允许所有从内部网络发出的数据包进入Internet;激活状态包检查允许任何相关的返回流量回到防火墙:

iptables -A OUTPUT -i eth0 -s $FIREWALLADDR -d $ANYWHERE  -j ACCEPT

iptables -A INTPUT -m state -state ESTABLISHED,RELATED –j ACCEPT

第三步,通过NAT实现内网屏蔽,激活状态包检查规则:

iptables -t nat -A POSTROUTING –o eth0 -s $INTERNALADDR -d$ ANY WHERE –j SNAT-to-source $FIREWALLADDR –j ACCEPT

Iptables –t nat -A POSTROUTING -m state -state ESTABLISHED , RELATED -j ACCEPT

第四步,实现内部网络接口和网络外部接口之间的数据转发,激活状态包检查:

iptables -A FORWARD -i ethl -o eth0  -s  $INTERNALADDR  -d $ANYWIIERE  -j  ACCEPT

iptables  -A  FORWARD  -i  ethl  -o  eth2  -s  $INTFRNAI_ADDR  -d $ANYWHERE  -j  ACCEPT

iptables -A FORWARD -m state -state ESTABLISHED , RELATED -j ACCEPT

2.通过NAT来屏蔽服务器

目标:当外网主机访问防火墙80端口时,防火墙进行网络地址转换并自动将请求信息转发到内部WWW服务器。实现对内部WWW服务器的屏蔽。将上面第四步做如下修改,其他不变。

第四步,设置iptables防火墙,使之接收来自任何主机的HTTP请求,并将它们转发至WWW服务器,激活状态包检查:

iptables  -t  nat  -A  PRETOUTING  -p  tcp  -s  $ANYWHERE  -d $FIREWALLADDR -dport http -j DNAT -to-dest $ WWWADDR -j ACCEPT iptables -t nat -A PRETOUTING -m state -state ESTABLISHED,RELATED –j ACCEPT

3.DMZ模块实现:

当前防火墙广泛应用DMZ区设置。在拓扑图中,WWW服务器和代理服务器

组成一个单独网段,形成一个DMZ区。

目标:WWW服务器和代理服务器放置在DMZ:

当外网主机访问防火墙80端口时,防火墙进行网络地址转换并自动将请

求转发到内部WWW服务器,实现对内部WWW服务器的屏蔽。

(2) 当内网主机访问外部WWW服务时,防火墙将HTTP请求转发到代理服务器,代理服务器在TCP3128端口上监听,这个重定向对用户应该是透明的。

第一步,设置默认策略(同前)

第二步,允许所有来自防火墙的数据包进入Internet:激活状态包检查允许任何相关的返回流量回到防火墙:

iptables -A OUTPUT -i eth0 -s$FIREWALLADDR -d$ANYWHERE  -j ACCEPT

iptables -A INTPUT -m state -state ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -m state -state ESTABLISHED,RELATED -j ACCEPT

第三步,通过NAT实现内网屏蔽,激活状态包检查规则:

iptables -t nat -A POSTROUTING -o eth0 -s $INTERNALADDR -d$ ANYWHERE –j SNAT-to-source $FIREWALLADDR -j ACCEPT

iptables -t nat -A POSTROUTING -m state -state ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A FORWARD -i ethl  -o eth0 -s $INTERNALADDR –d $ANYWHERE -j ACCEPT

第四步,设置iptables防火墙,使之接收来自内网主机的HTTP清求,并将它们转发至DMZ区的SQUID代理服务器(此代理服务器用来控制网络访问和优化网络连接):

iptables -t nat -A PRETOUTING -p tcp -s $ANYWHERE$ANYWHERE -dport http -j DNAT -to-dest $SQUIDADDR: 3128ACCEPT

iptablesnat -A PRETOUTING -m state -state ESTABLISHED,RELATED  -j ACCEPT

iptables  -A  FORWARD  -i  ethl  -o  eth0  -s  $INTERNALADDR  -d $SQUIDADDR -port 3128 -j ACCEPT

第五步,设置iptables防火墙,允许外网主机访问DMZWWW服务器,激活状态包检查:

iptables -t nat -A PRETOUTING -p tcp -i eth0 -o eth2 -s $ANYWHERE –d $FIREWALLADDR -dport httpDNAT -to-dent $WWWADDR -j ACCEPT

iptables -t nat -A POSTROUTING -p tcpi eth2 -o eth0 -s $ WWWADDR –d $ANYWHERE -j DNAT-to-source $FIREWALLADDR -j ACCEPT

iptables -A FORWARDi eth0 -o eth2 -s $INTERNALADDR -d $WWWADDR -dport 80 -j ACCEPT

第六步,设置iptables防火墙,允许内网主机访问DMZWWW服务器:

iptables -A FORWARD -i ethl -o eth2 -s $INTERNALADDR -d $WWWADDR -dport 80 -j ACCEPT

4.2.2  系统基本模块综合实现

将以上各实例合并起来,就成为一个具有动态过滤、状态检测、NATDMZ等功能的防火墙。它是本系统抵御DoS攻击模块的基础。

抵御DoS攻击模块

本节将用netfilter方法实现抵御几种常见DoS攻击模块。

4.3.1  DoS攻击

DoS攻击是网络攻击最常见的一种。它故意攻击网络协议的缺陷或直接通过某种手段耗尽被攻击对象的资源,目的是让目标计算机或网络无法捉供正常的服务或资源访问,使目标系统服务停止响应甚至朋溃,而在此攻击中并不入侵目标服务器或目标网络设备。这些服务资源包括网络宽带、系统堆栈、开放的进程。或者允许的连接。这种攻击会导致资源耗尽,无论计算机的处理速度多快、内存容量多大、网络带宽的速度多快都无法避免这种攻击带来的后果。任何资源都有一个极限,所以总能找到一个方法使请求的值大于该极限值,导致所提供的服务资源耗尽。

DoS攻击有许多种类,主要有Land攻击、死亡之ping、泪滴、Smurf攻击及SYN洪水等。

4.3.2  抵御SYN洪水攻击模块

据统计,在所有黑客攻击事件中,syn洪水攻击是最常见又最容易被利用的一种DoS攻击手法。

1.攻击原理

要理解SYN洪水攻击,首先要理解TCP连接的三次握手过程(Three-wayhandshake)。在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。见图4-3


 

4-3  TCP连接二次握手示意图

第一次握手:建立连接时,客户端发送SYN((SYN=i)到服务器,并进入SYN SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN (ACK=i+1 ),同}Jj’自己也发送一个SYN((SYN j)}SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ACK=j+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

在上述过程中,还有一些重要的概念:

半连接:收到SYN包而还未收到ACK包时的连接状态称为半连接,即尚未完全完成三次握手的TCP连接。

半连接队列:在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN(SYN=i )开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_ RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

Backlog参数:表示半连接队列的最大容纳数目。

SYN-ACK重传次数:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息、从半连接队列中删除。注意,每次重传等待的时间不一定相同。

半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

上面三个参数对系统的TCP连接状况有很大影响。

SYN洪水攻击属于DoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从图4-3可看到,服务器接收到连接请求(SYN=i )将此信息加入未连接队列,并发送请求包给客户( SYN=j,ACK=i+1 ),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN 请求

被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。过程如下:   

攻击主机C(地址伪装后为C')-----大量SYN---->彼攻击主机

 C'<-------SYN/ACK----被攻击主机

由于C’地址不可达,被攻击主机等待SYN包超时。攻击主机通过发人量SYN包填满未连接队列,导致正常SYN包被拒绝服务。另外,SYN洪水攻击还可以通过发大量ACK包进行DoS攻击。

2.传统算法

抵御SYN洪水攻击较常用的方法为网关防火墙法、中继防火墙法和SYNcookies。为便于叙述,将系统拓扑图简化为图4-4。图中,按网络在防火墙内侧还是外侧将其分为内网、外网(内网是受防火墙保护的)。其次,设置防火墙的SYN重传计时器。超时值必须足够小,避免backlog队列被填满;同时又要足够大保证用户的正常通讯。

(1) 网关防火墙法

网关防火墙抵御攻击的基本思想是:对于内网服务器所发的SYN/ACK包,防火墙立即发送ACK包响应。当内网服务器接到ACK包后,从backlog队列中移出此半连接,连接转为开连接,TCP连接建成。由于服务器处理开连接的能力比处理半连接大得多,这种方法能有效减轻对内网服务器的SYN攻击,能有效地让backlog队列处于未满状态,同时在重传一个未完成的连接之前可以等待更长时间。

以下为算法完整描述:

第一步,防火墙截获外网客户端发向内网服务器SYN数据包,允许其通过,抵达内网服务器。同时在连接跟踪表中记录此事件.

第二步,防火墙截获服务器发向客户端的SYN/ACK响应包,用连接跟踪表中记录的相应SYN包匹配它.

第三步,防火墙让截获的SYN/ACK继续进行(发向客户端)。同时,向内网服务器发送ACK包。这样,对服务器来说,TCP连接三次握手己经完成。系统在backlog队列中删掉此半连接.

第四步,看此TCP连接是否有效,相应产生两种解决方法。如果客户端的连接尝试是有效的,那么防火墙将接到来自客户端的ACK包,然后防火墙将它转发到服务器。服务器会忽略这个冗余的ACK包,这在TCP协议中是允许的.

如果客户端的IP地址并不存在,那么防火墙将收不到来自客户端的ACK包,重转计时器将超时。这时,防火墙重传此连接.

(2) 中继防火墙法

中继防火墙抵御攻击的思想是:防火墙在向内网服务器发SYN包之前,首先完成与外网的三次握手连接,从而消除SYN洪水攻击的成立条件。

以下为算法完整描述:

第一步,防火墙截获外网客户端发向内网服务器SYN数据包.

第二步,防火墙并不直接向内网发SYN数据包,而是代替内网服务器向外网发SYNIACK数据包.

第三步,只有接到外网的ACK包,防火墙向内网发SYN.

第四步,服务器应答SYN/ACK.  

第五步,防火墙应答ACK.    

(3) 分析

首先分析算法的性能,可以看出:为了提高效率,上述算法使用了状态检测等机制(可通过本系统的基本模块层得以实现)

其检测逻辑见图4-5


 

                        4-5  检测逻辑

 

从图4-5可看出,对于非SYN(CSYN/ACKACK),如果在连线跟踪信息表未查找到相应项,则还要匹配规则库,而匹配规则库需比较诸多项(IP地址、端口号等),花费较大,这会降低防火墙的流量。另外,在中继防火墙算法中,由于使用了SYN包代理,增加了防火墙的负荷,也会降低防火墙的流量。

其次,当攻击主机发ACK包,而不是SYN包,算法将出现安全漏洞。一般地,TCP连接从SYN包开始,一旦 SYN包匹配规则库,此连接将被加到连接跟踪表中,并且系统给其60s延时。之后,当接到ACK包时,此连接延时突然加大到3600s。如果,TCP连接从ACK包开始,同时此连接未在连接跟踪表中注册,ACK包会匹配规则库。如匹配成功,此连接将被加到连接跟踪表中,同时其延时被设置为3600s。即使系统无响应,此连接也不会终止。如果攻击者发大量的ACK包,就会使半连接队列填满,导致无法建立其它TCP连接。此类攻击来自于内网。因为,来自于外网的ACK包攻击,服务器会很快发RST包终止此连接(SOs>。而对于内网的外发包,其限制规则的严格性要小的多。一旦攻击者在某时间段内从内网发大量ACK包,并且速度高于防火墙处理速度,很容易造成系统瘫痪。

(4) SYN cookies

Linux支持SYN cookies,它通过修改TCP协议的序列号生成方法来加强抵御SYN洪水攻击能力。在TCP协议中,当收到客户端的SYN请求时,服务器需要回复SYN-SACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端口、服务器IP地址和服务器端口以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到。cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)

此算法的优点是:半连接队列满时,SYN cookies仍可以处理新SYN请求。缺点是:某些TCP选项必须禁用,如大窗口等。计算cookies有花销。

综合上述三种算法的优点,克服其缺点,下面给出一个改进算法。

3.改进算法

目标:

本节给出的改进算法应该具有以下特点:

(1) 克服非SYN包需与规则库匹配的缺点,提高防火墙的流量;

(2) 能抵御ACK类的攻击;

(3) 半连接队列填满时,仍能处理新SYN请求;

(4) 数据包处理是透明的。

算法思想:

(1) 为避免不必要的规则库匹配,应该在接到建立连接所必需的包后,才将此连接的开始SYN包加入到连接跟踪表。

(2) 充分利用TCP数据包的包头信息,特别是其控制位,它反映了连接的状态。

(3) 为保证TCP选项的完整性,半连接队列未满时,不用 SYN cookiesa

措施

增设一个预连接表。SYN包匹配规则库后,先放入预连接表。非SYN包不用匹配规则库,而只需查找预连接表。

通过ACK位,区分数据包传输方向(进或出)。过滤SYN位,区分是否SYN包。

加设一个判断步骤,判断半连接队列是否填满。如果满,不用用SYN cookies

算法描述

(1) 如果防火墙接到SYN包,判断半连接队列是否已满,已满则启用SYNcookies 。否则,与规则库匹配,不匹配则登记此包后弃掉它。如匹配则查找预连接表,是否有此包的关键字。有,则登记后弃包:否则,将此包关键字加到预连接表并转发此包;

(2) 如果防火墙接到SYN/ACK包,它根据预连接表中注册的SYN关键字匹配SYN/ACK包的关键字。如不匹配,登记后弃包;如匹配,查找连接跟踪表,看是否己经在连接跟踪表中注册。没有注册,则把此包的关键字拷贝到连接跟踪表中并转发此包;如果已注册,登记后弃包;

(3) 如果防火墙接到ACK包,它根据连接跟踪表匹配ACK包关键字。如匹配,此包被转发,连接被建立。同时,其在预连接表中相应的关键字将被删掉。如不匹配,登记后弃包。

逻辑流程图见图4-6


 

4-6  算法逻辑流程图

算法分析:

下面分析一下改进算法是如何抵御SYN洪水攻击的:

(1) 防火墙过滤SYN包以抵御SYN洪水攻击过程:

防火墙截获外网客户端发向内网服务器SYN数据包,允许其通过,抵达内网服务器。同时在预连接表中记录此包关键字;      

如果在连接建立之前,防火墙截获了另一个从客户端到服务器的SYN包,它将阻塞此包,因为此包关键字已在预连接表中注册。

(2) 防火墙过滤SYN/ACK包以抵御SYN洪水攻击过程;

防火墙截获服务器对客户端的SYN/ACK应答包同时按此包关键字查找预连接表是否有相应SYN包;

如关键字未找到,登记并弃包;

如找到了关键字,拷贝此关键字并与连接跟踪表匹配;

如匹配成功,说明已有此包,登记并弃包;

如匹配不成功,说明无此包,此包关键字被加入到连接跟踪表中并转发此包。

(3) 防火墙过滤ACK包以抵御ACK洪水攻击过程:

防火墙截获客户端对服务器的ACK应答包。如此连接是有效的,那么防火墙将能在连接跟踪表中找到相应项并转发此包;

如防火墙在连接跟踪表中找不到相应项,说明此ACK包不属于一个建好的连接。登记并弃包。

结论:

(1) 改进算法可以根据半连接队列是否已满,选择是否采用SYN cookies。这样,既能保证在连接队列未满状态下,TCP协议的完整性及工作高效性;又可以在连接队列满状态下,仍进行TCP连接(但这时TCP协议某些选项被禁用)

(2) 改进算法根据包类型( SYN, SYN/ACKACK三类)分别采用不同处理方法。提高了安全性;

(3) 规则库的匹配工作只对SYN包进行,而对ACK包仅需查找连接跟踪表。从而大大减少了匹配运算,使得防火墙流量得以大大提高;

(4) 算法再改进

问题:

上述改进算法提高了防火墙流量,减少了安全漏洞,但仍可在其它力一面做进一步改进。主要表现在:未充分挖掘半连接队列中各连接项的信息;半连接队列填满后,只能使用SYN cookiesTCP连接,对半连接队列无能为力。这种被动方式在受到攻击时,尤其不利。因此,对这种被动方式作出改进就很有必要了。

算法思想:

充分挖掘半连接队列中连接项信息,采用主动方式检测SYN攻击,一旦发现可能是SYN攻击包,则发RST对其重置,将此连接删掉。此方式虽有风险(S YN攻击包可能误判),但在半连接队列填满时使用,利是大于弊的。

检测SYN攻击方法:

采用占用时间权值计算法,检测半连接队列中SYN攻击包。首先,建立一个权值计算表,记录时间权值计算所需要素:IP地址、存取次数、首次存取时问、最后一次存取时间、平均使用时间及传输数据大小。这些数据从每次收到SYN包时开始记取,因此是动态更新的。利用这些数据计算不同IP地址的SYN包的权值。

式中N为常数,C为存取次数。

判定准则:设定一个阂值MAXW,比较WMAXW,如超出,则可能是SYN攻击包。

算法描述

判断半连接队列是否满。如未满不做处理,如满,则执行下一步;

遍历半连接队列,计算每个SYN包的W;

如果W>MAXW则发RST重置,删掉此包。

(5) 实现

模块底层

此模块建立在本系统的基本模块层之上,所以基本模块以及Linux平台所提供的功能可以直接使用:包过滤、地址转化、连线跟踪、规则库以及SYN cookies等。Linux提供了一个系统参数CONFIG SYN COOKIES来决定SYN cookies功能的开关。

4.3.3  抵御泪滴攻击模块

1.攻击原理

泪滴(teardrop)攻击利用在TCP/IP堆栈中IP分片中的包的协议头所包含的信息来实现自己的攻击。IP分片含有其原包的信息,某些操作系统在收到含有重叠偏移的伪造分段时将崩溃。teardrop便是一个经典的利用这个漏洞的攻击程序。

2.处理分片重组时的算法漏洞

在某些系统中,在处理分片组装[3]时存在漏洞,发送异常的分片包会使系统运行异常。假定发生如下情况:发送两个..IP分片包(Frag 1, Frag2 ),其中第二个IP包完全与第一个在位置上重合(见图4-7 )。图中len, offsetend分别表示长度、起点位置及终点位置,offset2

4-7  IP分片位置示意图

分片组装算法是:offset2向后调到end 1 ( offset2=end 1 ),然后更改len2的值:lent=end2-offset2(end2-endl)。如果两分片没有重合,end2将大于end1,二者之差将大于零。但如出现图4-7这种情况,运算后len2将变成了一个小于零的值。当用memcpy ( xx,   xx,  len2)函数进行内存拷贝时,由于len2<0,导致系统出错。teardrop攻击正是通过精心构造这类分片,攻击主机的。

3.改进算法

增加判断条件,首先计算len2的值,如果出现分片长度小于零或此分片与上一个分片完全重叠的情况,则把这个分片丢掉。

4.3.4  抵御Smurf攻击模块

1.攻击原理

可以通过广播地址或其他方法发送广播包到同一网络中的其它所有主机。当某主机使用广播地址发送一个ICMP echo请求包时,其它主机会回应一个ICMPecho应答包,这样此台主机会收到许多应答包。Smurf攻击(directed broadcast)就是使用ICMP这个原理来进行的。攻击时还需要一个假冒的IP源地址,此源地址即要受到攻击的主机地址,目的地址为广播地址。当攻击者以广播地址发送ICMP请求包时,其它主机会发送大量的响应信息给被攻击主机(因为它的地址被攻击者假冒了)。从而造成被攻击主机无法正常工作。

2.解决方案

首先使用网关,按网络在防火墙内侧还是外侧将其分为内网、外网。来自外网的目的地址为广播地址的ICMP请求包,给予拒绝。对内网主机可以向外网发ICMP包,但需要对此ICMP包的源地址进行转换,使外网无法知道内网真实IP地址。对安全有威胁的ICMP:目的地址为重定向、掩码清求等,将被丢弃。

本章小结

本章研究了基于Linux抵御常见DoS攻击的防火墙。首先用iptables方法实现了防火墙底层的基本模块。然后分析了抵御SYN洪水攻击的传统算法,并给出了改进算法。改进算法提高了防火墙流量,增强了抵御SYN洪水攻击的能力。分析了泪滴及Smurf攻击原理,对存在的安全薄弱点提出解决方案。最后用netfilter方法实现了防火墙上层的抵御SYN洪水、泪滴及Smurf攻击模块。经测试,构建的防火墙满足功能要求,可以有效抵御常见DoS攻击。

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