1、下载
kernel source code(本人所用:fedora Core6, 2.6.18)
netfilter l7-protocols
2、
tar -zxvf linux-2.6.18.1.tar.gz
(内核源代码解压缩到/usr/src目录下linux-2.6.18.1)
tar -zxvf netfilter-layer7-v2.13.tar.gz
tar -zxvf l7-protocols-2006-06-03.tar.gz
(本人将其解压缩到root主目录下)
3、给系统打补丁(针对不同的系统内核,分别打netfilter和l7-protocols的补丁,在两个安装路径的readme里面有详细描述)
cd /usr/src/linux-2.6.18.1
patch -p1 < /root/netfilter-layer7-v2.13/for_oler_kernel/kernel-2.6.18-2.6.19-layer7-2.9.patch
cd /usr/src/iptables-1.3.8
patch -p1 < /root/netfilter-layer7-v2.13/iptables-for-kernel-2.6.20forward-layer7-2.13.patch
4、配置
(图形界面)
make xconfig
(命令行)
make config
以图形界面为例,主要是对于netfilter和iptables的配置
具体路径为:
Networking-->networking options-->networking packet filtering(replaces ipchains)-->IP:Netfilter Configuration-->Connection tracking(required for masq/NAT)--> 选择该标签下所有选项,包括connection tracking...和IP table support
保存退出
//patch的版本可能不同,根据自己linux系统的内核版本来确定使用的patch。使用uname -a查看自己系统的内核版本。
5、编译并安装系统内核
配置好上述部分后,按照如下命令编译:
make bzImage //开始编译核心代码
这个步骤主要用来产生可引导的内核文件。编译出来的内核文件放置在如下目录中:
/usr/src/linux_(version)/arch/i386/boot/bzImage
此外还有个未经过压缩的内核放在/usr/src/linux_(version)下面,但我们不使用这个文件。
make modules //开始编译模块代码
make modules_install //将模块数据安装在/lib/modules/'uname -r'中
make install
/////////////////////////////////////////////////
在这个过程中出现错误,make install时,系统提示:
FATAL:Could not open /lib/modules/2.6.18.1:No such file or directory
No modules available for kernel 2.6.18.1
错误原因:
/lib/modules目录下没有找到对应的内核模块文件夹。一个简单的办法就是把原有的文件夹直接拷贝后改成所需文件夹名称。
如,在/lib/modules目录下有一个文件夹/2.6.18.1-2483.fc6,直接拷贝粘贴改名为/2.6.18.1就可以了。
重新编译。
/////////////////////////////////////////////////
在编译成功之后,重新启动,发现不能正常初始化,提示
insmod: error inserting '/lib/jdb.ko: -1 Invalid module format
ERROR : /bin/insmod exited abnormally!
insmod: error inserting '/lib/ext3.ko': -l Invalid module format
ERROR : /bin/insmod exited abnormally!
insmod: error inserting '/lib/dm-mirror.ko: -1 Invalid module format
ERROR : /bin/insmod exited abnormally!
insmod: error inserting '/lib/dm-zero.ko: -1 Invalid module format
ERROR : /bin/insmod exited abnormally!
insmod: error inserting '/lib/dm-snapshot.ko: -1 Invalid module format
ERROR : /bin/insmod exited abnormally!
Unable to find device_mapper major/minor
Found volume group "VolGroup00" using metadata type lvm2
/dev/mapper/control: open failed : No such file or directory
Is device_mapper driver missing from kernel?
0 logical volum(s) in volume group "VolGroup00" now active
/dev/mapper/control: open failed
ERROR: /bin/lvm exited abnormally!
mount : error 6 mounting ext3
mount: error 2 mounting ext2
switchroot: mount failed : 22
umount /initrd/dev failed : 2
Kernel panic - no syncing : Attempted to kill init!
问题分析:
可能是ext3文件系统或者LVM配置的问题,需要将其配置为内核编译而不是模块编译(十分重要)。
重新配置,并编译。
6、内核编译成功后,开始编译iptables
首先在确保已经打过iptables的补丁后,执行下面的命令:
chmod +x extensions/.layer7-test
之后正常编译iptables
make KERNEL_DIR=/usr/src/linux2.6.18.1
make install KERNEL_DIR=/usr/src/linux2.6.18.1
7、编译成功后,可以选择iptables来应用layer7-protos
具体方法:
解压缩"Protocol Definitions"并创建目的目录/etc/l7-protocols
使用如下命令行匹配应用层数据:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto http -j MARK --send -mark 1
也可以将layer7-protos模板安装到自定义目录,只是需要在应用协议检测之前指定该目录即可:
iptables [...] -m layer7 --l7dir /home/fangsy/paterns --l7proto http[...]
8、定义自己的pat文件
iptables会在指定目录或者/etc/ ls中查找pat文件。
它会找到/etc/l7-protocols/http.pat 和/etc/l7-protocols/protocols/http.pat。但不会找到/etc/l7-protocols/foo/bar/http.pat
9、应用layer7-filter
首先 阻断某一指定协议
其次 控制带宽使用
其实阻断非常简单,在命令行尾使用"-j DROP "或者"-j REJECT"
带宽限制
要控制协议的带宽占用,你可以使用Netfilter来"标记"封包然后使用QoS过滤带有标记的封包
标记封包:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 3
数字3是任意输入的一个32位的整数,接下来你就可以使用"tc"命令("traffic control",一个用户态的linux QoS工具,是iproute2包的一部分)来过滤被标记的封包。
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
可以试着读一下"the linux advanced routing and traffic control howto(Linux高级路由和通讯控制HOWTO)"文档受点启发,这样也许可以更好的理解现在你所做的一切,但是不幸的是,tc命令非常模糊。