浪人 发表于 2018-7-14 13:40:21

使用Cisco IOS FPM彻底禁用QQ-bit流

一、概述
    在不受限制或没有特别设置的情况下,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
  将此策略应用到路由器内部接口上。
页: [1]
查看完整版本: 使用Cisco IOS FPM彻底禁用QQ-bit流