Netfilter/Iptables Layer7 應用層過濾策略部署
Netfilter/Iptables Layer7 應用層過濾策略部署
環境:內核版本:Linux version 2.6.32-431.el6.x86_64
iptables版本:iptables v1.4.7
gcc版本:4.6.1
軟件準備:wget http://download.clearfoundation.com/l7-filter/netfilter-layer7-v2.23.tar.gz
wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.9.tar.bz2
wget http://download.clearfoundation.com/l7-filter/l7-protocols-2009-05-28.tar.gz
wget http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/iptables-1.4.7-11.el6.src.rpm
窗體頂端
窗體底端
簡介
Netfilter/Iptables 作為一個典型的包過濾防火墻體系,對於網絡層,傳輸層的數據包過濾具有
非常優秀的性能和效率,然而,對於一些面向局域網上網用戶的Linux網關服務器,有時候還需要使
用QQ,MSN等聊天,使用BT下載工具等現象進行封鎖。下面將介紹如何為Netfilter/Iptables 增加應用層過濾。
QQ,MSN等聊天,使用BT下載工具均使用了相對固定的應用層協議。使用L7-filter項目的補丁文件
包可以為linux內核增加相應的應用層過濾功能,結合其提供的l7-protocols第7層協議定義包,能夠識別不同應用層的數據特征
L7-filter項目站點:http://l7-filter.sourceforge.net/ 下載最新的補丁包及協議包
內核站點:http://www.kernel.org 下載內核,iptables的源碼包
將netfilter-layer7 源碼包中的對應補丁文件添加到內核源碼中,對內核進行重新編譯,安裝,安裝後使用新內核啟動Linux操作系統。
註意:L7-filter補丁包內的數據,要與內核及iptables源碼版本相匹配
註意:源碼目錄所在分區至少保持有2.5G的剩余磁盤空間。
窗體頂端
窗體底端
編譯安裝內核
1.解壓釋放netfilter-layer7和內核源碼包,使用patch工具合並補丁文件
tar xflinux-2.6.35.9.tar.bz2 -C /usr/src/
tar xfnetfilter-layer7-v2.23.tar.gz
cd /usr/src
ln -sn linux-2.6.35.9/linux
ll linux* -d
lrwxrwxrwx 1 root root 15 Aug 26 10:55 linux ->linux-2.6.35.9/
drwxrwxr-x 23root root 4096 Nov 23 2010linux-2.6.35.9
#cd linux
#patch -p1 </root/netfilter-layer7-v2.23/kernel-2.6.35-layer7-2.23.patch
patching fileinclude/linux/netfilter/xt_layer7.h
patching fileinclude/net/netfilter/nf_conntrack.h
patching filenet/netfilter/Kconfig
patching filenet/netfilter/Makefile
patching filenet/netfilter/nf_conntrack_core.c
patching filenet/netfilter/nf_conntrack_standalone.c
patching filenet/netfilter/regexp/regexp.c
patching filenet/netfilter/regexp/regexp.h
patching filenet/netfilter/regexp/regmagic.h
patching filenet/netfilter/regexp/regsub.c
patching filenet/netfilter/xt_layer7.c
註意:【patch -p1 】 中“1” 是數字 1,不是小寫字母 L
2.重新配置內核編譯參數,添加state機制及layer7支持【仍在內核編譯目錄】
cp /boot/config-2.6.32-431.el6.x86_64.config
yum -y installgcc ncurses-devel
make menuconfig
在配置界面中,方向鍵用於定位需要配置的項目
select 進入子配置菜單
exit 返回上一層
help 查看幫助信息
空格 切換所選項目的編譯類型
三種狀態:
[] 表示不需要該功能
[M] 將功能編譯成模塊
[*] 將功能直接編入內核
Networkingsupport ---> Networking options ---> Network packet filtering framework(Netfilter)
---> CoreNetfilter Configuration --->
<M>Netfilter connection tracking support
<M> "layer7" match support
<M> "string" match support
<M> "time" match support
<M> "iprange" address range matchsupport
<M> "connlimit" matchsupport"
<M> "state" match support
<M> "conntrack" connection matchsupport
<M> "mac" address match support
<M> "multiport" Multiple port matchsupport
Networkingsupport ---> Networking options ---> Network packet filtering framework(Netfilter)
---> IP:Netfilter Configuration --->
<M> IPv4connection tracking support (required for NAT)
<M> Full NAT
<M> MASQUERADE target support
<M> NETMAP target support
<M> REDIRECT target support
使用Exit返回 最後當提示保存時,使用Yes確認保存,修改將保存到源碼目錄中的.config文件中。
3.編譯新內核,並安裝新內核文件
make
makemodules_install && make install
新內核編譯安裝過程將花費較長時間,數十分鐘到數小時不等
新內核文件被安裝到/boot目錄,模塊文件將復制到/lib/modules/2.6.35.9
如果編譯內核,途中斷過,想重新編譯,那麽先使用
makemrproper 刪除不必要的文件和目錄,初次編譯內核不需要
makeclean 刪除不必要的模塊和文件
然後重新 makemenuconfig
4.調整GRUB引導菜單,使系統以新內核啟動,然後重啟linux服務器 從新版內核啟動
vim/boot/grub/grub.conf 【修改default=0 ,1改為0】
default=0
timeout=5
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS(2.6.35.9)
root(hd0,1)
reboot
窗體頂端
窗體底端
安裝iptables/l7-protocols協議包
1、制作iptables升級包
新建mockbuild用戶,將l7-protocols-2009-05-28.tar.gz解壓後的用於iptables 1.4.3和內核2.6.20之後的文件復制過來。
註意目錄層次。
useraddmockbuild
rpm -ivhiptables-1.4.7-11.el6.src.rpm
warning:iptables-1.4.7-11.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51:NOKEY
1:iptables ########################################### [100%]
cd/root/rpmbuild/SOURCES/
tar xfiptables-1.4.7.tar.bz2
cdiptables-1.4.7
cp/root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/*./extensions/
cd ..
tar -jcfiptables-1.4.7.tar.bz2 iptables-1.4.7/*
mviptables-1.4.7/ /tmp/
cd ../SPECS/
vim iptables.spec
Version:1.4.7
Release:11.5%{?dist} //修改11.5表示升級
CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
--with-kernel=/usr/src/linux --with-kbuild=/usr/src/linux--with-ksource=/usr/src/linux
//最後 三項 參數改為編譯 的內核 linux所在目錄
%changelog
* Wed May 172016 Fisher 1.4.7-11.5
- L7-filtersupport //在 %changelog 後添加這兩段,加入更新日誌(日期為當天)
yum installrpm-build libselinux-devel -y
rpmbuild -baiptables.spec
2、開始升級iptables
cd/root/rpmbuild/RPMS/x86_64/
rpm -Uvhiptables-1.4.7-11.5.el6.x86_64.rpm iptables-ipv6-1.4.7-11.5.el6.x86_64.rpm //可加參數 --nodeps 強制安裝
cd /tmp
tar xfl7-protocols-2009-05-28.tar.gz
cd l7-protocols-2009-05-28
make install
mkdir -p/etc/l7-protocols
cp -R */etc/l7-protocols
3、檢查l7-protocols協議包
rpm -ql iptables| grep layer7
/lib64/xtables/libxt_layer7.so
窗體頂端
窗體底端
啟用七層過濾/添加規則
1、啟用七層過濾
# modprobext_layer7
# lsmod | grepxt_layer7
xt_layer7 12060 0
nf_conntrack 79850 1 xt_layer7
2、查看並開啟內核參數,確保net.netfilter.nf_conntrack_acct等於1
# sysctl -a |grep conntrack_acct
net.netfilter.nf_conntrack_acct = 1
3、在Iptables上做7層防火墻過慮限制
vim/etc/sysctl.conf
net.ipv4.ip_forward = 1 //開啟路由轉發功能
sysctl -p
lsmod | grep -wnf_conntrack //查看nf_conntrack模塊是否加載
nf_conntrack 79485 6
xt_layer7,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
sysctl -a |grep acct //查看內核連接追蹤功能是否開啟
kernel.acct = 42 30
###如果下面值為0,修改為1
net.netfilter.nf_conntrack_acct = 1
###打開下面文件加入到裏面執行如下命令即可生效
vim/etc/sysctl.conf
net.netfilter.nf_conntrack_acct = 1
sysctl -p
###也可使用此項命令修改,但一重啟系統便會失效
sysctl -wnet.netfilter.nf_conntrack_acct=1
4、添加規則
支持的layer7應用層協議
匹配格式:iptables [-t 表名] -m layer7--l7proto 協議名
根據時間過濾
匹配格式:-m time --timestart 起始時間--timestop 結束時間 --weekdays 每周的那些天
時間格式以24小時制表示,如早9:30 晚18:00
每周一至周日對應的英文縮寫表示為:Mon、Tue、Wed、Thu、Fri、Sat、Sun 也可以使用數字表示周一至周日,如:1、2、3、4、5、6、7
根據字符串過濾
匹配格式:-m string --string “字符串”--algo {bm|kmp}
實例:
使用layer7顯示匹配策略過濾使用QQ,MSN Edonkey等應用層協議的數據訪問
iptables -AFORWARD -m layer7 --l7proto qq -j DROP
iptables -AFORWARD -m layer7 --l7proto msn-filetransfer -j DROP
iptables -AFORWARD -m layer7 --l7proto msnmessenger -j DROP
iptables -AFORWARD -m layer7 --l7proto bittorrenr -j DROP
iptables -AFORWARD -m layer7 --l7proto xunlei -j DROP
iptables -AFORWARD -m layer7 --l7proto edonkey -j DROP
使用--connlimit 顯示匹配進行數據並發連接控制,超過100個並發連接將拒絕
iptables -AFORWARD -p tcp --syn -m connlimit --connlimit-above 100 -j DROP
使用--time顯示匹配根據時間範圍設置訪問策略,允許周一到周五8:00-18:00之間的數據訪問
iptables -AFORWARD -p tcp --dport 80 -m time --timestart 8:00 --timestop 18:00 --weekdaysMon,Tue,Wed,Thu,Fri -j ACCEPT
星期一 MON 星期二 TUE 星期三 WED 星期四 THU 星期五 FRI 星期六 SAT 星期天 SUN
使用string顯示匹配策略過濾包含tencent,verycd,色情,成人電影的網絡訪問
iptables -AFORWARD -m string --string"qq" --algo bm -j DROP
iptables -AFORWARD -m string --string"tencent" --algo bm -j DROP
iptables -AFORWARD -m string --string"verycd" --algo bm -j DROP
iptables -AFORWARD -m string --string "色情" --algo bm -j DROP
iptables -AFORWARD -m string --string "成人電影" --algo bm -j DROP
其中--algo參數用於指定字符串識別算法,bm 或 kmp
5、查看支持的協議簇
ls/etc/l7-protocols/protocols/
窗體頂端
窗體底端
問題匯總
1、在make 內核過程中報【gcc: error: elf_x86_64: No such file or directory】
解決:gcc -v ,若gcc 版本為4.6 ,則不支持 linker-style 架構
在內核目錄arch/x86/vdso/Makefile中,大約在28,29行找到
VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,-soname=linux-vdso.so.1 \
-Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
把"-m elf_x86_64" 替換為"-m64"
然後再繼續找,大約在72行左右,找到
VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1
中的 "-m elf_i386" 替換為"-m32"
2、在make 內核過程中報【drivers/net/igbvf/igbvf.h:129:15: 錯誤:重復的成員‘page’】
解決:打開文件,看129行,代碼為:struct page*page;再往上看,第124行,也有struct page*page這行代碼,
這個結構定義在內部的一個結構體中。就是他的名字與129行的重復了,而4.6.*的編譯器不支持這種方式的定義,
我們修改129行的代碼為struct page *pagep;保存退出
3、在rpmbuild -bbiptables.spec 制作rpm包報 【***ERROR: No build ID note found in /home/wuyang/rpmbuild/BUILDROOT/******
error: Bad exitstatus from /var/tmp/rpm-tmp.BPd1OI (%install)】
解決:在iptables.spec文件中任意位置添加如下參數:
%define__debug_install_post \
%{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts}"%{_builddir}/%{?buildsubdir}"\
%{nil}
重新打包
本文出自 “13007250” 博客,請務必保留此出處http://13017250.blog.51cto.com/13007250/1984043
Netfilter/Iptables Layer7 應用層過濾策略部署