实验环境:

Vmware9虚拟机,CentOS6.5系统,netfilter-layer7-v2.23.tar.bz2

编译新内核的缘由:

新版本的CentOS6.5系统不支持老版本的layer7软件,官方的layer7版本为netfilter-layer7-v2.22.tar.bz2,经修改后的layer7版本为netfilter-layer7-v2.23.tar.bz2,可以支持CentOS6.5版本的系统,但更高版本的系统不支持,如CentOS7,所以修改后的新版layer7可以支持CentOS6.5及以前版本。制作者:马哥教育马永亮老师。

实验步骤:

一,编译安装RedHat官方源码包的内核文件。实验中使用的版本是:kernel-2.6.32-431.11.2.el6.src.rpm

[root@localhost ~]# ls  #在root用户的家目录下准备的安装文件:
anaconda-ks.cfg  install.log  install.log.syslog  kernel-2.6.32-431.11.2.el6.src.rpm netfilter-layer7-v2.23.tar.bz2 iptables-1.4.7-11.el6.src.rpm  l7-protocols-2009-05-28.tar.gz
[root@localhost ~]# rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm 
warning: kernel-2.6.32-431.11.2.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
   1:kernel                 ########################################### [100%]
[root@localhost ~]# ls      ###安装完成后会在当前目录生成rpmbuild目录
anaconda-ks.cfg  install.log.syslog                  mariadb-10.0.12         rpmbuild
install.log      kernel-2.6.32-431.11.2.el6.src.rpm  mariadb-10.0.12.tar.gz
[root@localhost ~]# cd rpmbuild/SOURCES   
[root@localhost SOURCES]# tar xf linux-2.6.32-431.11.2.el6.tar.bz2 -C /usr/src
[root@localhost SOURCES]# cd /usr/src
[root@localhost src]# ln -sv linux-2.6.32-431.11.2.el6/ linux
`linux' -> `linux-2.6.32-431.11.2.el6/'
[root@localhost src]# cd
[root@localhost ~]# tar xf netfilter-layer7-v2.23.tar.bz2 -C /usr/src/
[root@localhost ~]# cd /usr/src
[root@localhost src]# ls
debug  kernels  linux  linux-2.6.32-431.11.2.el6  netfilter-layer7-v2.23
[root@localhost src]# cd netfilter-layer7-v2.23/
[root@localhost netfilter-layer7-v2.23]# ls   ##kernel-2.6.32-lay7-2.23patch是内核的补丁文件。
CHANGELOG                                       kernel-2.6.32-layer7-2.23.patch
[root@localhost netfilter-layer7-v2.23]# cd ../linux
[root@bogon linux]# patch -p1 < ../netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch   ###向内核打补丁
[root@bogon linux]# cp /boot/config-2.6.32-431.el6.x86_64 .config

经过这些步骤后,向新内核打的补丁文件完成,然后开始编译新内核。

[root@bogon linux]# make menuconfig
需要选中的选项是:
Networking support  --->  Networking options  --->  Network packet filtering framework (Netfilter)  --->   Core Netfilter Configuration  --->   "layer7" match support
然后取消RedHat的内核校验功能:
Enable loadable module support  --->  Module signature verification (EXPERIMENTAL)
Cryptographic API  ---> In-kernel signature checker (EXPERIMENTAL)  
开始执行编译安装
[root@bogon linux]# make
[root@bogon linux]# make install

编译安装完成后生成的新内核版本为2.6.32,之前的版本是2.6.32-431.el6.x86_64,重启系统,选择新内核启动。

二、编译安装iptables

[root@bogon ~]# rpm -ivh iptables-1.4.7-11.el6.src.rpm   ###安装后也会生成rpmbuild目录
[root@bogon ~]# cd rpmbuild/SOURCES
[root@bogon SOURCES]# tar xf iptables-1.4.7.tar.bz2  ###将iptables源码包解压出来
[root@bogon SOURCES]# cd iptables-1.4.7
[root@bogon iptables-1.4.7] cp /usr/src/netfilter/iptables-1.4.3forward-for-kernel-2.6.20forward ./extensions   ###向解压出来的iptables源码包目录中添加iptables的补丁文件
[root@bogon iptables-1.4.7] cd ..
[root@bogon SOURCES] rm iptables-1.4.7.tar.bz2  ###删除原来的iptables源码包,使用新的iptables源码包,新的源码包还需要创建成tar.bz2的格式。
[root@bogon SOURCES] tar -jcf iptables-1.4.7.tar.bz2 iptables-1.4.7
[root@bogon SOURCES]# cd ../SPECS/
[root@bogon SPECS]# vim iptables.spec  ###修改rpm包制作的指导文件,添加内容:
./configure --enable-devel --enable-libipq --bindir=/bin --sbindir=/sbin --sysconfdir=/etc --libdir=/%{_lib} --libexecdir=/%{_lib} --mandir=%{_mandir} --includedir=%{_includedir} --with-ksource=/usr/src/linux  ###将编译的选项中指向的内核源码包的位置更改为我们解压缩出来的源码包的位置,同时将iptables的版本改变一下,之前是11,把它提高一个版本为12,同时可以添加其他的信息,制作者信息等等。
Name: iptables
Summary: Tools for managing Linux kernel packet filtering capabilities
Version: 1.4.7
Release: 12%{?dist}
[root@bogon SPECS]# rpmbuild -ba iptables.spec  ###生成iptables的源码rpm包和对应的二进制格式的rpm包
[root@bogon SPECS] cd ..
[root@bogon rpmbuild]# ls   ###可以看到生成了RPMS和SRPMS两个目录
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
[root@bogon rpmbuild]# cd RPMS/x86_64
[root@bogon RPMS]# rpm -Uvh iptables-1.4.7-12.el6.x86_64.rpm iptables-ipv6-1.4.7-12.el6.x86_64.rpm
升级安装iptables后会在/lib/modules/2.6.32/kernel/net/netfilter目录下生成xt_layer7.ko文件

三、安装l7-protocol文件:

[root@localhost ~]# tar xf l7-protocols-2009-05-28.tar.gz 
[root@localhost ~]# cd l7-protocols-2009-05-28
[root@localhost l7-protocols-2009-05-28]# make install
[root@localhost l7-protocols-2009-05-28]# cd /etc/l7-protocols/protocols/   ###该目录下有许多协议用于控制对应的应用程序对网络的访问,其中有QQ,迅雷等等。

四、加载nf_conntrack和layer7模块,设置iptables规则。

[root@bogon ~]# modprobe nf_conntrack
[root@bogon ~]# modprobe xt_layer7
[root@bogon ~]# vim /etc/sysctl.conf   ###添加如下参数:
net.ipv4.ip_forward = 1   ###网卡间转发的功能要打开,否则代理上网的主机无法为客户端转发数据包
net.netfilter.nf_conntrack_acct = 1 ###这个参数可以利用layer7模块对特殊协议的数据报文进行过滤,所以一定要设置,否则layer7加载了也不会生效。
[root@bogon ~]# sysctl -p  ###使修改后的参数立即生效
代理上网的主机需要有两块网卡,一个可以联网,一个用户连接内网客户端,作为内网的网关使用。iptables的规则设置如下:
[root@bogon ~]# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 192.168.227.133
[root@bogon ~]# iptables -A FORWARD -m layer7 --l7proto qq -j REJECT

设置这两项以后如果客户端的主机使用QQ就不能上网了,但如果在局域网内部还需要添加一台DNS服务器,以方便为客户端主机解析外网地址,方便使用浏览器浏览网站,如果需要对其他的软件设置过滤功能,在iptables中添加规则就可以了。