2011年1月5日 星期三

L7 - Filter 封包過濾

前言
近年來很多攻擊不斷更新, 大部份都發生在應用層, linux iptables 只能過濾在OSI MODEL的第2,3, 對應用層攻擊則束手無策, 同時企業中又對應用層過濾需求特別要求,P2P, IM, 頻寬控制, 關鍵字串匹配.., 為了解決上述問題需要使用Layer7 filter. 它是linux netfilterplugin module ,可以彌補iptables 不足.
確定PATH環境變數
# echo $PATH
PATH路徑如只有/usr/bin:/usr/sbin , 請加入以下路徑
PATH路徑的設定:
# bash
# vi /etc/profile
內容如下 PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin: /usr/local/php5/bin
export PATH
LD_LIBRARY_PATH=/lib:/usr/local/lib:/usr/lib
export LD_LIBRARY_PATH

確認所需套件
Linux Kernel source 網址: http://www.kernel.org/
iptables source      網址: http://www.netfilter.org/
l7-filter patch            網址: http://sourceforge.net/projects/l7-filter/
l7-filter protocols     網址: http://sourceforge.net/projects/l7-filter/files/

解壓縮/安裝
[root@fw kernels]# cd /usr/src/kernels
[root@fw kernels]# tar jxvf iptables-1.4.7.tar.bz2
[root@fw kernels]# tar zxvf l7-protocols-2009-05-28.tar.gz
[root@fw kernels]# tar zxvf netfilter-layer7-v2.22.tar.gz
[root@fw kernels]# tar jxvf linux-2.6.33.2.tar.bz2

使kernel support 應用層過濾的patch ,執行如下patch
[root@fw kernels]# cd linux-2.6.33.2
[root@fw linux-2.6.33.2]# patch -p1< ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch

修改kernel選項
[root@fw linux-2.6.33.2]# cp -avp /boot/config-2.6.18-8.el5 .config
[root@fw linux-2.6.33.2]# make menuconfig






往下可以選擇layer7 match support


返回”code Netfilter Configuration” , 選擇


或者將所有都標為<M>也可
所有選好,EXIT離開即可


編譯kernel
[root@fw linux-2.6.33.2]# make
[root@fw linux-2.6.33.2]# make modules_install
[root@fw linux-2.6.33.2]# make install

移除原iptables套件
[root@fw linux-2.6.33.2]# rpm -e iptables  -- nodeps
[root@fw linux-2.6.33.2]# cd ..
[root@fw kernels]# cd netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/
[root@fw iptables-1.4.3]# cp libxt_layer7.c libxt_layer7.man ../../iptables-1.4.7/extensions/
[root@fw iptables-1.4.3]# cd ../../iptables-1.4.7
[root@fw iptables-1.4.7]# ./configure --prefix=/ --with-ksource=/usr/src/kernels/linux-2.6.33.2
[root@fw iptables-1.4.7]# make
[root@fw iptables-1.4.7]# make install
[root@fw kernels]# mkdir /etc/l7-protocols
[root@fw kernels]# cp -rv l7-protocols-2009-05-28/* /etc/l7-protocols/
[root@fw kernels]#sync;sync;sync;reboot

重開機後,確認KERNELiptables 版本
[root@fw ~]# uname -a;iptables -V
Linux fw.catchlink.com 2.6.33.2 #1 SMP Fri Apr 9 23:55:43 CST 2010 i686 i686 i386 GNU/Linux
iptables v1.4.7

查看L7-Filter module
[root@fw yum.repos.d]# modinfo xt_layer7

L7-Filter範例測試 
用法: iptables […] –m layer7 –-l7dir /path-to/patterns –-l7proto […]

1.      對應用層字串匹配 :”pchome”  “ tw.yahoo.com“..
[root@fw l7-protocols]# iptables -A FORWARD -m string --algo kmp --string "pchome" –j DROP
[root@fw l7-protocols]# iptables -A FORWARD -m string --algo kmp --string "tw.yahoo.com" -j DROP
[root@fw l7-protocols]# iptables  -L –nv  ß查看iptables 情形

