Ubuntu下从零开始用Iptables L7彻底封QQ

来源:互联网 发布:新型网络传销模式 编辑:程序博客网 时间:2024/05/11 10:29

       上一篇文章已经介绍了在Ubuntu9.04下如何通过升级内核到2.6.30.5配置iptables L7,现在就开始来用L7从零开始,在Ubuntu下彻底封QQ

 

整体思路:

我们的目的是控制QQ通信,而要控制一种服务就得了解它的工作流程和方式。众所周知,所有的网络通信都是通过数据包在网络之间传输实现,因此,想了解一个服务的整个工作流程和方式,就需要通过数据包来发掘。所以我们首先要做的是通过抓包来了解QQ从启动到登录、通讯的全过程,然后根据所掌握的情况做出合理的策略,以达到彻底封住QQ的目的。

 

因此,第一步,准备好抓包工具

除了前面配置的L7,另一个最重要的工具自然就是WireShark(也就是以前的Ethereal)了。简单介绍一下WireShark,它是一个网络封包分析软件,可以用来抓包,并尽可能显示出最为详细的网络封包资料,最重要的是它是开源的,以前很多抓包软件都是收费的,相当贵,现在WireShark已经是全世界范围内应用最广的抓包软件了。去百度下载一个,本人下载的是1.3.3版。

 

第二步,抓包、分析、解决

         首先,把WireShark打开,并使其处于监听状态。(初学者如果不会的话,看这里,首先需要对WireShark配置一下,点击工具栏上的Capture ----->Interface选择你要监听的网卡接口,然后选择Capture----->Start,开始监听)

         其次,打开QQ,点击登录,然后找好友聊天、传文件,尽可能多的让QQ发生网络行为,(抓到的数据包越多,对我们分析就越有利:)这个时候,WireShark会将QQ所有的通信包抓住并记录下来。(记下QQ登录时刻,精确到秒,聊天记录也很重要,不要删了,这样我们可以通过时间对比,在大量被抓包中找到当时QQ通讯的相应包)

最后,现在我们已经得到我们想要的东西了,现在就来分析QQ的整个通信,并想办法限制:

1、 限制登录

