在Debian 上编译内核2.6.26.3加入Layer7模块

参考

http://blog.csdn.net/zubin006/archive/2008/08/27/2838739.aspx

向此作者致敬。

 

系统信息:
OS
:         Debian

KERNEL:2.6.26.2


使用说明:
绿色加粗字体的绝大部分是输入的命令和系统输出显示的结果。

参考文章:
http://blog.csdn.net/zubin006/archive/2008/08/27/2838739.aspx


第一步,要下载和安装要用的工具及相关软件:

  

注意:
因为Debian系统的内核编译跟Redhat有所不同,它在编译的时候会需要make-kpkg和fakeroot[可选]命令,因此需要安装以上的软件包才行!

第二步,下载并解开所需的源代码软件到相应的位置:

要编译内核并加入layer7模块,必须需要以下的软件的源代码:

  • linux kernel source
  • iptables source
  • l7-filter patch
  • l7-filter protocols

我选用的以上软件的版本如下:

  • kernel:2.6.26.3
  • iptables:1.4.3
  • l7-filter patch:2.2
  • l7-filter protocols:2009-05-28

同时,已经有的旧版本是

  • kernel:2.6.26.2
  • iptables:1.4.2

 

 

完整下载如下:

或者通过以下网站下载


按我的习惯,将这些软件解压到:/usr/local/src/Layer7下面:

因为是编译新的内核,我习惯将编译内核的源代码放在/usr/src下面,并建一个新的目录kernels,



解开要用的软件包到 /usr/src/kernels下面:





第三步,将Layer7加入新的内核中并进行编译:

为了方便,做一个符号链接,并进入新内核源代码的目录:



如果你要用延续使用旧版本内核中的模块中的功能,你要将/boot/config-kernel-version文件copy到当前的内核目录,并命名为.config




为内核源代码打上layer7的补丁:


结果如下:




为内核选择layer7及相关的模块:



选项如下:

注意,刚开始时,我一直找不到:<M> "layer7" match support [*] Layer 7 debugging output 这两个模块,浪费了很多时间,后来发现是因为这两个模块是属于:<> Netfilter connection tracking support 这个模块,因此得先选择<M> Netfilter connection tracking support 这样下面才有Layer7及相关模块!
其中time模块就是可以通过iptables可以控制上网的时间等功能,就是时间控制的模块!

一步一步的"EXIT"后,会提示你是否保存刚才的选择更改结果,我们选“YES”!

注意:
按以往Redhat或者其它版本的编译过程就得用make及要关命令来进行编译,但是在这里,我们需要用到Debian的专门工具make-kpkg,我想这个工具也是基于make,只是经过加工以方便Debian用户使用吧,因为Debian的启动内核参数跟别的系统有所差异!本文刚开始提到的安装那些软件包

就是为了这一步而做的!

清除源码树并复原 kernel-package 参数


然后进行编译并生成.deb的包,以供安装时使用:

说明:fakeroot是切换到root用户环境,如果你现在当前用户不是root,你要用这个命令,否则这个命令可以省!
好像用make-kpkg这个命令在编译内核时比以往省了很多步骤!有空研究一下这东东!
同时在做这一步时需要花挺长时间进行编译工作以及后期的工作,看你的机器配置而异!普通机器 1.7G 128M内存,得需要2小时,因此你现在可以喝杯茶,去做别的事了...
--revision=2.6.26.3  这个参数是指定新内核的版本号
--append_to_version -686 这个参数是指定内核的子版本


哎,服务器[Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz,4G]编译这一步,只花了40分钟,好电脑就是好啊!
编译完成后,在/usr/src/kernels下生成linux-image-2.6.26.3-686_2.6.26.3_amd64.deb文件,即在 linux新内核的上一级目录!

安装新的内核:

由于Debian现在采用grub2,所以不会再有/boot/grub/menu.lst文件。

我们查看/boot/grub/grub.cfg

 



这两条已经提到最前面,也就是说,如果我们没动这个文件的话,下次下机时,会去执行新的内核!


第四步,为iptables打补丁,并安装之

进入iptables源代码目录:

为源代码打上补丁,对于iptables版本高于1.4.1的,需要采用如下方法:
将补丁文件复制到extension里面

复制后,编译安装:

