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. IntelliJ IDEA和pycharm注册码

    BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  2. 【共享单车】—— React后台管理系统开发手记:项目工程化开发

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  3. Redis缓存清理

    Redis缓存清理 学习了:https://www.cnblogs.com/ZnCl/p/7116870.html 使用 redis-cli.exe登录, 使用flushall 命令: 或者key * ...

  4. java int转String全部方式的效率对照与深入解析

    在java中,大家肯定都会遇到int类型转String类型的情形,知其然知其所以然.总结加分析一下,int类型转String类型有下面几种方式: a+"" String.value ...

  5. 迭代器适配器(一)back_inserter和front_inserter的实现

    本文讨论back_inserter和front_inserter的实现. 当我们调用copy函数的时候,要确保目标容器具有足够大的空间,例如: //将other的所有元素拷贝到以coll.begin( ...

  6. Python——五分钟理解元类(metaclasses)

    “元类的魔幻变化比 99% 的用户所担心的更多,当你搞不懂是否真的需要用它的时候,就是不需要.” —Tim Peters 本文源于在 PyCon UK 2008 上的一个快速演讲. 元类被称为 Pyt ...

  7. Odoo12 重大改变

    Table of Contents 重构的功能 ORM 数据导入 库存 库存规则 MRP 多步路线 新功能 IoT     Odoo12 预计 2018/10 在 Odoo experience 20 ...

  8. 杂(三)-The type java.lang.Object cannot be resolved It is indirectly referenced ...

    The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files ...

  9. 如何在aspx页面中使用ascx控件(用户自定义的一个控件)?

    aspx是页面文件ascx是用户控件,用户控件必须嵌入到aspx中才能使用. ascx是用户控件,相当于模板 其实ascx你可以理解为Html里的一部分代码,只是嵌到aspx里而已,因为aspx内容多 ...

  10. SQL:OUTER JOIN使用方法具体解释

    SQL--JOIN使用方法 外联接. 外联接能够是左向外联接.右向外联接或完整外部联接.  在 FROM 子句中指定外联接时,能够由下列几组keyword中的一组指定: LEFT JOIN 或 LEF ...