(本人主机是在局域网内,IP192.168.1.102QQQQ  for Linux Beta1

本人是上午115009登录的,通过这个时刻,找到当时的包,如下图:

QQ DNS查询 

可以看到,在登录的时候,QQ最先做的是通过DNS查找tencent.comIPDNS返回了数个结果。不言而喻,这个域名当然就是QQ的服务器了,有了服务器才能登录、跟好友通讯。因此,办法一、封掉tencent.comDNS查询,让它不能找到服务器,当然就工作不了了,编写如下规则

iptables -I OUTPUT -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP//语法我就不做多介绍了,由于我是封自己主机上的QQ,所以用的是OUTPUT,如果你的主机是一个局域网的防火墙那就得用FORWARD

 

细心的朋友发现了,QQ登录时可以在设置里选择通过http代理完成,网页代理功能正常(我这里指的是Linux下的QQWindows下的QQ还可以选择Socks代理),因此封DNS还远远不够。办法二、封QQ代理,做如下处理,新增一个过滤CONNECT模式的L7协议(这里我也就只封http代理了):

cd /etc/l7-protocols/protocols   //L7 的匹配模式都以.pat的文件形式放在这里,L7自带了一些匹配模式,但这对于应用日益纷繁的网络来说还是远远不够的,因此,L7允许用户自己添加新的匹配模式,也就是编写一些.pat文件来自定义一些L7没有的模式,而从下面你就可以知道是怎么编写和添加的,进而可以了解L7工作的流程

新建一文件httpagent.pat,内容如下:

# The HttpAgent Connect Action   //注释,没有多大关系,不影响整体功能

httpagent           //模式的名称,在配置iptables写规则的时候需要用到

^/x43/x4F/x4E/x4E.+/x0D/x0A$   //这部份是最重要的,这里是一个正则表达式,匹配的时候就用的是这一段,x43ASC码中表示C,后三个分别表示ONN,最后两个十六进制数表示CRLF,即换行符和回车键

最后,将规则写入防火墙:

iptables -I OUTPUT -p tcp -m layer7 --l7proto httpagent -j DROP

 

如果还想封SOCKS代理的话,可以用加入这条(当然QQ  for Linux是不能用SOCKS代理的):

iptables -I OUTPUT -p tcp -m layer7 --l7proto socks -j DROP

 

好了,这下QQ无论如何也是登录不了了。有图有真像,见下图^^

图一:普通登录方式,QQ DNS查询被封,无法登录(框里标明了防火墙现有应用规则)

QQ DNS查询被封,无法登录

图二、采用代理服务登录,但QQ http代理被封,无法登录

QQ http代理被封,无法登录

 

2、 限制聊天

最开始看到网上有人用如下规则来封QQ

iptables -I OUTPUT -m layer7 --l7proto qq -j DROP

发现应用之后我还是可以和我朋友聊天自如,还被他们嘲笑了一番,说我的L7过滤已成功,他们一条也没有看到我发的消息——!

 

再次看我们刚刚抓到的包,发现什么了没有,如下图:

 

哈哈,原来QQ用的不是qq协议,而是OICQ协议(话说,这听起来很像“偶爱重庆”^^)。那么接下来要做的就是封OICQ协议了,仔细观察OICQ协议包,发现,每一个协议包开头都是02,结尾都是03,如下图:

 

 

因此方法三、再来编写一个oicq.pat文件,通过封锁OICQ协议来封锁QQ聊天,文件内容如下:

#Tecent OICQ Protocol Chinese instant messenger protocol - http://www.qq.com
       # Protocol groups: chat
       #Copyright (C)2010 LI TingLi,SoftWare College of SCU,Chengdu,China
       #
       #This protocol is used by QQ for linux,version 1.02(Beta 1)
       #

         oicq
        ^/x02.+/x03$

 

然后,编写规则如下:

iptables -I OUTPUT -m layer7 --l7proto oicq -j DROP

这样QQ就没法聊天了。

 

3、 补充

另外,我们知道QQ可以通过udp 8000tcp80443等协议端口进行通讯方法四、为了做得更彻底一下,再加上以下规则:

iptables -I OUTPUT -p tcp -m multiport --dport 80,443 -m layer7 --l7proto qq -j DROP

iptables -I OUTPUT -p udp --dport 8000 -j DROP

 

上面的几条规则已经足够封锁QQ了,当然,还有qq文件传输等等,思路都一样,就不再一一例举了,总之一句话,要想控制一项任务就得知道它是怎么工作,知已知彼才能百战不殆嘛。

 

当然,这里所说的的是不完全的,如果本人这里有什么纰漏,或者大家有更好的方法,欢迎讨论^ ^

 

最后总结一上所应用到的所有脚本,如下:

iptables -I OUTPUT -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP

iptables -I OUTPUT -p tcp -m layer7 --l7proto httpagent -j DROP

iptables -I OUTPUT -p tcp -m layer7 --l7proto socks -j DROP

iptables -I OUTPUT -m layer7 --l7proto qq -j DROP

iptables -I OUTPUT -m layer7 --l7proto oicq -j DROP   

iptables -I OUTPUT -p tcp -m multiport --dport 80,443 -m layer7 --l7proto qq -j DROP

iptables -I OUTPUT -p udp --dport 8000 -j DROP

 

参考文章,真诚致谢:

http://www.chinaunix.net/jh/4/853647.html

http://bbs.chinaunix.net/viewthread.php?tid=505370

http://bbs.chinaunix.net/viewthread.php?tid=484867 

http://linux.chinaunix.net/bbs/viewthread.php?tid=885123

http://www.chinaunix.net/jh/38/914350.html

原创粉丝点击