1.目前官方的layer只支持到2.6.22内核的版本,所以想要在更新版本的内核使用layer就得自己修改layer的源码了.这里不做介绍

在redhat rpm包在安装的时候都依赖一个mockbuild的用户,所以首先创建这个用户,然后去安装

[root@station142 ~]# groupadd mockbuild
[root@station142 ~]# useradd -g mockbuild mockbuild
[root@station142 ~]#  rpm -ivh kernel-2.6.32-431.5.1.el6.src.rpm
warning: kernel-2.6.32-431.5.1.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
1:kernel                 ########################################### [100%]

安装完成后,在用户的家目录下的rpmbuild/SOURCES/ 会生成安装后的源码

[root@station142 ~]# cd rpmbuild/SOURCES/
[root@www SOURCES]# ll linux-2.6.32-431.5.1.el6.tar.bz2
-rw-rw-r--. 1 mockbuild mockbuild 92608285 Jan 11 03:21 linux-2.6.32-431.5.1.el6.tar.bz2

·解压内核源码,获取redhat特制的源码

[root@www SOURCES]# tar xf linux-2.6.32-431.5.1.el6.tar.bz2 -C /usr/src
[root@www SOURCES]# cd /usr/src
[root@www src]# ls
debug  kabi-rhel60  kabi-rhel61  kabi-rhel62  kabi-rhel63  kabi-rhel64  kabi-rhel65  kernels  linux-2.6.32-431.5.1.el6
[root@www src]# ln -sv linux-2.6.32-431.5.1.el6/ linux

·拷贝内核编译的模板,大家还记得,每次装完系统后,都会在/boot/config-**生成当前内核的配置信息吧.

[root@www linux]# cp /boot/config-2.6.32-358.el6.x86_64 /usr/src/linux/.config

·下载layer7并打补丁

lftp 172.16.0.1:/pub/Sources/sources/iptables> get netfilter-layer7-v2.23.tar.bz2
22754 bytes transferred
lftp 172.16.0.1:/pub/Sources/sources/iptables> bye
[root@www data]# tar netfilter-layer7-v2.23.tar.bz2
[root@www linux]# patch -p1 < /root/data/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch   #打补丁

·配置内核

·

---> Networking support
---> Networking options
---> Network packet filtering framework (Netfilter)
---> Core Netfilter Configuration
---> <M>   "layer7" match support  #把这一项打开

·

---> Networking support
---> Networking options
---> Network packet filtering framework (Netfilter)
---> IP: Netfilter Configuration
---> <M> IPv4 connection tracking support (required for NAT)  #确保这一项启用了

·红帽为了防止盗版,会在内核源码编译时做签名检查(使用hash码检查源文件,我们做过改动了),所以这里要关闭检查密钥的功能

---> Enable loadable module support
--->  [ ]   Module signature verification (EXPERIMENTAL)  #禁用这一项

---> Cryptographic API
---> [ ]   In-kernel signature checker (EXPERIMENTAL)  #关闭此模块,此模块是检查各项签名的,我们在编译的时候没有签名,所以这项得关闭

·为了区别其他版本的,我们给自己编译的这个内核加上版本信息

---> General setup
---> (-layer7) Local version - append to kernel release  #加上版本信息

·为了能在后台编译,我们使用screen

[root@www linux]# yum -y install screen
[root@www linux]# screen  #就算断开了也不受影响
[root@www linux]# make -j 4

·安装内核模块

[root@www linux]# make modules_install   #安装模块???忘记是干嘛的了
[root@www linux]# make install           #安装

·重启系统并启用新内核

[root@www ~]# uname -r   #查看是否是新内核
2.6.32-layer7


·编译iptables

·解压iptables,并为iptables的源码打补丁

[root@www data]# tar xf iptables-1.4.20.tar.bz2
[root@www data]# cd /netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward
[root@www iptables-1.4.3forward-for-kernel-2.6.20forward]# cp libxt_layer7.* /root/data/iptables-1.4.20/extensions/    #这就是打补丁

·备份原有的iptables配置文件

