1、下载所需要软件包
linux-2.6.28.tar.gz
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.gz
iptables-1.4.5.tar.bz2
http://netfilter.org/projects/iptables/files/iptables-1.4.5.tar.bz2
netfilter-layer7-v2.22.tar.gz
http://sourceforge.net/projects/l7-filter/files/l7-filter%20kernel%20version/2.22/netfilter-layer7-v2.22.tar.gz/download
l7-protocols-2009-05-28.tar.gz
http://sourceforge.net/projects/l7-filter/files/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz/download
2、把以上内核和软件包解压到/usr/src下
tar -zxvf linux-2.6.28.tar.gz -C /usr/src
tar -zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src
tar -zxvf l7-protocols-2009-05-28.tar.gz -C /usr/src
tar -jxvf iptables-1.4.5.tar.bz2 -C /usr/src
3、卸载系统自带的iptables
rpm -qa | grep iptables 查看有没有安装iptables软件包
rpm -e iptables --nodeps 强制卸载
4、给新内核安装layer7补丁
cd /usr/src/linux-2.6.28/
patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
5、编译新内核,修改内核配置项
make oldconfig
注意:
全部保持默认,直接回车。
(如果之前曾经编译过,需要先执行 make mrproper 。make oldconfig会自动对比之前的kernel config,根据之前版本的配置生成一个kernel config,这样方便我们在编译新核心的时候,无须在从头修改所有的核心设置)
make menuconfig
General setup --->
Prompt for development and/or incomplete code/drivers 必选
Networking --->
Networking options --->
Network packet filtering framework (Netfilter) --->
Core Netfilter Configuration ---> 该项下的所有项目建议都选上
<M> Netfilter connection tracking support 这个项目必需选上,下面才会出现layer7的选项
<M> "layer7" match support 必选
Layer 7 debugging output 必选
IP: Netfilter Configuration ---> 该项下的所有 项目必需都选上
6、编译并安装新内核
make
make modules_install
make install
7、设置新内核为默认启动的内核
vi /etc/gurb.conf
default=1 把1改为0
timeout=9 设置等候时间为9秒
splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.28)
root (hd0,0)
kernel /boot/vmlinuz-2.6.28 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.28.img
title CentOS (2.6.18-164.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.18-164.el5.img
保存退出,重新启动系统
reboot
编译内核重启后会报出 insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits,解决方法见下文。
查看新内核版本
uame -a
Linux localhost.localdomain 2.6.28 #1 SMP Wed Apr 28 16:17:14 CST 2010 x86_64 x86_64 x86_64 GNU/Linux
8、编译安装iptables并支持layer7
cd /usr/src/iptables-1.4.5/
cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/*.* extensions/
./configure --with-ksource=/usr/src/linux-2.6.28
make
make install
9、安装Layer7协议文件
cd l7-protocols-2009-05-28
make install
10、测试iptables版本是否生效
/usr/local/sbin/iptables -V
显示如下,说明安装成功:
iptables v1.4.5
再来测试layer7模块是否安装成功
/usr/local/sbin/iptables -m layer7 --help
显示如下,说明安装成功:
[root@localhost src]# /usr/local/sbin/iptables -m layer7 --help
iptables v1.4.5
Usage: iptables -[AD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
。。。。。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。。。
layer7 match options:
--l7dir <directory> : Look for patterns here instead of /etc/l7-protocols/
(--l7dir must be specified before --l7proto if used)
[!] --l7proto <name>: Match named protocol using /etc/l7-protocols/.../name.pat
至此安装过程完全完成。
11、使用iptables的layer-7模块进行测试,我的运行脚本如下:
$ipt -A FORWARD -m layer7 --l7proto qq -j DROP
$ipt -A FORWARD -m layer7 --l7proto kugoo -j DROP
$ipt -A FORWARD -m layer7 --l7proto edonkey -j DROP
$ipt -A FORWARD -m layer7 --l7proto xunlei -j DROP
$ipt -A FORWARD -m layer7 --l7proto bittorrent -j DROP
$ipt -A FORWARD -m string --algo bm --string 'web.qq.com' -j DROP
$ipt -A FORWARD -m time --timestart 01:40 --timestop 02:40 -j DROP #Use UTC
经过测试,是完全有效果的,如果你能力强,还可以自己编写.pat文件,实现更灵活的访问控制。
FAQ
编译内核重启后会报出 insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits
其实不影响启动,解决方法如下:
1、解压initrd
cp /boot/initrd-2.6.28.img /tmp
cd /tmp/
mkdir newinitrd
cd newinitrd/
zcat ../initrd-2.6.28.img | cpio -i
11264 blocks
2、编辑init,删掉其中重复的两行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3、重新打包initrd
find . | cpio -c -o > ../initrd
11169 blocks
cd ..
gzip -9 < initrd > initrd-2.6.28.img
initrd-2.6.28.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot就可以了,再reboot,就不会有之前的错误了。
参考文章:
http://www.10235.com/linux/centos-iptables-l7filter.html
linux-2.6.28.tar.gz
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.gz
iptables-1.4.5.tar.bz2
http://netfilter.org/projects/iptables/files/iptables-1.4.5.tar.bz2
netfilter-layer7-v2.22.tar.gz
http://sourceforge.net/projects/l7-filter/files/l7-filter%20kernel%20version/2.22/netfilter-layer7-v2.22.tar.gz/download
l7-protocols-2009-05-28.tar.gz
http://sourceforge.net/projects/l7-filter/files/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz/download
2、把以上内核和软件包解压到/usr/src下
tar -zxvf linux-2.6.28.tar.gz -C /usr/src
tar -zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src
tar -zxvf l7-protocols-2009-05-28.tar.gz -C /usr/src
tar -jxvf iptables-1.4.5.tar.bz2 -C /usr/src
3、卸载系统自带的iptables
rpm -qa | grep iptables 查看有没有安装iptables软件包
rpm -e iptables --nodeps 强制卸载
4、给新内核安装layer7补丁
cd /usr/src/linux-2.6.28/
patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
5、编译新内核,修改内核配置项
make oldconfig
注意:
全部保持默认,直接回车。
(如果之前曾经编译过,需要先执行 make mrproper 。make oldconfig会自动对比之前的kernel config,根据之前版本的配置生成一个kernel config,这样方便我们在编译新核心的时候,无须在从头修改所有的核心设置)
make menuconfig
General setup --->
Prompt for development and/or incomplete code/drivers 必选
Networking --->
Networking options --->
Network packet filtering framework (Netfilter) --->
Core Netfilter Configuration ---> 该项下的所有项目建议都选上
<M> Netfilter connection tracking support 这个项目必需选上,下面才会出现layer7的选项
<M> "layer7" match support 必选
Layer 7 debugging output 必选
IP: Netfilter Configuration ---> 该项下的所有 项目必需都选上
6、编译并安装新内核
make
make modules_install
make install
7、设置新内核为默认启动的内核
vi /etc/gurb.conf
default=1 把1改为0
timeout=9 设置等候时间为9秒
splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.28)
root (hd0,0)
kernel /boot/vmlinuz-2.6.28 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.28.img
title CentOS (2.6.18-164.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.18-164.el5.img
保存退出,重新启动系统
reboot
编译内核重启后会报出 insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits,解决方法见下文。
查看新内核版本
uame -a
Linux localhost.localdomain 2.6.28 #1 SMP Wed Apr 28 16:17:14 CST 2010 x86_64 x86_64 x86_64 GNU/Linux
8、编译安装iptables并支持layer7
cd /usr/src/iptables-1.4.5/
cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/*.* extensions/
./configure --with-ksource=/usr/src/linux-2.6.28
make
make install
9、安装Layer7协议文件
cd l7-protocols-2009-05-28
make install
10、测试iptables版本是否生效
/usr/local/sbin/iptables -V
显示如下,说明安装成功:
iptables v1.4.5
再来测试layer7模块是否安装成功
/usr/local/sbin/iptables -m layer7 --help
显示如下,说明安装成功:
[root@localhost src]# /usr/local/sbin/iptables -m layer7 --help
iptables v1.4.5
Usage: iptables -[AD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
。。。。。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。。。
layer7 match options:
--l7dir <directory> : Look for patterns here instead of /etc/l7-protocols/
(--l7dir must be specified before --l7proto if used)
[!] --l7proto <name>: Match named protocol using /etc/l7-protocols/.../name.pat
至此安装过程完全完成。
11、使用iptables的layer-7模块进行测试,我的运行脚本如下:
$ipt -A FORWARD -m layer7 --l7proto qq -j DROP
$ipt -A FORWARD -m layer7 --l7proto kugoo -j DROP
$ipt -A FORWARD -m layer7 --l7proto edonkey -j DROP
$ipt -A FORWARD -m layer7 --l7proto xunlei -j DROP
$ipt -A FORWARD -m layer7 --l7proto bittorrent -j DROP
$ipt -A FORWARD -m string --algo bm --string 'web.qq.com' -j DROP
$ipt -A FORWARD -m time --timestart 01:40 --timestop 02:40 -j DROP #Use UTC
经过测试,是完全有效果的,如果你能力强,还可以自己编写.pat文件,实现更灵活的访问控制。
FAQ
编译内核重启后会报出 insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits
其实不影响启动,解决方法如下:
1、解压initrd
cp /boot/initrd-2.6.28.img /tmp
cd /tmp/
mkdir newinitrd
cd newinitrd/
zcat ../initrd-2.6.28.img | cpio -i
11264 blocks
2、编辑init,删掉其中重复的两行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3、重新打包initrd
find . | cpio -c -o > ../initrd
11169 blocks
cd ..
gzip -9 < initrd > initrd-2.6.28.img
initrd-2.6.28.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot就可以了,再reboot,就不会有之前的错误了。
参考文章:
http://www.10235.com/linux/centos-iptables-l7filter.html
转载于:https://blog.51cto.com/feilong0663/1354148