Ubuntu9.04配iptables L7封QQ詳細過程

 2010.3.15 

      最近做一個項目,linux下基於網絡行爲的防火牆,得知iptables Layer7能夠在應用層實現封QQ、MSN、迅雷等應用,因此打算在自己的機器上配置一下iptables L7,以借鑑如何識別應用,並對這些應用進行有效控制。配了接近五天,昨晚終於把L7配好了(也終於睡了個好覺),今天折騰了一上午也終於把QQ成功封了,其中曲折說來話長,我還是長話短說吧。
      先簡略介紹下我的系統環境:

            雙系統,win7+ubuntu
            Ubuntu linux 9.04(內核2.6.28-11-generic),後將內核升級到2.6.30.5 
       下面,就一步一步來配L7(有點不怎麼簡潔,但絕對是痛苦經歷之後的經驗之談,希望對大家有幫助)。


第一步,做哪些準備?
      剛開始配iptalbes L7相信很多人都有個疑問,什麼樣的環境才能配iptables L7(以下簡稱L7)?而且iptables L7的HOWTO是英文的,讓人看起來就費勁-_-!
L7在部分2.4內核和2.6內核中都能安裝,據本人觀察,不管你的linux操作系統是redhat、centos還是新秀ubuntu,只要內核是合適的都能行,具體哪些內核合適,請點這裏看內核兼容性:
      http://l7-filter.sourceforge.net/kernelcompat
      如果不知道自己的內核版本,可以在shell下輸入命令查看:
            #uname -r

       我的ubuntu內核版本是2.6.28-11-generic,查看了一下兼容性,貌似可以。網上有很多方法配L7的方法,都是通過先升級內核來完成,然後打補丁完成,我本來想我的內核版本已經足夠了,於是嚐了一下不升級內核,直接給現有內核打補丁,後來感覺一帆風順,但是在實際配置iptables的時候卻一直報"找不到相應規則"(本來是一段英文,但是我忘了怎麼寫的,大致意思是這樣)。沒辦法,只有重來,只有採取升級內核的方法來完成。
  

       首先去網上下載兼容性還不錯的2.6.30.5內核,下載內核網址是(後面會細講如何升級內核):
              http://www.kernel.org/ //文件名爲linux-2.6.30.5.tar.gz

      除了內核的之外,還要做準備以下三樣東西:
            1) netfilter-layer7-v2.22.tar.gz,升級netfiler,並用來給內核打支持Layer 7的補丁,網址: http://sourceforge.net/projects/l7-filter/  
            2) iptables-1.4.7.tar.bz2,升級iptables,可以支持更新的系統內核,網址:http://www.netfilter.org/projects/iptables/downloads.html
            3) L7-protocolse-2009-05-28.tar.gz,最新Layer7協議,其中包含了L7所需的匹配模式,網址:http://sourceforge.net/projects/l7-filter/files/ 
       把以上下載的東西全部放在/usr/src/目錄下其實哪沒關係,不過我看網上基本都這樣做,遵照行事就行了,這樣也便於下面的敘述:)

     東西準備好了,開始工作!


第二步,打補丁、升級內核
      首先,把 linux-2.6.30.5.tar.gz和netfilter-layer7-v2.22.tar.gz解壓,命令爲
           #tar -zvxf linux-2.6.30.5.tar.gz
           #tar -zvxf netfilter-layer7-v2.22.tar.gz

      其次,給新內核補丁
           #cd linux-2.6.30.5
           #patch -p1 < ../ netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch

      第三,補丁打上了,不過在編譯安裝新內核之前還要做一些配置
           #cd /usr/src/linux-2.6.30.5
            #make menuconfig
      這會進入內核配置界面,最重要的是要將如下兩個選項先上
           Networking support --->
                  Networking options --->
                        Network packet filtering framework (Netfilter) --->
                               Core Netfilter Configuration --->
                                           "layer7" match support 和 Layer 7 debugging output
      (注:如果以上選項一時看不到,那可能是它前面依賴的一些選項沒選到,慢慢摸索下,本人在2.4內2.6的多個版本內核裏都配過,路徑和選項都有些差異,因此如果這個路徑跟你看到的有點不一樣,不要慌,慢慢找找,只要L7補丁打好了,就能找到,其他的一些配置怎麼選可以去網上搜一下,在此不在詳述)      

 

       最後,內核已經配置好,就可以編譯安裝新內核了:
             #cd /usr/src/linux-2.6.30.5
             #make //由於是完全編譯,所以時間可能有點長,根據機器的情況長短不一,我很不幸花了一個多小時 -_-!,乾點別的事先,如果你一直盯着它看,等着睡着吧
 
            #make modules_install
             #make install //以前複製內核和System.map,及修改Grub.conf的步驟,都由make install自動實現

 

      新內核編譯安裝完畢!重啓(按理說是應該這麼做了,不過建議你先不要慌着輸命令重啓,看一下下面的文章再說:)
            #reboot
      重啓之後不要默認啓動,要注意在倒數4、3、2......的時候按Esc,選擇以新的內核,也就是我們現在安裝的2.6.30.5內核啓動。很有可能你會發現找了好久的菜單,都只有以前的內核版本可以選,無奈只好選老版本的啓動了,進入系統後,uname -r了一下,也發現系統內核版本沒更新,不要慌,且繼續看下文如何解決:
      分析一下原因:上面的編譯過程沒有生成initrd鏡像文件,同時cat /boot/grub/menu.lst看了一下,得知make install命令沒有自動把新編譯的內核的配置寫到grub的配置文件裏去,這也難怪,啓動選項裏面沒有新內核的選項 了。因此我們來做如下工作,讓啓項裏有我們想要的選項:
             首先,手工生成initrd鏡像文件:
                ubuntu下生成initrd鏡像文件的命令是:mkinittramfs,系統中如果還沒有這個工具,可以在ubuntu新立得軟件包管理器中搜索initramfs-tools安裝,當然也可以在終端中輸入以下命令安裝:
                      #apt-get install kernel-package
                只用了這個命令就安裝上了,網上還有人在這個命令之後用了下面這個命令,如果用了此條命令沒安裝上工具的話,可以試着加用一下下面這個命令
                      #
