Ubuntu下從零開始用Iptables L7徹底封QQ

       上一篇文章已經介紹了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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章