TCP/IP协议在设计之初,没有过多的考虑安全这一方面,因此许多协议存在着被***利用的弱点。随着互联网络急剧的膨胀,这些弱点将对我们的企业网络构成日益严峻的威胁。一个很好的例子就是TCP协议,这个协议要求在传输数据之前使用一个“三次握手”过程来建立一个连接。如下图所示.
                                 source                   destination
                                             syn=x
                                        ------------>
                                            
                                             ack=x+1
                                        <------------
                                             syn=y
 
                                             ack=y+1
                                        ------------>
                                             syn=x+1

source端最初发送一个syn=x的报文,请求建立一个连接。
destination端以一个在报文头中设置了ack,syn标记的报文作为响应。
ack标记是对source端请求的响应,syn标记指示自身的连接建立请求。
source端通过向destination端发送一个带ack标记的报文确认目的端的连接建立请求。
当完成上述“三次握手”之后,source端可以发送数据给destination端。
 
TCP协议中的弱点之一是目的端期望源端发送一个最后的ack给目的端,完成连接的建立。***可以利用这个弱点,通过向一个服务发送大量的tcp syn请求报文,但不紧跟着完成这些连接,这种连接类型被称为半开连接(Half-Open Connection)。这样将导致destination端的资源被大量占用,从而致使目的端为新的服务拒绝连接,这就是有名的拒绝服务***(Denial of Service Attack)。
网络***的分类:
1.侦测***
  从严格意义上讲,侦测***不能算是真正的***,它主要指***利用各种手段对网络中的具体的信息(网络拓朴、网络内的主机、主机上开启的服务)进行侦测,但是侦测***往往是真正***的前奏。
2.访问***
  在这种***中,***企图获得对网络和网络资源的未经授权的或非法的访问,尤其是如file、e-mail、web服务器这样的资源。
3.DOS***
  使用DOS***,***企图拒绝到特定资源的合法流量和用户访问,或者至少降低对资源的服务质量。
  DOS***除了TCP的half-open connection以外,还有象基于TCP syn、UDP echo、ICMP echo的flood***。
  缓解DOS***的方法很多,比如说用ACL,URPF等技术都可以实现,但本专题仅专注于用traffic-police(流量策略)技术实现。
traffic-police可以执行两个基本功能:
1.速率限制
2.流量分类
traffic-police的命令结构如下:
police <bps> <burst-normal> <burst-max> conform-action <action> exceed-action <action> [violate-action <action>]
<bps>:CIR。(定义了向token buckets中注入token的平均数率)
<burst-normal>:BC。(定义了BC token buckets的大小)
<burst-max>:BE。(定义了BE token buckets的大小)
<action>:定义行为,可选的行为如下:
?drop—Drops the packet.
?set-prec-transmit new-prec—Sets the IP precedence and sends the packet.
?set-dscp-transmit new-dscp—Sets the DSCP value and transmits the packet.
?transmit—Sends the packet.
接下来,我们将用两个具体的实例来说明CAR的工作原理。
实例1:
在这个例子中,traffic policing被配置为CIR 8000bit/s , BC被配置为1000byte,
初始到达一个450字节的数据包,0.25秒之后,到达一个900字节的数据包。
police被关联在fa0/0的output方向。
Router(config)# class-map access-match
Router(config-cmap)# match access-group 1
Router(config-cmap)# exit
Router(config)# policy-map police-setting
Router(config-pmap)# class access-match
Router(config-pmap-c)# police 8000 1000 conform-action transmit exceed-action drop
Router(config-pmap-c)# exit
Router(config-pmap)# exit
Router(config)# interface fastethernet 0/0
Router(config-if)# service-policy output police-setting

   在这个例子中,初始的token buckets中装满1000byte的tokens,如果在初始阶段到达450字节的数据包,那么需要从token bucket中流出450字节的tokens, 此时,token buckets中剩余(1000-450)byte=550字节的tokens,token bucket中的token数量有富裕,将触发comform-action行为,450字节的数据包将被transmit。0.25秒之后,一个900字节的数据包到达,在0.25秒的时间间隔之内,token buckets中将注入(8000bps/8)*0.25s=250字节的tokens,此时,token buckets中共剩余(550+250)byte=800字节的tokens, 由于到达的数据包的大小为900字节,需要从token buckets中流出相应字节的token数,而此时,token buckets中的token数量不够,将会触发exceed-action行为,此900字节大小的数据包将被drop。