[root@www ~]# service iptables stop   #停止iptables
[root@www ~]# cp /etc/rc.d/init.d/iptables /root/data/  #备份配置文件
[root@www ~]# cp /etc/sysconfig/iptables-config /root/data  #备份配置文件

·卸载原有的iptables

[root@www ~]# rpm -qa | grep iptables  #首先查看
iptables-ipv6-1.4.7-9.el6.x86_64
iptables-1.4.7-9.el6.x86_64
[root@www ~]# rpm -e iptables iptables-ipv6 --nodeps  #防止依赖卸不掉,使用--nodeps

·编译iptables,这一步要新系统启动后才能开始

[root@www ~]# uname -r    #这是新系统,可以开始了
2.6.32-layer7
[root@www ~]# cd data/iptables-
iptables-1.4.20/         iptables-1.4.20.tar.bz2  iptables-config
[root@www ~]# cd data/iptables-1.4.20
[root@www iptables-1.4.20]# ./configure --prefix=/usr --with-ksource=/usr/src/linux     #安装路径为/usr,--with指定内核源码位置???
[root@www iptables-1.4.20]# make && make install  #安装

·恢复之前备份的iptables文件,修改iptables的配置文件的路径

[root@www iptables-1.4.20]# cp /root/data/iptables /etc/rc.d/init.d/
[root@www iptables-1.4.20]# cp /root/data/iptables-config /etc/sysconfig/
[root@www iptables-1.4.20]# iptables -L -nv   #尝试使用iptables命令
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
...
[root@www iptables-1.4.20]# vim /etc/rc.d/init.d/iptables  #修改路径为你安装时的路径

wKiom1M_yGrwP28UAABaiM03WQQ027.jpg

·查看iptables的版本号

[root@www iptables-1.4.20]# iptables -V    #可以看到是我们自己编译的
iptables v1.4.20


·安装l7-protocols,为layer7模块提供其能所识别的协议特征码

[root@www data]# tar xf l7-protocols-2009-05-28.tar.gz
[root@www data]# cd l7-protocols-2009-05-28
[root@www l7-protocols-2009-05-28]# make install  #安装
mkdir -p /etc/l7-protocols
cp -R * /etc/l7-protocols
[root@www protocols]# cd /etc/l7-protocols/protocols/ #到这个目录下查看他可以限制的协议
[root@www protocols]# ls
...
battlefield2142.pat       halflife2-deathmatch.pat  pplive.pat          telnet.pat
battlefield2.pat          hddtemp.pat               qq.pat              tesla.pat
...

·使用layer7模块前准备:启用net.netfilter.nf_conntrack_acct=1

[root@www iptables-1.4.20]# vim /etc/sysctl.conf  #编辑这个文件可以使??永久生效,忘记了??
net.netfilter.nf_conntrank_acct = 1               #在最后一行添加这一条

·让sysctl重新生效

[root@www iptables-1.4.20]# sysctl -p                         #重新加载sysctl
...
error: "net.netfilter.nf_conntrank_acct" is an unknown key    #最后这里会报这个错,是因为我们要加载某一连接追踪的模块才能启用acct模块,nf_conntrack
[root@www iptables-1.4.20]# modprobe nf_conntrack             #加载一模块??也忘了..囧
[root@www iptables-1.4.20]# sysctl -p                         #在加载一次
...
net.netfilter.nf_conntrack_acct = 1                           #可以看到成功了


·答题的环境都搭好了,现在开始测试了,下面的服务器IP打错了,应该是172.16.1.1

wKioL1NAG6PzO7BsAAC_GHIWpZM805.jpg

·添加一条iptables规则,让A可以通过B连上互联网

[root@www ~]# sysctl -w net.ipv4.ip_forward=1 #临时开启转发功能
[root@www ~]# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.1.110

·使用A主机登录QQ

wKioL1NAHS3i11LMAAHiEtIy198911.jpg

·

[root@www ~]# iptables -A FORWARD  -m layer 7 --l7proto qq -j REJECT
iptables: No chain/target/match by that name.   #添加失败???原因是我没有设置开机自动启动新的内核版本,在老的版本上弄了好久,错了

·添加拒绝登录QQ的规则

wKioL1NCqLyBXaxIAAJn6oZ4sZk612.jpg