一、概述
在不受限制或没有特别设置的情况下,QQ使用UDP数据包进行通信,协议端口缺省为4000和8000,当被常规的ACL过滤后,QQ会采用基于TCP的80和443端口进行通信,因此不能仅根据网络报文端口准确识别QQ流量,而传统的ACL在功能上也有很大的限制,无法禁止这种采用公知端口的私有协议通信。
或者过滤QQ登录服务器的IP地址,但腾讯公司的服务器很多,并且每增加一台都需要及时获取到它的IP,然后加到ACL里,所以这也不是一个有效的办法。
由此可见,要彻底禁止QQ的话,需要做两件事情:
1. 根据QQ应用协议数据流特征来识别其所属协议类型,即找出其应用协议的特征码。
2. 使用更为灵活的包过滤工具匹配QQ数据包,并执行过滤操作。
Cisco推出的灵活包匹配(FPM)为高级用户提供了部署已知***向量(通过过滤数据包阻止网络***)的基于网络阻塞的方法。FPM作为更全面和定制的包过滤器,是下一代访问控制列表(ACL)模式匹配工具,此技术提供了在包的任意比特、任意深度进行匹配的能力。它消除了以前有限包检查的具体字段的限制。
二、抓取QQ应用协议特征码
1. UDP数据包
打开Wireshark抓包工具,然后运行QQ进行登录,很快Wireshark就抓到协议为UDP和OICQ的数据包。
首先定位到IP协议头,看到头长度为20byte,后面UDP头长度8个byte,其中包括端口号4000和8000,之后就是QQ信息的数据字段了,开始1个byte为0x02,是OICQ包的flag,后面2个byte:0x262f标识QQ的版本号,表示我的QQ版本是2011正式版;接着2个byte的是命令字段,用于QQ登录的命令取值为0xba。所以,我们把offset(偏移量)为28的协议flag:0x02和offset为31的命令值:0xba定义为特征码。
2. TCP数据包
不管是使用HTTP还是SSL协议,QQ消息里都有flag+版本字段:0x02262f,用于登录的消息字段是前面相邻的0x0059,所以把特征码定义为0x005902,offset 40。
三、设置FPM
class-map type access-control udp_pkts
match start l3-start offset 9> 定义所有UDP数据包:IP头中的协议字段值为17
class-map type access-control tcp_pkts
match start l3-start offset 9> 定义所有TCP数据包:IP头中的协议字段值为6
class-map type access-control match-all qq_udp
match start l3-start offset 28>
match start l3-start offset 31> 定义QQ登录UDP数据包的特征码
class-map type access-control match-all qq_tcp
match start l3-start offset 40> 定义QQ登录TCP数据包的特征码
policy-map type access-control drop_qq_udp
class qq_udp
log
drop
设置丢弃QQ登录UDP数据包的策略,当匹配特征码时记录日志并丢弃。
policy-map type access-control drop_qq_tcp
class qq_tcp
log
drop
设置丢弃QQ登录TCP数据包的策略,当匹配特征码时记录日志并丢弃。
policy-map type access-control drop_qq
class udp_pkts
service-policy drop_qq_udp
> service-policy drop_qq_tcp
设置策略,分别对UDP数据包和TCP数据包应用丢弃策略。
interface GigabitEthernet 0/1
service-policy type access-control input drop_qq
将此策略应用到路由器内部接口上。 |