Centos5.4
升级内核
+iptables+Layer7+ipp2p
一、安装前准备
1.所需要软件包
linux-2.6.28..tar.gz
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2
iptables-1.4.5.tar.bz2
http://ftp.netfilter.org/pub/iptables/iptables-1.4.5.tar.bz2
netfilter-layer7-v2.22.tar.gz
http://downloads.sourceforge.net/l7-filter/netfilter-layer7-v2.22.tar.gz
l7-protocols-2009-05-28.tar.gz
http://downloads.sourceforge.net/l7-filter/l7-protocols-2009-05-28.tar.gz
2.把以上内核和软件包解压到/usr/src下
tar -zxvf linux-2.6.28.7.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
二、安装l7-protocols
进入l7-protocols/下
Make install
三、编译新内核
1.给新内核打L7补丁
cd /usr/src/linux-2.6.28.7
patch -p1< /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
2.修改内核配置项
make mrproper 清理工作
make menuconfig
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 ---> 该项下的所有项目必需都选上
2.1编译并安装新内核
Make
make bzImage
make modules
make modules_install
make install
2.2 设置新内核为默认启动的内核,如果是远程连接服务器,必须要修改这项,否则重启后默认加载旧的kernel
vim /boot/grub/gurb.conf
default=1 把1改为0
timeout=5 设置等候时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.24.7)
root (hd0,0)
kernel /boot/vmlinuz-2.6.24.7 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.24.7.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
保存退出
3.编译安装iptables并支持layer7
cd /usr/src/iptables-1.4.5/
export KERNEL_DIR=/usr/src/linux-2.6.28/
export IPTABLES_DIR=/usr/src/iptables-1.4.5
4.进入到iptables的源码目录,将/usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward目录下的
libxt_layer7.c libxt_layer7.man 这两个文件拷贝到/usr/src/iptables-1.4.2/extensions目录下
cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/
注:如果有
patch可以打补丁
进入到iptables1.4.2源码目录执行以下命令给iptables1.4.2打补丁,由于没有针对我的2.6.25的补丁,所以就装了最新的2.6.20,其他版本的补丁没有试过
patch -p1 < ../netfilter-layer7-v2.20/iptables-1.4-for-kernel-2.6.20forward-layer7-2.20.patch
5、接下来就是安装打好补丁的iptables1.4.2了,进入到iptables1.4.2源码目录,执行以下命令:
./configure --with-ksource=/usr/src/linux-2.6.28
make KERNEL_DIR=/usr/src/linux BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man
make install BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man
四、重新启动之后查看内核是否加载成功 以及iptables版本
[root@DB2 ~]# uname –a
Linux DB2 2.6.28 #1 SMP Thu Feb 24 11:19:41 CST 2011 x86_64 x86_64 x86_64 GNU/Linux
[
root@DB2 ~t ~]# iptables -V
iptables v1.4.5
五、编译加载ipp2p(这个步骤一定会出现一些问题,是新版本的内核和iptabels的改变导致的)
首先修改Makefile,编译
tar zxvf ipp2p-0.99.15.tar.gz
cd ipp2p-0.99.15/
vi Makefile 修改kernel_dir为/usr/src/linux-2.6.24.7
make
如果完全按照上面的步骤操作,编译的时候遇到的第一个错误应该
是这样的:图一
这是版本差异造成的,需要修改代码:
修改libipt_ipp2p.c
找到报警的行:375,376,378,379
参考系统的libxt_mark.c修改相关代码如下:
static void
删除init(struct ipt_entry_match *m, unsigned int *nfcache)
添加init(struct xt_entry_match *m)
{
struct ipt_p2p_info *info = (struct ipt_p2p_info *)m->data;
删除 *nfcache |= NFC_UNKNOWN;
/*init the module with default values*/
info->cmd = 0;
info->debug = 0;
}
static int
parse(int c, char **argv, int invert, unsigned int *flags,
删除 const struct ipt_entry *entry,
删除 unsigned int *nfcache,
添加 const void *entry,
struct xt_entry_match **match)
{
struct ipt_p2p_info *info = (struct ipt_p2p_info *)(*match)->data;
static void
删除print(const struct ipt_ip *ip,
添加print(const void *ip,
const struct xt_entry_match *match,
int numeric)
{
static void
删除save(const struct ipt_ip *ip, const struct iptt_entry_match *match)
添加save(const void *ip, const struct xt_entry_match *match)
{
struct ipt_p2p_info *info = (struct ipt_p2p_info *)match->data;
重新编译,make clean make
成功编译!
将编译出的libipt_ipp2p.so(目录 ipp2p-0.99.15/下)复制到/lib/iptables/
cp libipt_ipp2p.so /lib/iptables/
cp ipt_ipp2p.ko /lib /modules/2.6.24.7/kernel/net/ipv4/netfilter
将ipt_ipp2p.ko复制到内核的
netfilter目录下
运行depmod -a,更新内核模块的依赖关系。
重启iptables服务
Service iptables restart
测试L7成功
Iptables –A FORWARD –m layer7 –l7proto q –j DROP
测试ipp2p成功
Iptables –A FORWARD –p tcp –m ipp2p –xunlei –j DROP