安装Layer7第七层协议协议定义文件:     /*TCP/IP第七层就是应用层,就是针对网络应用软件的设计,比如QQ,MSN等...
使用Layer模块时,请参考/etc/l7-protocols文件中的定义,各种协议,比如QQ,MSN的特征都在这个目下:



执行结果:
mkdir -p /etc/l7-protocols
cp -R * /etc/l7-protocols


看执行的结果就知道,它在做什么了!

这样新的内核都弄好了,iptables也装好了,就可以重新开机了!
重新开机后,就会执行新的内核和iptables,就可以测试它是否正常了!



第五步,测试

先测试Kernel和iptables的版本是不是我们刚才编译的那个:


再测试iptables的layer7是否可用:
注意:新的iptables是在/usr/local/sbin/iptables
      旧的版本的iptalbes是在/sbin/iptables

所以要注意,我就是在这里出错了,同时在编译安装新版时,/usr/local/sbin这个比/sbin目录优先,但在写启动脚本时,要写完整路径时,要用
/usr/local/sbin/iptables

显示结果


还没增加layer7模块前的情况如下:


说明一切正常。
这时再测试一下能不能挡MSN和QQ[我们以这台机器为router为例,挡经过这个路由器的MSN和QQ封包]:

MSN,QQ & bt:

# iptables -t mangle -I PREROUTING -m layer7 --l7proto msnmessenger -j DROP (禁止msn)

# iptables -t mangle -I PREROUTING -m layer7 --l7proto bittorrent -j DROP (禁止bt)
# iptables -t mangle -I PREROUTING -m layer7 --l7proto qq -j DROP (禁止QQ通讯)

看一下结果:
# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere            LAYER7 l7proto bittorrent
DROP       all  --  anywhere             anywhere            LAYER7 l7proto qq
DROP       all  --  anywhere             anywhere            LAYER7 l7proto msnmessenger

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
TCPMSS     tcp  --  anywhere             anywhere            tcp flags:SYN,RST/SYN tcpmss match 1400:1536 TCPMSS clamp to PMTU

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination


再尝试一下登录一下你的MSN,QQ以及BT软件,如果不能上线,恭喜你,成功了...

 


补充:

一,如果在log文件中看到以下信息:
ip_tables: (C) 2000-2006 Netfilter Core Team
Aug 23 11:36:58 router kernel: nf_conntrack version 0.5.0 (12288 buckets, 49152 max)
Aug 23 11:37:02 router kernel: eth0: no IPv6 routers present
Aug 23 11:37:03 router kernel: eth1: no IPv6 routers present
Aug 23 11:42:33 router kernel: About to compile this: "^(ymsg|ypns|yhoo).?.?.?.?.?.?.?[lwt].*À/200"
Aug 23 11:42:33 router kernel: About to compile this: "^(ver [ -~]*msnftp^M
Aug 23 11:42:33 router kernel: ver msnftp^M
Aug 23 11:42:33 router kernel: usr|method msnmsgr:)"
Aug 23 11:42:33 router kernel: About to compile this: "ver [0-9]+ msnp[1-9][0-9]? [^I-^M -~]*cvr0^M
Aug 23 11:42:33 router kernel: $|usr 1 [!-~]+ [0-9. ]+^M
Aug 23 11:42:33 router kernel: $|ans 1 [!-~]+ [0-9. ]+^M
Aug 23 11:42:33 router kernel: $"
Aug 23 11:42:33 router kernel: About to compile this: "^[()]...?.?.?(reg|get|query)"
Aug 23 11:42:33 router kernel: About to compile this: "^(1../216|d.+tgp7)"
Aug 23 11:42:33 router kernel: About to compile this: "^.?^B.+^C$"
Aug 23 11:54:42 router kernel: About to compile this: "^(^Sbittorrent protocol|azver^A$|get /scrape/?info_hash=)|d1:ad2:id20:|^H'7p/)[rp]"

请不要在意思,因为这些信息是告诉你,iptables在过滤你所要求的操作在内核中已经启动生效,比如过滤yahoo等...一般是执行 iptables后产生的!

二,同时,如果出现以下的信息:
Aug 23 14:13:19 router kernel: layer7: couldn't get conntrack.
则说明layer7功能早于ipforward命令前执行,请将:
/usr/local/sbin/iptables -t mangle -I PREROUTING -m layer7 --l7proto bittorrent -j DROP
这类命令放在:
/usr/local/sbin/iptables -A POSTROUTING -t nat -s 192.168.0.0/255.255.255.0 -o eth1 -j MASQUERADE
之后!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值