2.      時間段控制 如對來源192.168.1.0網段指定特定時間
[root@fw l7-protocols]# iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 11:00 --timestop 11:25 -j ACCEPT

3.      對特定port connection 控制 Port 80 連線數
[root@fw l7-protocols]# iptables -I FORWARD -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP

4.      協定控制 如阻檔P2P bittorrent, msn,icq..等通訊協定
[root@fw l7-protocols]#iptables -t mangle -A POSTROUTING -m layer7 --l7proto exe -j DROP  ß阻檔對包含exe檔案
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j DROP
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j DROP
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto http -j DROP
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto msnmessenger -j DROP
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto yahoo -j DROP
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto skypeout -j DROP
[root@fw l7-protocols]#iptables -t mangle -A PREROUTING -m layer7 --l7proto skypetoskype -j DROP

[root@fw l7-protocols]#iptables -A FORWARD -m time --timestart 9:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -m layer7 -
l7proto msnmessenger -j DROP

 
:L7-filter對協定有那些過濾, 特徵可在
/etc/l7-protocols/protocols目錄上查看, .pat都是. msn 相關則有msn-filetransfer.pat(傳檔)  msnmessenger.pat(agent程式)
/etc/l7-protocols/file_types目錄 則是一些檔案類型特徵.
/etc/l7-protocols/extra目錄 則是定義對基礎協定擴展的特徵.
發現P2P eMule好像很難檔, 沒效, 因用模擬協定,IPS上測也是一樣無效

情境1
我們將會建一支script去限制BitTorrent 2Mbps速率, FTP傳輸只能512Kbps,全部使用者則有1Mbps使用.現在就來實作看看
[root@fw /]# iptables -t mangle -A POSTROUTING -m layer7
-- l7proto bittorrent -j MARK --set-mark 5  ßBitTorrent 限速
[root@fw /]# iptables -t mangle -A POSTROUTING -m layer7
--l7proto ftp –d 192.168.1.100 -j MARK --set-mark 6  ß192.168.1.100 FTP 限速
[root@fw /]# iptables -t mangle -A POSTROUTING -m layer7
--l7proto ftp –d 192.168.1.112 -j MARK --set-mark 7  ß192.168.1.112 FTP 限速
[root@fw /]# iptables -t mangle –L POSTROUTING –nv

我們在這情境使用CBQ, 所以我們需先建立cbq classes, 這裡使用script
[root@fw /]# vi limits.sh
#!/bin/bash
#delete root class. When running this
#script we need to delete limits first
tc qdisc del dev eth1 root
#create the root class
tc qdisc add dev eth1 root handle 10: cbq bandwidth 100Mbit avpkt 1000
tc class add dev eth1 parent 10:0 classid 10:1 cbq bandwidth 100Mbit rate \
100Mbit allot 1514 weight 10Mbit prio 8 maxburst 20 avpkt 1000
#create a 2 mbps class for bittorrent
tc class add dev eth1 parent 10:1 classid 10:100 cbq bandwidth 100Mbit rate \
2Mbit allot 1514 weight 256Kbit prio 5 maxburst 20 avpkt 1000 bounded
tc qdisc add dev eth1 parent 10:100 sfq quantum 1514b perturb 15
tc filter add dev eth1 parent 10:0 protocol ip prio 25 handle 5 fw \
flowid 10:100
#create a 512 kbps class for ftp for the client 192.168.1.100
tc class add dev eth1 parent 10:1 classid 10:200 cbq bandwidth 100Mbit rate \
512Kbit allot 1514 weight 64Kbit prio 5 maxburst 20 avpkt 1000 bounded
tc qdisc add dev eth1 parent 10:200 sfq quantum 1514b perturb 15
tc filter add dev eth1 parent 10:0 protocol ip prio 25 handle 6 fw \
flowid 10:200
#create a 1 mbps class for ftp for the client 192.168.1.112
tc class add dev eth1 parent 10:1 classid 10:300 cbq bandwidth 100Mbit rate \
1Mbit allot 1514 weight 128Kbit prio 5 maxburst 20 avpkt 1000 bounded
tc qdisc add dev eth1 parent 10:300 sfq quantum 1514b perturb 15
tc filter add dev eth1 parent 10:0 protocol ip prio 25 handle 7 fw \
flowid 10:300