apt-get install initramfs-tools

                完成之後用命令: "mkinitramfs -o initrd.img-2.6.30.5 2.6.30.5" ,將會在當前目錄下生成一個名字爲 initrd.img-2.6.30.5的initrd 鏡像文件。注意:最後那個參數"2.6.30.5" 是版本號,必須與/lib/modules/目錄下相應的文件夾同名。
             其次,手動修改menu.lst,gedit /boot/grub/menu.lst增加的內容如下:
                    title Ubuntu 9.04, kernel 2.6.30.5
                    root ()/ubuntu/disks
                    kernel /boot/vmlinuz-2.6.30.5 root=UUID=0E0A73C30A73A67D loop=/ubuntu/disks/root.disk ro quiet splash
                    initrd /boot/initrd.img-2.6.30.5
                    這裏有兩個地方需要注意1、注意其中的 kernel 和initrd 都指向剛剛自己生成的鏡像文件;2、 root的 UUID每個人都不一樣,看看自己menu.lst中原來的UUID是多少,複製過來行了。

             這些步驟做好了,就可以安心的重啓了。等到系統提示按 ESC 鍵的時候,可以選擇和進入GRUB的菜單。可以看到自己的內核版本已經顯示出來了。選擇進入之後,一切正常。使用uname -r 命令查看,可以看到當前內核已經新的內核版本了。 

第三步,升級iptables
      #cd /usr/src
      #tar -jxvf iptables-1.4.7.tar.bz2
      #cd iptables-1.4.7
      #cd /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward
      #cp libxt_layer7.* /usr/src/iptables-1.4.7/extensions/

      #cd /usr/src/iptables-1.4.7
      #./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.30.5
      #make && make install
      現在可以用iptables -V命令查看一下iptables版本,可以看到已經被更新了

 

      安裝l7-protocols模式包,L7全靠這些協議模式包來完成匹配工作,所以是必不可少的:
      #cd /usr/src
      #tar -zvxf l7-protocols-2009-05-28.tar.gz
      #cd l7-protocols-2009-05-28
      #make install 

最後,測試
   爲了讓所有的模塊都能工作,在測試前,建議重啓一下)
      在
端輸入下面這條命令:
            iptables -I OUTPUT -m layer7 --l7proto qq -j DROP        //用L7自帶規則來封QQ協議
 
     如果沒報任何信息基本已經沒問題了,然後再通過iptables -L -n -v 看看現在防火牆的配置情況,如果已經有剛纔的配置,那麼,基本可以說L7也安裝成功了!


      關於如何徹底封QQ,很多網上的資料只給了腳本出來,個人認爲這樣只知其然,不知其所以然,不利於學習,因此下一篇將詳細給出思路和編寫過程,也有助於更好理解L7。
     此文參考了多位網友的文章,在此列出,真誠致謝:
     http://blog.csdn.net/zccst/archive/2009/09/02/4512259.aspx
     http://ms.ntcb.edu.tw/~steven/l-penguin.s/article/kernel-layer7-filter.htm
     http://blog.sina.com.cn/s/blog_5335d4340100doll.html
     http://www.chinaunix.net/jh/38/914350.html

 

 

 

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