整体实现过程
1、添加内核补丁,重新编译内核,重启系统并以新内核引导系统
2、给下载的iptables打补丁,并重新制作成rpm包安装
3、安装i7-protocols协议包
4、使用iptables命令设置应用层过滤规则
系统与iptables版本:
1.
######系统版本CentOS_6.4
2.
[root@localhost ~]
# uname -sr
3.
Linux 2.6.32-358.el6.x86_64
4.
######防火墙版本
5.
[root@localhost ~]
# rpm -qa | grep iptables
6.
iptables-1.4.7-9.el6.x86_64
7.
iptables-ipv6-1.4.7-9.el6.x86_64
安装编译环境:
1.
[root@localhost ~]
# yum -y groupinstall "Development tools" "Server Platform Development"
解压并编译内核
01.
######添加安装src格式的软件包需要的用户
02.
[root@localhost ~]
# useradd mockbuild
03.
######安装内核会在当前用户目录下生成一个rpmbuild目录,而目录中有我们需要源码格式的内核文件
04.
[root@localhost ~]
# rpm -ivh kernel-2.6.32-358.el6.src.rpm
05.
warning: kernel-2.6.32-358.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
06.
1:kernel
########################################### [100%]
07.
######解压缩内核文件
08.
[root@localhost ~]
# tar xf rpmbuild/SOURCES/linux-2.6.32-358.el6.tar.bz2 -C /usr/src/
09.
######解压缩layer7
10.
[root@localhost ~]
# tar xf netfilter-layer7-v2.23.tar.gz -C /usr/src/
11.
######切换目录为内核创建软链接,也可以重命名为linux;建议创建链接文件
12.
[root@localhost ~]
# cd /usr/src/
13.
[root@localhost src]
# ln -sv linux-2.6.32-358.el6 linux
14.
"linux"
-&
gt
;
"linux-2.6.32-358.el6"
15.
######切换到内核目录为内核打补丁
16.
[root@localhost src]
# cd linux
17.
[root@localhost linux]
# patch -p1 < ../netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
18.
######打补丁提示信息
19.
patching
file
net/netfilter/Kconfig
20.
Hunk
#1 succeeded at 894 (offset 99 lines).
21.
patching
file
net/netfilter/Makefile
22.
Hunk
#1 succeeded at 96 (offset 12 lines).
23.
patching
file
net/netfilter/xt_layer7.c
24.
patching
file
net/netfilter/regexp/regexp.c
25.
patching
file
net/netfilter/regexp/regexp.h
26.
patching
file
net/netfilter/regexp/regmagic.h
27.
patching
file
net/netfilter/regexp/regsub.c
28.
patching
file
net/netfilter/nf_conntrack_core.c
29.
Hunk
#1 succeeded at 201 with fuzz 1.
30.
patching
file
net/netfilter/nf_conntrack_standalone.c
31.
Hunk
#1 succeeded at 171 with fuzz 2 (offset 6 lines).
32.
patching
file
include/net/netfilter/nf_conntrack.h
33.
Hunk
#1 succeeded at 116 (offset -2 lines).
34.
patching
file
include/linux/netfilter/xt_layer7.h
35.
######拷贝当前系统的config编译配置文件为模板编译内核
36.
[root@localhost linux]
# cp /boot/config-2.6.32-358.el6.x86_64 /usr/src/linux/.config
37.
######配置内核参数
38.
[root@localhost linux]
# make menuconfig
配置内核参数
按方向键"↑ ↓"选择内核参数,以"--->"结尾的表示还有子选项,按回车键进入子选项; "← →"选择菜单项;"Tab"键切换到菜单项
空格键选择内核编译类型:
执行完"make menuconfig"命令后会进入内核编辑模式,紫色表示选中,按回车进入下一级菜单;如下图1:
【图1】
【图2】选中的内核参数,按回车键进入下一级菜单:
【图2】
【图3】选中的内核参数,按回车键进入下一级菜单:
【图3】
【图4】选中的内核参数,按回车键进入下一级菜单:
【图4】
【图5】选中的内核参数,按"空格键"选择为"<M>"表示编译成内核模块,启用这一项表示让内核支持7层过虑功能:
【图5】
【图5】选择"Exit"菜单项退回到"【图1】"模式:
选择"【图6】"选中的内核参数,按回车键进入下一级菜单:
【图6】
取消【图7】选中的内核参数,不编译此项功能:
【图7】
【图7】中选择"Exit"菜单项退回到【图6】模式,选中【图8】内核参数,按回车键进入下一级菜单:
【图8】
取消【图9】选中的内核参数,不编译此项功能:
【图9】
选择"Exit"菜单项,直至出现【图10】中提示,选择"Yes"保存并退出:
【图10】
注释:【图6】到【图9】不编译那两项内核参数的原因是因为,我们是从红帽下载的最新的内核文件,虽然版本看着像是有点老,但这是红帽一惯的命名风格,其实内核文件中包含了目前最新内核的新特性;而netfilter-layer7并不支持新的内核,于是就改了netfilter-layer7文件让它支持新的内核;从红帽官方下载的内核文件在编译时需要密钥验证,我们又没有密钥,所以就去掉上面那两项内核参数,在编译时不让检查密钥验证,这样我们就能顺利的编译安装通过了。而netfilter-layer7文件点上面的链接可以直接下载,我已上传到51cto上面,但是在下载前需要登录51cto;当然如果不使用这里的netfilter-layer7,从官方网站下载也可以,但是那就要下载老一点版本的内核了,其他做法都是一样的
开始编译安装内核
1.
######执行下面命令编译安装内核,与平时安装源码包的方式不尽相同,编译内核是个漫长的过程,根据电脑性能不同编译的时间也不尽相同,但至少也要30分钟左右
2.
[root@localhost linux]
# make
3.
[root@localhost linux]
# make modules_install
4.
[root@localhost linux]
# make install
编译安装完成后重启系统,在grup引导菜单中选择新编译的内核启动系统:
至此我们终于把内核成功编译安装完成了,下面开始对iptables包打补丁并制作成rpm包进行升级:
01.
######切换到/root目录下并重命名安装内核时生成的rpmbuild目录免得覆盖
02.
[root@localhost linux]
# cd /root
03.
[root@localhost ~]
# mv rpmbuild rpmbuild.bak
04.
######安装iptables
05.
[root@localhost ~]
# rpm -ivh iptables-1.4.7-9.el6.src.rpm
06.
warning: iptables-1.4.7-9.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
07.
1:iptables
########################################### [100%]
08.
######安装完成会生成rpmbuild目录,这个目录下有我们需要的iptables源码包
09.
[root@localhost ~]
# cd rpmbuild/SOURCES/
10.
######解压缩源码包
11.
[root@localhost SOURCES]
# tar xf iptables-1.4.7.tar.bz2
12.
######切换到刚解压的源码包内为iptables打补丁
13.
[root@localhost SOURCES]
# cd iptables-1.4.7/extensions/
14.
[root@localhost extensions]
# cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./
15.
######退回到SOURCES目录删除iptables源码包
16.
[root@localhost extensions]
# cd ../../
17.
[root@localhost SOURCES]
# rm -rf iptables-1.4.7.tar.bz2
18.
######对打过补丁的iptables重新打包压缩
19.
[root@localhost SOURCES]
# tar jcf iptables-1.4.7.tar.bz2 iptables-1.4.7/*
20.
######已经做好了打好补丁的源码包可以删除iptables目录了
21.
[root@localhost SOURCES]
# rm -rf iptables-1.4.7
22.
######切换到rpmbuild/SPECS目录
23.
[root@localhost SOURCES]
# cd ../SPECS/
24.
######打开spce文件修改其内容
25.
[root@localhost SPECS]
# vim iptables.spec
26.
######下面修改为10%,因为iptables与我们系统使用的版本相同所以不能升级安装,在这里修改一下也就是升级了一个版本这样我们就容易升级安装了
27.
Release: 10%{?dist}
28.
Packager: ALLEN
######这项可以不用加入,用来显示签名的
29.
######最后三项要修改成新内核的路径,修改完成可以保存退出了
30.
./configure --
enable
-devel --
enable
-libipq --bindir=/bin --sbindir=/sbin --sysconfdir=/etc --libdir=/%{_lib} --libexecdir=/%{_lib} --mandir=%{_mandir} --includedir=%{_includedir} --with-xtlibdir=/%{_lib}/xtables-%{version} --with-kernel=/usr/src/linux --with-kbuild=/usr/src/linux --with-ksource=/usr/src/linux
31.
######开始制作rpm包
32.
[root@localhost SPECS]
# rpmbuild -bb iptables.spec
升级安装iptables:
01.
######切换目录并查看生成了哪些文件
02.
[root@localhost SPECS]
# cd ../RPMS/x86_64/
03.
[root@localhost x86_64]
# ls
04.
iptables-1.4.7-10.el6.x86_64.rpm iptables-devel-1.4.7-10.el6.x86_64.rpm
05.
iptables-debuginfo-1.4.7-10.el6.x86_64.rpm iptables-ipv6-1.4.7-10.el6.x86_64.rpm
06.
######升级安装iptables,由于当前系统安装了下面两个包,所以这里只需要安装下面两个包即可
07.
[root@localhost x86_64]
# rpm -Uvh iptables-1.4.7-10.el6.x86_64.rpm iptables-ipv6-1.4.7-10.el6.x86_64.rpm
08.
Preparing...
########################################### [100%]
09.
1:iptables
########################################### [ 50%]
10.
2:iptables-ipv6
########################################### [100%]
安装协议扩展包:
01.
######切换到协议包所在位置
02.
[root@localhost x86_64]
# cd /root
03.
######解压缩l7-protocols协议包
04.
[root@localhost ~]
# tar xf l7-protocols-2009-05-28.tar.gz
05.
######切换目录并安装协议扩展包
06.
[root@localhost ~]
# cd l7-protocols-2009-05-28
07.
[root@localhost l7-protocols-2009-05-28]
# make install
08.
mkdir
-p /etc/l7-protocols
09.
cp
-R * /etc/l7-protocols
QQ:腾讯公司QQ程序的通讯协议
msnmessenger:微软公司MSN程序的通讯协议
msn-filetransfer:MSN程序的文件传输协议
xunlei:迅雷下载工具使用的协议
其他应用层协议:http、ftp、dns、imap、pop3等
下面我们以一个案例来设置iptables的7层过滤规则,如下图:
说明:Client为虚拟机,系统:Windows XP 网卡:Vmnet2
Iptables为虚拟机,系统:Centos6.4_x86_64 网上:eth1为内网的网关使用网上类型为VMnet2;eth0为外网IP使用网卡类型为桥接
案例描述:在Iptables服务器上面做7层防火墙过虑限制客户端不能上QQ、用迅雷下载数据
1、在Iptables Server上开启路由转发功能:
1.
[root@localhost ~]
# vim /etc/sysctl.conf
2.
net.ipv4.ip_forward = 1
3.
[root@localhost ~]
# sysctl -p #执行此命令让其生效
2、查看nf_conntrack模块是否加载:
1.
[root@localhost ~]
# lsmod | grep -w nf_conntrack
2.
nf_conntrack 79485 6 xt_layer7,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
3、查看内核连接追踪功能是否开启:
01.
[root@localhost ~]
# sysctl -a | grep acct
02.
kernel.acct = 4 2 30
03.
######如果下面值为0,修改为1
04.
net.netfilter.nf_conntrack_acct = 1
05.
######打开下面文件加入到里面执行如下命令即可生效
06.
[root@localhost ~]
# vim /etc/sysctl.conf
07.
net.netfilter.nf_conntrack_acct = 1
08.
[root@localhost ~]
# sysctl -p
09.
######也可使用此项命令修改,但一重启系统便会失效
10.
[root@localhost ~]
# sysctl -w net.netfilter.nf_conntrack_acct=1
4、添加一条SNAT规则参实现让内网访问外部网络:
1.
[root@localhost ~]
# iptables -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.14.1
设置规则:拒绝QQ登录与使用迅雷下载
1.
[root@localhost ~]
# iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto qq -j DROP
2.
[root@localhost ~]
# iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto xunlei -j DROP
验证如下图:
查看防火墙匹配规则是否匹配到数据流量,如下图:
到此终于把Iptables防火墙完美结局了,如果博友们做的过程中遇到问题,可以留言,会第一时间回复...