1. 程式人生 > >Netfilter/Iptables Layer7 應用層過濾策略部署

Netfilter/Iptables Layer7 應用層過濾策略部署

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 應用層過濾策略部署