实例2:
在这个例子中,traffic policing被配置为CIR 8000bit/s , BC被配置为1000bytes,BE被配置为1000bytes。
初始到达一个450字节的数据包,0.25秒之后,到达一个900字节的数据包。
0.4秒之后,到达一个1000字节的数据包,0.2秒之后,到达一个400字节的数据包。
police被关联在fa0/0的output方向。
Router(config)# class-map access-match
Router(config-cmap)# match access-group 1
Router(config-cmap)# exit
Router(config)# policy-map police-setting
Router(config-pmap)# class access-match
Router(config-pmap-c)# police 8000 1000 1000 conform-action transmit exceed-action set-prec-transmit 1  violate-action drop
Router(config-pmap-c)# exit
Router(config-pmap)# exit
Router(config)# interface fastethernet 0/0
Router(config-if)# service-policy output police-setting
   在这个例子中,初始的token buckets中装满1000byte的token,如果在初始阶段到达450字节的数据包,那么需要从token bucket中流出450字节的tokens, 此时,token buckets中剩余(1000-450)byte=550字节的token,token bucket中的token数量有富裕,将触发comform-action行为,450字节的数据包将被transmit。0.25秒之后,一个800字节的数据包到达,在0.25秒的时间间隔之内,token buckets中将注入(8000bps/8)*0.25s=250字节的token,此时,token buckets中共剩余(550+250)byte=800字节的token , 由于到达的数据包的大小为900字节,需要从token buckets中流出相应字节的token数,而此时,BC桶中的token只有800字节,数量不够,但是BE桶中有1000字节,路由器会直接向BE桶借900字节的token,此时,BC桶中token数量不够,但是BE桶中token数量足够,将触发exceed-action行为,900字节的数据包将会被set-prec-transmit 1。900字节的数据包被处理完成之后,BC桶中剩余800字节的tokens,BE桶中剩余100字节的tokens。0.4秒之后又到达一个1000字节大小的数据包,在这0.4秒之内,BC桶中将被新注入(8000bps/8*0.4)=400bytes的token,BC桶现在800字节的token,BC桶最多只能容纳1000字节的token,故路由器先将BC桶注满(增加200bytes的tokens,BC桶此时共1000字节的tokens),多余的200字节的tokens将被注入进BE桶(增加200bytes的tokens,BE桶共300字节的tokens)。当把1000字节的数据包传递之后,BC桶中的剩余的tokens数量刚好为0,BE桶中的token数量保持不变(300字节),将会触发conform-action行为,此数据包将被transmit。0.2秒之后又到达一个400字节的数据包,在这0.2秒之内,BC桶中将新注入(8000bps/8*0.2)=200bytes的tokens,此时BC桶中总的tokens数量为200bytes的tokens,BE桶中共有300bytes的tokens,需要传递的数据包为400字节,BC桶、BE桶中的tokens数量都不够,此时,将会触发violate-action行为,此数据包将被drop。
在深入理解了Traffic-Police的工作原理之后,接下来我们讲述一个利用此技术缓解smurf***的实例。
smurf***的工作原理:

                         R1 (H11: 1.1.1.1)          |----H1(192.168.20.1)
                         |                                    |----H2(192.168.20.2)
               --------------------R2-----------|----H3(192.168.20.3)
                   |                                          |----H4(192.168.20.4)
                   |s0/0                                   |----H5(192.168.20.5)
                   R3(H33: 3.3.3.3)
                                         
路由器R1后方有一真实主机H11的IP地址为1.1.1.1,路由器R3后方有一真实主机H33的IP地址为3.3.3.3,R2后方的ethernet网络内有多台主机:H1,H2,H3,H4,H5...假设主机H11是一个***者,它发起一个到子网192.168.20.0的ICMP echo广播报文,报文的源IP地址被伪造成3.3.3.3,目的地址为192.168.20.255(子网广播地址),当R2后方网段内的每台主机收到此广播报文后,都将作出相同的响应:返回单播报文,此报文的目的地址为3.3.3.3(此时,R2后方的ethernet网络被***者利用,成为一个***的放大器)。这样真实主机H33将收到许多ICMP echo-reply的洪泛,最终主机H33的系统资源将被耗尽。
理解了smurf***的工作原理之后,我们可以用traffic-police减缓smurf***。
下面的示例给出了路由器R3上的配置:
Router3(config)# access-list 101 permit icmp any any echo-reply
Router3(config)# class-map DOS
Router3(config-cmap)# match access-group 101
Router3(config-cmap)# exit
Router3(config)# policy-map DENY_DOS
Router3(config-pmap)# class DOS
Router3(config-pmap-c)# police 25600 8000 conform-action transmit exceed-action drop
Router3(config-pmap-c)# exit
Router3(config-pmap)# exit
Router3(config)# interface serial 0/0
Router3(config-if)# service-policy input DENY_DOS