上一篇文章已经介绍了在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、 限制登录
(本人主机是在局域网内,IP:192.168.1.102、QQ是QQ for Linux Beta1)
本人是上午11:50:09登录的,通过这个时刻,找到当时的包,如下图:
可以看到,在登录的时候,QQ最先做的是通过DNS查找tencent.com的IP,DNS返回了数个结果。不言而喻,这个域名当然就是QQ的服务器了,有了服务器才能登录、跟好友通讯。因此,办法一、封掉tencent.com的DNS查询,让它不能找到服务器,当然就工作不了了,编写如下规则:
iptables -I OUTPUT -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP//语法我就不做多介绍了,由于我是封自己主机上的QQ,所以用的是OUTPUT,如果你的主机是一个局域网的防火墙那就得用FORWARD了
细心的朋友发现了,QQ登录时可以在设置里选择通过http代理完成,网页代理功能正常(我这里指的是Linux下的QQ,Windows下的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$ //这部份是最重要的,这里是一个正则表达式,匹配的时候就用的是这一段,x43在ASC码中表示C,后三个分别表示O、N、N,最后两个十六进制数表示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 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 8000、tcp80、443等协议端口进行通讯方法四、为了做得更彻底一下,再加上以下规则:
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