Netfilter/Iptables Layer7 應用層過濾策略node
Netfilter/Iptables 做爲一個典型的包過濾防火牆體系,對於網絡層,傳輸層的數據包過濾具備很是優秀的性能和效率,然而,對於一些面向局域網上網用戶的Linux網關服務器,有時候還須要使用QQ,MSN等聊天,使用BT下載工具等現象進行封鎖。下面將介紹如何爲Netfilter/Iptables 增長應用層過濾。linux
QQ,MSN等聊天,使用BT下載工具均使用了相對固定的應用層協議。使用L7-filter項目的補丁文件包能夠爲linux內核增長相應的應用層過濾功能,結合其提供的l7-protocols第7層協議定義包,可以識別不一樣應用層的數據特徵ios
L7-filter項目站點:http://l7-filter.sourceforge.net/ 下載最新的補丁包及協議包算法
內核站點:http://www.kernel.org 下載內核,iptables的源碼包vim
注意:L7-filter補丁包內的數據,要與內核及iptables源碼版本相匹配bash
將netfilter-layer7 源碼包中的對應補丁文件添加到內核源碼中,對內核進行從新編譯,安裝,安裝後使用新內核啓動Linux操做系統。服務器
注意:源碼目錄所在分區至少保持有2.5G的剩餘磁盤空間。網絡
wget http://jaist.dl.sourceforge.net/project/l7-filter/l7-filter%20kernel%20version/2.22/netfilter-layer7-v2.22.tar.gz wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.8.tar.xz wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.2.tar.bz2 wget http://jaist.dl.sourceforge.net/project/l7-filter/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz
幫助文件:http://l7-filter.sf.net/HOWTO-kernel 併發
netfilter-layer7:netfilter-layer7-v2.22.tar.gztcp
Linux內核源碼包:linux-2.6.28.8.tar.xz
l7-protocols協議包:l7-protocols-2009-05-28.tar.gz
iptables源碼包:iptables-1.4.2.tar.bz2
內核編譯步驟:
解包
配置make menuconfig
編譯
安裝
1.解壓釋放netfilter-layer7 和內核源碼包,使用patch工具合併補丁文件
yum -y install xz xz -d linux-2.6.28.8.tar.xz tar xf linux-2.6.28.8.tar -C /usr/src/ tar xf netfilter-layer7-v2.22.tar.gz -C /usr/src/ cd /usr/src/linux-2.6.28.8/ patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch ------------------------------------------------------------------------------ patching file net/netfilter/Kconfig Hunk #1 succeeded at 757 with fuzz 1 (offset -38 lines). patching file net/netfilter/Makefile Hunk #1 succeeded at 78 with fuzz 2 (offset -6 lines). patching file net/netfilter/xt_layer7.c patching file net/netfilter/regexp/regexp.c patching file net/netfilter/regexp/regexp.h patching file net/netfilter/regexp/regmagic.h patching file net/netfilter/regexp/regsub.c patching file net/netfilter/nf_conntrack_core.c Hunk #1 succeeded at 206 (offset 5 lines). patching file net/netfilter/nf_conntrack_standalone.c Hunk #1 succeeded at 162 (offset -3 lines). patching file include/net/netfilter/nf_conntrack.h patching file include/linux/netfilter/xt_layer7.h
2.從新配置內核編譯參數,添加state機制及layer7支持
使用當前RHEL5系統的內核配置文件做爲參考,在此基礎上添加新的功能
cp /boot/config-2.6.18-194.el5 .config make menuconfig
在配置界面中,方向鍵用於定位須要配置的項目
select進入子配置菜單
exit返回上一層
help查看幫助信息
空格切換所選項目的編譯類型
三種狀態:
[]表示不須要該功能
[M]將功能編譯成模塊
[*]將功能直接編入內核
Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration --->
<M> Netfilter connection tracking support
<M> "layer7" match support
<M> "string" match support
<M> "time" match support
<M> "iprange" address range match support
<M> "connlimit" match support"
<M> "state" match support
<M> "conntrack" connection match support
<M> "mac" address match support
<M> "multiport" Multiple port match support
Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration --->
<M> IPv4 connection tracking support (required for NAT)
<M> Full NAT
<M> MASQUERADE target support
<M> NETMAP target support
<M> REDIRECT target support
使用Exit返回 最後當提示保存時,使用Yes確認保存,修改將保存到源碼目錄中的.config文件中。
/usr/src/linux-2.6.28.8/.config
3.編譯新內核,並安裝新內核文件
make && make modules_install && make install
新內核編譯安裝過程將花費較長時間,數十分鐘到數小時不等
新內核文件被安裝到/boot目錄,模塊文件將複製到/lib/modules/2.6.28
[root@www iptables-1.4.2]# ls -l /boot/*2.6.28* -rw------- 1 root root 2604581 12-08 10:16 /boot/initrd-2.6.28.8.img -rw-r--r-- 1 root root 1129804 12-08 10:15 /boot/System.map-2.6.28.8 -rw-r--r-- 1 root root 2102800 12-08 10:15 /boot/vmlinuz-2.6.28.8 [root@www iptables-1.4.2]# du -sh /lib/modules/2.6.28.8/ 318M/lib/modules/2.6.28.8/
若是編譯內核,途中斷過,想從新編譯,那麼先使用
make mrproper 刪除沒必要要的文件和目錄,初次編譯內核不須要
make clean 刪除沒必要要的模塊和文件
4.調整GRUB引導菜單,使系統以新內核啓動,而後重啓linux服務器
vi /boot/grub/grub.conf default=0 timeout=5 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (2.6.28.8) root (hd0,0) kernel /vmlinuz-2.6.28.8 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.28.8.img title Red Hat Enterprise Linux Server (2.6.18-194.el5) root (hd0,0) kernel /vmlinuz-2.6.18-194.el5 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.18-194.el5.img reboot
從新編譯安裝iptables及安裝l7-protocols協議包
除了要對linux內核應用layer7補丁之外,對iptables一樣須要應用layer7補丁,才能完整實現應用層過濾功能,在解包後的/usr/src/netfilter-layer7-v2.22/目錄中也包括針對iptables源碼包的補丁文件。l7-protocols協議包用於爲iptables提供判斷別應用層數據的特徵依據。
1.卸載原有系統中的iptables
cp /etc/rc.d/init.d/iptables /tmp/ 備份iptables啓動腳本 cp /etc/sysconfig/iptables.config /tmp 備份iptables配置文件 rpm -e iptables-ipv6 iptables iptstate --nodeps
2.解壓釋放iptables,並應用補丁文件(複製extensions子目錄便可)
tar xf iptables-1.4.2.tar.bz2 -C /usr/src/ cd /usr/src/iptables-1.4.2/ cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* extensions/
3.配置,編譯並安裝iptables,須要使用--with-ksource 參數指定內核源碼路徑
./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.28.8 make && make install
4.安裝l7-protocols協議包
tar xf l7-protocols-2009-05-28.tar.gz cd l7-protocols-2009-05-28 make install
5.恢復iptables啓動腳本及配置文件
cp /tmp/iptables /etc/init.d/iptables cp /tmp/iptables.config /etc/sysconfig/iptables.config
vim /etc/rc.d/init.d/iptables 編輯iptables啓動腳本
把$iptables的路徑改爲/sbin/$iptables
service iptables start chkconfig iptables on
若是在防火牆啓動的時候報錯
Loading additional iptables modules: ip_conntrack_netbios_n[FAILED]
vi /etc/sysconfig/iptables-config
註釋掉
#IPTABLES_MODULES="ip_conntrack_netbios_ns"
使用iptables 設置應用層過濾規則
使用layer7顯示匹配策略過濾使用QQ,MSN Edonkey等應用層協議的數據訪問
iptables -A FORWARD -m layer7 --l7proto qq -j DROP iptables -A FORWARD -m layer7 --l7proto msn-filetransfer -j DROP iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP iptables -A FORWARD -m layer7 --l7proto bittorrenr -j DROP iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP
使用--connlimit 顯示匹配進行數據併發鏈接控制,超過100個併發鏈接將拒絕
iptables -A FORWARD -p tcp --syn -m connlimit --connlimit-above 100 -j DROP
使用--time顯示匹配根據時間範圍設置訪問策略,容許週一到週五 8:00-18:00之間的數據訪問
iptables -A FORWARD -p tcp --dport 80 -m time --timestart 8:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
使用string顯示匹配策略過濾包含tencent,verycd,***,***的網絡訪問
iptables -A FORWARD -p udp --dport 53 -m string --string "qq" --algo bm -j DROP iptables -A FORWARD -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP iptables -A FORWARD -p udp --dport 53 -m string --string "verycd" --algo bm -j DROP iptables -A FORWARD -p udp --dport 53 -m string --string "***" --algo bm -j DROP iptables -A FORWARD -p udp --dport 53 -m string --string "***" --algo bm -j DROP
其中--algo參數用於指定字符串識別算法,bm 或 kmp
備註1:
XZ壓縮最新壓縮率之王
xz是絕大數linux默認就帶的一個壓縮工具。壓縮的比例大,可是時間慢
xz -z 要壓縮的文件
若是要保留被壓縮的文件加上參數 -k ,若是要設置壓縮率加入參數 -0 到 -9調節壓縮率。若是不設置,默認壓縮等級是6.
xz -d 要解壓的文件
一樣使用 -k 參數來保留被解壓縮的文件。
建立或解壓tar.xz文件的方法
習慣了tar czvf或tar xzvf的人可能碰到tar.xz也會想用單一命令搞定解壓或壓縮。其實不行
tar裏面沒有徵對xz格式的參數好比:
z是針對gzip
j是針對 bzip2
建立tar.xz文件:只要先tar cvf Crushlinux.tar Crushlinux/這樣建立Crushlinux.tar文件先,而後使用xz -z Crushlinux.tar來將Crushlinux.tar壓縮成爲Crushlinux.tar.xz
解壓tar.xz文件:先xz -d Crushlinux.tar.xz將Crushlinux.tar.xz解壓成Crushlinux.tar 而後,再用tar xvf Crushlinux.tar來解包