iptables的扩展,layer7实现


l7filter:介绍 


能过滤7层协议,例如过滤QQ、迅雷
原版只支持2.6.28,不支持centos6的2.6.32;马哥的版本支持2.6.32
实现l7filter:
给内核(netfilter)打补丁。下载内核源码打补丁后,重新编译
内核源码从内核官网下载版本2.6.32,与红帽官网的同一版本不同,红帽在其上集成最新驱动
红帽内核源码rpm包内置密钥,如果检测不通过则无法编译,但是我们可以关闭该检测
http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/
kernel-2.6.32-431.11.2.el6.src.rpm
安装此源码包,就解压到当前目录,生成一个编译内核的环境
给iptables打补丁。先卸载iptables的rpm,再下载其源码来打补丁

diff/patch:打补丁的知识


diff是比对旧程序和新程序的源码以便生成补丁的工具
diff [-u] 旧源码 新源码 > 新版本补丁.patch
patch打补丁
单个旧源码文件:
给旧源码打补丁
patch [选项] 旧源码 < 新版本补丁.patch
还原旧源码
patch -R 新源码 < 新版本补丁.patch
多个旧源码文件(有目录层级)
patch -p[num] < 新版本补丁
例如:
a/b/c/d.txt 当前目录下的源码目录中的源码
cd a/b 打补丁的目录,跳过2级目录
patch -p2 < 新版本补丁

rpmbuild [选项] SPECS文件 制作rpm包
-ba 既制作源码包又制作二进制包
-bb 制作二进制包

实验:使用layer7禁止QQ联网


要安装的包

kernel-2.6.32-431.11.2.el6.src.rpm 待打补丁的内核(netfilter)源码
iptables-1.4.7-11.el6.src.rpm 待打补丁的iptables源码
netfilter-layer7-v2.23.tar.bz2 layer7在内核和iptables的源码补丁
l7-protocols-2009-05-28.tar.gz layer7的特征码

实验步骤

第一步.对内核源码打补丁后,编译安装
a.安装kernel源码
uname -r 
useradd mockbuild 添加内核源码安装用户
rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm 注意:会自动解压到当前用户的家目录下
cd ~
cd rpmbuild
SOURCES 源码文件目录
config-x86_64-generic[-rhel] 在不同平台编译的配置文件
相当于当前系统的/boot/config-${内核版本}
linux-${内核版本号}.tar.bz2 红帽的内核源码
解压内核源码
SPECS 制作rpm的指导文件
cd SOURCES
tar xf linux-${内核版本号}.tar.bz2 -C /usr/src
cd /usr/src 
ln -sv linux-${内核版本号} linux
b.给内核源码打补丁
cd ~
tar xf netfilter-layer7-v2.23.tar.bz2 -C /usr/src
cd /usr/src/linux
patch -p1 < ../netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
c.编译安装内核并重启
cp /boot/config-2.6.32-358.el6.x86_64 .config 使用本地的配置模板来编译
make menuconfig
配置内核选项
启用layer7模块,因为源模板没配置该选项
Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration  --->  启用"layer7" match support
关闭模块签名校验和内核签名校验,否则内核编译后无法安装
Enable loadable module support ---> 禁用 Module signature verification (EXPERIMENTAL)
Cryptographic API  ---> 禁用 In-kernel signature checker (EXPERIMENTAL)
为了编译更快,可以去掉一些驱动和不必要的功能。例如硬件驱动、虚拟化等
yum -y install screen
screen 防止编译过程中中断
重新编译:
make help
make mrproper
cp /boot/config-2.6.32-358.el6.x86_64 .config
make menuconfig
.....
make -j 4 利用CPU核心并行编译
make modules_install 
make install
init 6
uname -r
2.6.32 版本号不够长是因为编译时没配置
ls /lib/modules/2.6.32/kernel/net/netfilter/
nf_conntrack.ko xt_layer7.ko 新增的模块依赖于前者,两个模块同时装载才有效