[root@fw /]# chmod +x limits.sh
[root@fw /]# iptables -t mangle -Z POSTROUTING;./limits.sh
RTNETLINK answers: No such file or directory ß如果出現此訊息, 不要理它再重新執行一次


GUI 配置iptables  (選項) 可有可無 

重新編譯.src檔案
[root@fw darwin]# rpmbuild --rebuild  libfwbuilder-3.0.7-b1477.fc11.src.rpm
[root@fw darwin]# rpmbuild --rebuild  fwbuilder-3.0.7-b1477.fc11.src.rpm

安裝編譯好的rpm
[root@fw i686]# cd /root/rpmbuild/RPMS/i686
[root@fw i686]# rpm -ivh libfwbuilder-3.0.7-b1477.fc12.i686.rpm
[root@fw i686]# rpm -ivh libfwbuilder-devel-3.0.7-b1477.fc12.i686.rpm
[root@fw i686]# rpm -ivh libfwbuilder-debuginfo-3.0.7-b1477.fc12.i686.rpm
[root@fw i686]# rpm -ivh fwbuilder-3.0.7-b1477.fc12.i686.rpm
[root@fw i686]# rpm -ivh fwbuilder-debuginfo-3.0.7-b1477.fc12.i686.rpm

使用Firewall Builder 配置iptables

1.      啟動Firewall Builder




在這一點上,我們已經完全配置防火牆object有兩個接口(eth0loopback),eth0已經應該獲得DHCP動態IP地址。 object還帶有基本的防火牆政策,阻止所有access該主機除了ssh和允許所有類型的連接開始從機器。
我們需要配置參數才能active policy 點擊“Firewall Settings ... 按鈕,打開防火牆設置對話框。


選擇“安裝程序”在彈出的對話框中,輸入目錄應安裝防火牆script,該帳戶的名稱用於管理防火牆和IP地址127.0.0.1在外地的地址用於與防火牆。 防火牆生成器所在的目錄將要安裝防火牆腳本已經存在,你可能需要手動建立它。 我們使用root帳戶安裝和active的政策。 確保root允許通過SSH登錄您的sshd的配置。 我們使用回送地址,因為該計劃將管理政策,它是在同一台機器上運行。 一旦完成,點擊“確定”保存參數。

現在我們可以編譯和安裝政策。 點擊鼠標按鈕在防火牆objectguardian”,使用menu項“install

先將該方案資料存到一個檔案,然後才能進行。


一旦資料被保存,程序運行政策編譯器,並顯示其進展進度。 一旦編譯完成後,點擊“下一步”

該方案可以使用密碼或ssh密鑰對進行身份驗證時,登錄到防火牆安裝和激活新的政策。 如果您使用的密碼,在此對話框中輸入它。 不過,建議使用ssh密鑰對驗證,而不是root密碼。 如果你的鑰匙配置,程序會使用它們。 由於我們將使用鑰匙,離開“密碼”輸入欄位空在此對話框。


該方案試圖登錄到本地主機使用ssh作為root SSHSSH客戶端帶來了這個對話框了,並要求您輸入私鑰密碼。 請注意,這個對話框是不屬於防火牆生成器,它是SSH的客戶端部分。


一旦認證完成,該程序生成的script複製到防火牆並active它。 在安裝程序的進展可以看到在右邊面板的對話框。 在這一點上我們的政策是新的防火牆安裝和active

有興趣可自研究,如果編譯成功,install失敗,可手動執行script,
在自家目錄下會自行產生一支guardian.fw,只要執行它即可套用至iptables
FirewallBuilder, 要先存檔再編譯.配置的policy 才會套用在iptables上執行.

很多說明文件,可在下面找到(很實用)
 

沒有留言:

張貼留言