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

iptables的扩展,layer7实现的更多相关文章

  1. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网

    iptables防火墙扩展之layer7应用层访问控制 概述: iptables防火墙是工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙.以基于网络层的数据包过滤机制为主,同 ...

  2. iptables的扩展匹配

    iptables的匹配条件 一.通用匹配:-s.-d.-p.-i.-o 二.扩展匹配 1.隐含扩展:使用-p{tcp|udp|icmp}指定某特定协议后,自动能够对协议进行扩展 -p tcp --dp ...

  3. Linux防火墙之iptables常用扩展匹配条件(一)

    上一篇博文讲了iptables的基本匹配条件和隐式匹配条件,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12269717.html:今天在来说说iptabel ...

  4. Linux防火墙之iptables常用扩展匹配条件(二)

    上一篇博文我们讲到了iptables的一些常用的扩展匹配模块以及扩展模块的一些选项的说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12273755.htm ...

  5. Linux防火墙之iptables扩展处理动作

    前文我们讲了iptables的扩展匹配,一些常用的扩展模块以及它的专有选项的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12285152.html ...

  6. iptables详解--转

    出处:http://yijiu.blog.51cto.com/433846/1356254 iptables详解 基本概念: 1.防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定 ...

  7. iptables一次性封多个ip,使用ipset 工具

    ipset是什么? ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则.而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也 ...

  8. iptables参数详解

    iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...

  9. Iptables 规则 一些简单实例和详细介绍

    设定规则 iptables -p INPUT DROP iptables -p OUTPUT ACCEPT iptables -p FORWARD DROP 1.防止外网用内网IP欺骗 iptable ...

随机推荐

  1. ES6中的迭代器(Iterator)和生成器(Generator)(一)

    用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...

  2. PC-LINT

    静态代码检查工具PC-Lint(一) 2006-12-07 23:50   C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应增加了代码中存在隐患的可能性.静态代码 ...

  3. Java6 WebService的发布

    Java6 WebService的发布   WebService服务发布往往比较混乱,Axis2的发布形式与XFire发布方式差别很大,而Java6 Web服务的发布与Axis2.XFire的Web服 ...

  4. Java源码阅读Vector

    1类签名与注释 public class Vector<E> extends AbstractList<E> implements List<E>, RandomA ...

  5. iOS小技巧 - 为按钮设置不同状态下的背景色

    我们知道直接在Storyboard中设置按钮的背景色是不能根据不同状态来更改的,那问题来了,如果我们需要在不同的状态下(比如按钮没有被按下或者被按下),使得按钮呈现不同的背景色怎么办? 比如上图左边是 ...

  6. Elasticsearch 的 Update更新

    Update更新操作允许ES获得某个指定的文档,可以通过脚本等操作对该文档进行更新.可以把它看成是先删除再索引的原子操作,只是省略了返回的过程,这样即节省了来回传输的网络流量,也避免了中间时间造成的文 ...

  7. session的两个小案例

    学完了session,写两个小案例加深一下对session的巩固. 1. 用户登陆案例 登陆html页面提交后,将参数带给处理登陆的servlet,该servlet将获得登陆的用户名和密码,并将这些信 ...

  8. 使用ALAssetsLibrary读取所有照片

    一. ALAssetsLibrary 介绍 ALAssetsLibrary 提供了访问iOS设备下”照片”应用下所有照片和视频的接口: 从 ALAssetsLibrary 中可读取所有的相册数据,即  ...

  9. Devops成功的八大炫酷工具

    原文链接:http://www.infoworld.com/article/3031009/devops/8-more-cool-tools-for-devops-success.html 为自动化和 ...

  10. Android中常用布局单位

    Android在UI布局时经常用到一些单位,对单位混用直接会影响UI的显示,要想正确的在布局中使用每种单位就必须先真正的熟悉它. UI显示效果的影响因素:屏幕尺寸.屏幕密度.分辨率:而android手 ...