TCP/IP协议在设计之初,没有过多的考虑安全这一方面,因此许多协议存在着被***利用的弱点。随着互联网络急剧的膨胀,这些弱点将对我们的企业网络构成日益严峻的威胁。一个很好的例子就是TCP协议,这个协议要求在传输数据之前使用一个“三次握手”过程来建立一个连接。如下图所示.
source端最初发送一个syn=x的报文,请求建立一个TCP连接。
destination端以一个在报文头中设置了ack,syn标记的报文作为响应。
ack标记是对source端请求的响应,syn标记指示自身的连接建立请求。
source端通过向destination端发送一个带ack标记的报文确认目的端的连接建立请求。
当完成上述“三次握手”之后,source端可以开始正式发送数据给destination端。
TCP协议中的弱点之一是目的端期望源端发送一个最后的ack给目的端,完成连接的建立。***可以利用这个弱点,通过伪造一个虚假的sourceIP地址向一个目标服务器发送大量的tcp syn请求报文,由于source是虚假的,将会导致destination无法收到source返回的ack,这种连接类型被称为半开连接(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的命令结构如下(在MQC配置模式):
police conform-action exceed-action [violate-action ]
:CIR。(定义了向token buckets中注入token的平均数率)
:BC。(定义了BC token buckets的大小)
:BE。(定义了BE token buckets的大小)
:定义行为,可选的一部分行为如下:
?drop—Drops the packet.
?set-prec-transmit —Sets the IP precedence and sends the packet.
?set-dscp-transmit —Sets the DSCP value and transmits the packet.
?transmit—Sends the packet.
当实施流量策略的时候,在CISCO路由器内部将会有一套非常复杂的用来对流量传输的实际速率进行评估的机制,这是利用被称为令牌桶(toke-bucket)的机制来实现,CISCO设备支持多种类型的令牌桶,如单桶和双桶。
单桶的特征如下:
桶的大小就是BC,并且在初始的时刻桶内就装满了BC byte的令牌。
在令牌桶的上方,CISCO路由器将以恒定于CIR的速率往桶内注入令牌。
在令牌桶的下方,CISCO路由器将会根据底层实际需要传递的数据包的数量来决定需要从令牌桶中流出多少byte的令牌。
因此,不难发现,可能会出现下列几种情况:
1) BC桶内当前令牌数量>=路由器底层实际需要传输的数据包的数量
这种情况,将会触发conform-action行为,通常是transmit。表明桶内令牌数量足够。
2) BC桶内当前令牌数量<路由器底层实际需要传输的数据包的数量
这种情况,将会触发exceed-action行为,通常是drop。表明桶内令牌数量不够。
双桶特征如下:
第一个桶的大小就是BC,并且在初始的时刻桶内就装满了BC byte的令牌。
第二个桶的大小就是BE,并且也是在初始的时刻桶内就装满了BE byte的令牌。
这两个桶之间的关联是:如果新注入的令牌将BC桶装满,那么富裕的令牌将从BC桶注入进BE桶。
在Bc桶的上方,CISCO路由器将以恒定于CIR的速率往bc桶内注入令牌。
在每个桶的下方,CISCO路由器将会根据底层实际需要传递的数据包的数量来决定需要从令牌桶中流出多少byte的令牌。
因此,不难发现,可能会出现下列几种情况:
1) BC桶内当前令牌数量>=路由器底层实际需要传输的数据包的数量
这种情况,将会触发conform-action行为,表明BC桶内令牌数量足够。
2) BC桶内当前令牌数量<路由器底层实际需要传输的数据包的数量
这种情况,将会触发exceed-action行为,表明BC桶内令牌数量不够,但是BE桶内令牌数量足够。
3) BE桶内娄前令牌数量<路由器底层实际需要传输的数据包的数量,将会触发violate-action行为,表明BC和BE每个桶都不够。
接下来,我们将用两个具体的实例来说明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秒之后,一个800字节的数据包到达,在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***的工作原理:
Internet中有两台真实PC,一台H11的IP地址为1.1.1.1,另一台H33的IP地址为3.3.3.3,R1后方的ethernet网络内有一个以太网段192.168.20.0/24,假设主机H11是一个***者,它发起一个到子网192.168.20.0的ICMP echo广播报文,报文的源IP地址被伪造成他想要***的PC H33的IP地址3.3.3.3,目的地址为192.168.20.255(子网广播地址),当R1后方网段内的每台主机收到此广播报文后,都将作出相同的响应:返回单播报文,此报文的目的地址为3.3.3.3(此时,R1后方的ethernet网络被***者利用,成为一个***的放大器)。这样真实主机H33将收到192.168.20.0/24网段内所有主机的ICMP echo-reply的洪泛,最终主机H33的系统资源将被耗尽。
理解了smurf***的工作原理之后,我们可以用traffic-police减缓smurf***。
下面的示例给出了路由器R1上的配置:
Router1(config)# access-list 101 permit icmp any any echo
Router1(config)# class-map DOS
Router1(config-cmap)# match access-group 101
Router1(config-cmap)# exit
Router1(config)# policy-map DENY_DOS
Router1(config-pmap)# class DOS
Router1(config-pmap-c)# police 25600 8000 conform-action transmit exceed-action drop
Router1(config-pmap-c)# exit
Router1(config-pmap)# exit
Router1(config)# interface serial 0/0
Router1(config-if)# service-policy input DENY_DOS
**该技术资料为crosco(科睿思科)王老师最新原创,谢绝转载!**