第二步.对iptables打补丁后,编译rpm后安装
a.安装iptables源码
cd ~
rm -fr rpmbuild 安装源码时会重新生成该目录,因此将前面安装内核源码生成的目录删掉
rpm -ivh iptables-1.4.7-11.el6.src.rpm
b.给源码打补丁
cd rpmbuild/SOURCES
tar xf iptables-1.4.7.tar.bz2
cd iptables-1.4.7
cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* extensions/
cd ..
rm iptables-1.4.7.tar.bz2
tar jcf iptables-1.4.7.tar.bz2 iptables-1.4.7
rm -fr iptables-1.4.7
c.编译制作rpm包
cd ../SPECS
vim iptables.spec 修改编译参数,让其基于修改后的内核源码来编译
更改%build区域中的编译值:删除--with-kernel、--with-kbuild选项,修改--with-ksource=/usr/src/linux
./configure --enable-devel --enable-libipq --bindir=/bin --sbindir=/sbin --sysconfdir=/etc --libdir=/%{_lib} --libexecdir=/%{_lib} --mandir=%{_mandir} --includedir=%{_includedir} --with-ksource=/usr/src/linux
修改发行版本号,11改为11.1
Release: 11.1%{?dist} 
添加打包者信息,在Provides:指令后追加
Packager: Tangsw <tsw1107@163.com>
添加修改日志,在%changelog指令后添加
* Sat Dec 5 2015 Tangsw <tsw1107@163.com> 1.4.7-11.1
- add layer7 module
rpmbuild -ba iptables.spec
cd ..;ls 
SOURCES/  SPECS/  SRPMS/ BUILD/  BUILDROOT/  RPMS/  生成了后面4个目录
ls SRPMS  源码rpm包
iptables-1.4.7-11.1.el6.src.rpm 
cd RPMS/x86_64/; ls 二进制rpm包
iptables-1.4.7-11.1.el6.x86_64.rpm           v4版本包
iptables-ipv6-1.4.7-11.1.el6.x86_64.rpm      v6版本包
iptables-devel-1.4.7-11.1.el6.x86_64.rpm     devel包
iptables-debuginfo-1.4.7-11.1.el6.x86_64.rpm
d.安装rpm包
rpm -qi iptables 查看本地版本
rpm -Uvh iptables-1.4.7-11.1.el6.x86_64.rpm iptables-ipv6-1.4.7-11.1.el6.x86_64.rpm 升级新版本
rpm -qa | grep iptables
iptables-1.4.7-11.1.el6.x86_64
iptables-ipv6-1.4.7-11.1.el6.x86_64
rpm -ql iptables | grep layer7
/lib64/xtables/libxt_layer7.so
第三步.安装layer7的特征码
tar xf l7-protocols-2009-05-28.tar.gz
cd l7-protocols-2009-05-28
make install
ls /etc/l7-protocols/protocols 
kugoo.pat、qq.pat、pplive.pat、xunlei.pat



第四步.配置测试环境
NAT服务器:
外网IP:192.168.8.15
内网IP:192.168.56.15
DNS: 192.168.8.1
内网客户端:
IP:192.168.56.16
GW: 192.168.56.15
DNS: 192.168.8.1
a.以编译后的新内核启动

b.配置NAT服务器
开启forward内核参数
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
添加nat规则,在内网通过nat服务器上外网
iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j SNAT --to-source 192.168.8.15
添加filter规则,禁止qq连线,添加前先加载layer7相关模块,并设置参数
modprobe nf_conntrack
modprobe xt_layer7
sysctl -a | grep nf_conntrack
vim /etc/sysctl.conf
net.netfilter.nf_conntrack_acct=1
sysctl -p
iptables -t filter -A FORWARD -s 192.168.56.0/24 -m layer7 --l7proto qq -j REJECT


第五部.测试
192.168.56.16主机能访问网页,但不能上QQ




posted @ 2014-11-24 14:02  tsw1107  阅读(654)  评论(0编辑  收藏  举报