debian环境下 l7-filter 的安装教程

debian环境下 l7-filter 的安装教程

本文欢迎大家转载,请保留作者信息。
请注明转自linuxsir.org,作者memory。

l7-filter(Application Layer Packet Classifier for Linux)是linux下的开源项目,它是基于应用层数

据识别的分类器。它可以分类数据包而不管你使用的是哪些端口,这对那些经常变换端口的网络应用进行

数据流整形非常有用。l7-filter已经开发到v1.3版,功能已经比较完善。它以kernel、iptables的补丁的
形式提供的,尚未合并到kernel的源代码中。

debian linux是当前流行的几大linux发行版之一。它的优势就是其有着强大的软件包管理工具集,能够很

好的自动解决软件包之间的相互依赖关系,以及便捷的升级方式。本文将介绍怎样以debian的方式来安装

使用l7-filter。



1、安装编译相关工具
apt-get install debhelper kernel-package fakeroot libncurses5-dev bzip2



2、获取源代码

(1)获取debian官方源代码包(unstable)
cd /usr/src
apt-get source kernel-image-2.6.11-686
apt-get install kernel-tree-2.6.11
apt-get source iptables

iptables的当前debian官方版本是1.2.11。下载debian的iptables源代码是为了使用其编译脚本,后边会

介绍。


(2)到iptables主页下载最新版本,官方主页http://www.netfilter.org。下面的是我当前使用得版本:
wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20050520.tar.bz2
wget http://ftp.netfilter.org/pub/iptables/iptables-1.3.1.tar.bz2


(3)layer7 filter 官方主页下载补丁和协议定义包,主页http://l7-filter.sourceforge.net/
wget http://jaist.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v1.3.tar.gz
wget http://jaist.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2005-05-19.tar.gz

解开这两个包:
tar -xzf netfilter-layer7-v1.3.tar.gz
tar -xzf l7-protocols-2005-05-19.tar.gz



3、准备编译iptables

(1)拷贝新版本源代码到debian的iptables源代码目录中:
cp patch-o-matic-ng-20050520.tar.bz2 iptables-1.3.1.tar.bz2 kernel-source-2.6.11.tar.bz2

iptables-1.2.11/upstream


(2)修改debian脚本
cd iptables-1.2.11
vi scripts/prep.sh
修改下面几行为:
iptables="iptables-1.3.1"
pomng="patch-o-matic-ng-20050520"
kernel="kernel-source-2.6.11"

找到下面两行:
unpack "$ipset"
> ${build}/ipset/Makefile

在其后添加:
(cd "$iptables_profectio"; \
patch -p1 < /usr/src/netfilter-layer7-v1.3/iptables-layer7-1.3.patch; \
chmod o+x extensions/.layer7-test;
> ippool/ippool)
(cd "$kernel_profectio"; patch -p1 <

/usr/src/netfilter-layer7-v1.3/kernel-2.6.11-layer7-1.3.patch)

上面几行在脚本运行时将会把iptables和kernel的layer7 filter 补丁打上。

iptables编译时有个小问题,一直没能很好的解决,那就是修改后的源代码编译时总是不能编译出ippool

这个工具,不知为何。但debian在给编译结果打包时总是要找这个东西。无奈,我只能采取欺骗的手法,

先在ippool目录中建个假的ippool完事。这也就是上边:
> ippool/ippool
这一句的用意。


(3)修改debian的iptables版本
vi debian/changlog
修改第一行为:
iptables (1.3.1-1) unstable; urgency=medium
编译后iptables的debian包版本就是1.3.1-1


(4)去掉1.2.11版iptables的patch,因为现在用的是1.3.1版的:
cd patches
mv all all.old
mkdir all


(5)编译iptables

make binary

如果不出什么异常的话,/usr/src下应该多出两个叫iptables_1.3.1-1_i386.deb和iptables-dev_1.3.1-1

_i386.deb的包,这就是编译成果。

注意:这一步会因为kernel以前打过一些补丁出现问题,直接回车跳过即可。



4、编译kernel

(1)拷贝iptables编译时使用的kernel源代码
cd /usr/src/kernel-image-2.6.11-i386-2.6.11
cp -R ../iptables-1.2.11/debian/build/kernel-source-2.6.11 .


(2)kernel编译的准备工作
vi debian/rules
找到下面这一行:
tar jxf /usr/src/kernel-source-$(version).tar.bz2
改为:
# tar jxf /usr/src/kernel-source-$(version).tar.bz2
实际就是注释掉,因为源代码我们已经从iptables目录中拷贝过来了。

删除不必要的配置文件,只保留你需要的平台配置。比如我只保留686、686-smp和default配置:
rm ./config/k7* ./config/386

如果你不删除,rules脚本将为每个配置建立相应的build目录。每个配置文件都是以面对平台的处理器命

名的,如386、686、k7等,而且要为每种配置编译生成相应的debian包,很耗时间。

运行debian脚本:
./debian/rules unpack

这步结束后,多出几个目录形如:build-686、build-686-smp,default对应的就是kernel-source-2.6.11

目录。目录个数是根据具体配置来的。


(3)为每个平台配置kernel
以686为例:
cd build-686
make menuconfig
进入
Device Drivers --->
Networking support --->
Networking options --->
Network packet filtering (replaces ipchains) --->
IP: Netfilter Configuration --->
<M> Layer 7 match support (EXPERIMENTAL)

记住:为每个你需要编译的平台作上面这一步,否则在编译是会停在那里等你确认。


(3)编译kernel
cd /usr/src/kernel-image-2.6.11-i386-2.6.11
./debian/rules binary-arch

要是没什么异常的话,在上级目录中将为每个平台建立了各自的.deb包。



5、安装

(1)安装l7 protocol
cd l7-protocols-2005-05-19
make install

这一步很简单,实际就是把这个整个目录拷贝到了/etc下


(2)安装iptables
cd /usr/src
dpkg -i iptables_1.3.1-1_i386.deb
dpkg -i iptables-dev_1.3.1-1_i386.deb


(3)安装kernel
dpkg -i kernel-image-2.6.11-1-686_2.6.11-3_i386.deb



6、测试成果

禁用bt的iptables规则:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j DROP

官方howto不建议上边的这种用法,因为l7的协议定义实际上就是正则表达式,有的数据包可能会匹配多种

协议,造成误判。他建议用tc工具分配一个带宽很窄的通道,将那些不期望的数据都定向到此通道。具体

说法和用法还是参照其主页howto。



7、禁止升级kernel、iptables软件包

测试无误后,使用包管理命令禁止更新这两个包:
echo iptables hold | dpkg --set-selections
echo kernel-image-2.6.11-1-686 hold | dpkg --set-selections


完成。

有什么问题或错误欢迎大家批评指正。
posted @ 2009-07-01 22:06  Dragon.Spirit  阅读(557)  评论(0编辑  收藏  举报