编译内核实现iptables防火墙layer7应用层过滤 (三)

时间:2022-09-05 11:59:00

在前面的两篇文章中我们主要讲解了Linux防火墙iptables的原理及配置规则,想博友们也都知道iptables防火墙是工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。以基于网络层的数据包过滤机制为主,同时提供少量的传输层、数据链路层的过滤功能。难以判断数据包对应于何种应用程序(如:QQ、迅雷等)

安装netfilter-layer7补丁包的作用是为Linux内核、iptables添加相应的补丁文件,重新编译安装后提供基于应用层(第7层)的扩展功能。通过独立的l7-protocols协议包提供对各种应用层协议的特征识别与定义,便于更新

整体实现过程

1、添加内核补丁,重新编译内核,重启系统并以新内核引导系统

2、给下载的iptables打补丁,并重新制作成rpm包安装

3、安装i7-protocols协议包

4、使用iptables命令设置应用层过滤规则

需求描述

1、重新编译Linux内核,添加l7-filter应用层过滤补丁

2、重新编译iptables,添加l7-filter应用层过滤补丁

3、设置过滤规则,禁止使用QQ、MSN等聊天工具

4、设置过滤规则,禁止使用迅雷、电驴等下载工具

使用的软件包列表:

Linux内核源码包:kernel-2.6.32-358.el6.src.rpm       点此下载

iptables源码包:iptables-1.4.7-9.el6.src.rpm         点此下载

layer7补丁包源码包:netfilter-layer7-v2.23.tar.gz    博客附件

协议定义包:l7-protocols-2009-05-28.tar.gz           点此下载


系统与iptables版本:

1
2
3
4
5
6
7
######系统版本CentOS_6.4
[root@localhost ~]# uname -sr
Linux 2.6.32-358.el6.x86_64
######防火墙版本
[root@localhost ~]# rpm -qa | grep iptables
iptables-1.4.7-9.el6.x86_64
iptables-ipv6-1.4.7-9.el6.x86_64

安装编译环境:

1
[root@localhost ~]# yum -y groupinstall "Development tools" "Server Platform Development"

解压并编译内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
######添加安装src格式的软件包需要的用户
[root@localhost ~]# useradd mockbuild
######安装内核会在当前用户目录下生成一个rpmbuild目录,而目录中有我们需要源码格式的内核文件
[root@localhost ~]# rpm -ivh kernel-2.6.32-358.el6.src.rpm
warning: kernel-2.6.32-358.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
   1:kernel                 ########################################### [100%]
######解压缩内核文件
[root@localhost ~]# tar xf rpmbuild/SOURCES/linux-2.6.32-358.el6.tar.bz2 -C /usr/src/
######解压缩layer7
[root@localhost ~]# tar xf netfilter-layer7-v2.23.tar.gz -C /usr/src/
######切换目录为内核创建软链接,也可以重命名为linux;建议创建链接文件
[root@localhost ~]# cd /usr/src/
[root@localhost src]# ln -sv linux-2.6.32-358.el6 linux
"linux" -> "linux-2.6.32-358.el6"
######切换到内核目录为内核打补丁
[root@localhost src]# cd linux
[root@localhost linux]# patch -p1 < ../netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
######打补丁提示信息
patching file net/netfilter/Kconfig
Hunk #1 succeeded at 894 (offset 99 lines).
patching file net/netfilter/Makefile
Hunk #1 succeeded at 96 (offset 12 lines).
patching file net/netfilter/xt_layer7.c
patching file net/netfilter/regexp/regexp.c
patching file net/netfilter/regexp/regexp.h
patching file net/netfilter/regexp/regmagic.h
patching file net/netfilter/regexp/regsub.c
patching file net/netfilter/nf_conntrack_core.c
Hunk #1 succeeded at 201 with fuzz 1.
patching file net/netfilter/nf_conntrack_standalone.c
Hunk #1 succeeded at 171 with fuzz 2 (offset 6 lines).
patching file include/net/netfilter/nf_conntrack.h
Hunk #1 succeeded at 116 (offset -2 lines).
patching file include/linux/netfilter/xt_layer7.h
######拷贝当前系统的config编译配置文件为模板编译内核
[root@localhost linux]# cp /boot/config-2.6.32-358.el6.x86_64 /usr/src/linux/.config
######配置内核参数
[root@localhost linux]# make menuconfig

配置内核参数

按方向键"↑ ↓"选择内核参数,以"--->"结尾的表示还有子选项,按回车键进入子选项; "← →"选择菜单项;"Tab"键切换到菜单项

空格键选择内核编译类型:

[ ]:空选型表示不需要再新内核中使用该功能。

[M]:表示将此项功能编译为模块,以便在需要时加载。

[*]:将此功能直接编入新内核,作为内核的一部分。

执行完"make menuconfig"命令后会进入内核编辑模式,紫色表示选中,按回车进入下一级菜单;如下图1:

【图1】

编译内核实现iptables防火墙layer7应用层过滤 (三)

【图2】选中的内核参数,按回车键进入下一级菜单:

【图2】

编译内核实现iptables防火墙layer7应用层过滤 (三)

【图3】选中的内核参数,按回车键进入下一级菜单:

【图3】

编译内核实现iptables防火墙layer7应用层过滤 (三)

【图4】选中的内核参数,按回车键进入下一级菜单:

【图4】

编译内核实现iptables防火墙layer7应用层过滤 (三)

【图5】选中的内核参数,按"空格键"选择为"<M>"表示编译成内核模块,启用这一项表示让内核支持7层过虑功能:

【图5】

编译内核实现iptables防火墙layer7应用层过滤 (三)

【图5】选择"Exit"菜单项退回到"【图1】"模式:

选择"【图6】"选中的内核参数,按回车键进入下一级菜单:

【图6】

编译内核实现iptables防火墙layer7应用层过滤 (三)

取消【图7】选中的内核参数,不编译此项功能:

【图7】

编译内核实现iptables防火墙layer7应用层过滤 (三)

【图7】中选择"Exit"菜单项退回到【图6】模式,选中【图8】内核参数,按回车键进入下一级菜单:

【图8】

编译内核实现iptables防火墙layer7应用层过滤 (三)

取消【图9】选中的内核参数,不编译此项功能:

【图9】

编译内核实现iptables防火墙layer7应用层过滤 (三)

选择"Exit"菜单项,直至出现【图10】中提示,选择"Yes"保存并退出:

【图10】

编译内核实现iptables防火墙layer7应用层过滤 (三)

注释:【图6】到【图9】不编译那两项内核参数的原因是因为,我们是从红帽下载的最新的内核文件,虽然版本看着像是有点老,但这是红帽一惯的命名风格,其实内核文件中包含了目前最新内核的新特性;而netfilter-layer7并不支持新的内核,于是就改了netfilter-layer7文件让它支持新的内核;从红帽官方下载的内核文件在编译时需要密钥验证,我们又没有密钥,所以就去掉上面那两项内核参数,在编译时不让检查密钥验证,这样我们就能顺利的编译安装通过了。而netfilter-layer7文件点上面的链接可以直接下载,我已上传到51cto上面,但是在下载前需要登录51cto;当然如果不使用这里的netfilter-layer7,从官方网站下载也可以,但是那就要下载老一点版本的内核了,其他做法都是一样的

开始编译安装内核

1
2
3
4
######执行下面命令编译安装内核,与平时安装源码包的方式不尽相同,编译内核是个漫长的过程,根据电脑性能不同编译的时间也不尽相同,但至少也要30分钟左右
[root@localhost linux]# make
[root@localhost linux]# make modules_install
[root@localhost linux]# make install

编译安装完成后重启系统,在grup引导菜单中选择新编译的内核启动系统:

编译内核实现iptables防火墙layer7应用层过滤 (三)

至此我们终于把内核成功编译安装完成了,下面开始对iptables包打补丁并制作成rpm包进行升级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
######切换到/root目录下并重命名安装内核时生成的rpmbuild目录免得覆盖
[root@localhost linux]# cd /root
[root@localhost ~]# mv rpmbuild rpmbuild.bak
######安装iptables
[root@localhost ~]# rpm -ivh iptables-1.4.7-9.el6.src.rpm
warning: iptables-1.4.7-9.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
   1:iptables               ########################################### [100%]
######安装完成会生成rpmbuild目录,这个目录下有我们需要的iptables源码包
[root@localhost ~]# cd rpmbuild/SOURCES/
######解压缩源码包
[root@localhost SOURCES]# tar xf iptables-1.4.7.tar.bz2
######切换到刚解压的源码包内为iptables打补丁
[root@localhost SOURCES]# cd iptables-1.4.7/extensions/
[root@localhost extensions]# cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./
######退回到SOURCES目录删除iptables源码包
[root@localhost extensions]# cd ../../
[root@localhost SOURCES]# rm -rf iptables-1.4.7.tar.bz2
######对打过补丁的iptables重新打包压缩
[root@localhost SOURCES]# tar jcf iptables-1.4.7.tar.bz2 iptables-1.4.7/*
######已经做好了打好补丁的源码包可以删除iptables目录了
[root@localhost SOURCES]# rm -rf iptables-1.4.7
######切换到rpmbuild/SPECS目录
[root@localhost SOURCES]# cd ../SPECS/
######打开spce文件修改其内容
[root@localhost SPECS]# vim iptables.spec
######下面修改为10%,因为iptables与我们系统使用的版本相同所以不能升级安装,在这里修改一下也就是升级了一个版本这样我们就容易升级安装了
Release: 10%{?dist}
Packager: ALLEN       ######这项可以不用加入,用来显示签名的
######最后三项要修改成新内核的路径,修改完成可以保存退出了
./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
######开始制作rpm包
[root@localhost SPECS]# rpmbuild -bb iptables.spec

升级安装iptables:

1
2
3
4
5
6
7
8
9
10
######切换目录并查看生成了哪些文件
[root@localhost SPECS]# cd ../RPMS/x86_64/
[root@localhost x86_64]# ls
iptables-1.4.7-10.el6.x86_64.rpm            iptables-devel-1.4.7-10.el6.x86_64.rpm
iptables-debuginfo-1.4.7-10.el6.x86_64.rpm  iptables-ipv6-1.4.7-10.el6.x86_64.rpm
######升级安装iptables,由于当前系统安装了下面两个包,所以这里只需要安装下面两个包即可
[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
Preparing...                ########################################### [100%]
   1:iptables               ########################################### [ 50%]
   2:iptables-ipv6          ########################################### [100%]

安装协议扩展包:

1
2
3
4
5
6
7
8
9
######切换到协议包所在位置
[root@localhost x86_64]# cd /root
######解压缩l7-protocols协议包
[root@localhost ~]# tar xf l7-protocols-2009-05-28.tar.gz
######切换目录并安装协议扩展包
[root@localhost ~]# cd l7-protocols-2009-05-28
[root@localhost l7-protocols-2009-05-28]# make install
mkdir -p /etc/l7-protocols
cp -R * /etc/l7-protocols

此时整个内核编译就成功安装升级完成了,现在只需要编写iptables规则就可以对7层协议做相应的限制和过滤了

支持的layer7应用层协议

匹配格式:iptables [-t 表名] -m layer7 --l7proto 协议名

支持以下常见应用层协议:

QQ:腾讯公司QQ程序的通讯协议

msnmessenger:微软公司MSN程序的通讯协议

msn-filetransfer:MSN程序的文件传输协议

xunlei:迅雷下载工具使用的协议

其他应用层协议:http、ftp、dns、imap、pop3等

示例:过滤使用QQ协议的转发数据

[root@localhost /]# iptables -A FORWARD -m layer7 --l7proto qq -j DROP

除了针对应用层协议过滤之外,还支持以下过滤方式:

根据时间过滤

匹配格式:-m time --timestart 起始时间 --timestop 结束时间 --weekdays 每周的那些天

时间格式以24小时制表示,如早9:30 晚18:00

每周一至周日对应的英文缩写表示为:Mon、Tue、Wed、Thu、Fri、Sat、Sun 也可以使用数字表示周一至周日,如:1、2、3、4、5、6、7

根据并发连接数过滤

匹配格式:-m connlimit --connlimit-above 上限数

根据字符串过滤

匹配格式:-m string --string “字符串” --algo {bm|kmp}

algo是一种算法(算法指的是用于比对数据包字符串的特定方法),可以为bm或kmp,其中任意即可

注:以上匹配格式在前两篇博文中有详细介绍

查看都支持哪些协议:

编译内核实现iptables防火墙layer7应用层过滤 (三)

下面我们以一个案例来设置iptables的7层过滤规则,如下图:

编译内核实现iptables防火墙layer7应用层过滤 (三)

说明:Client为虚拟机,系统:Windows XP   网卡:Vmnet2

Iptables为虚拟机,系统:Centos6.4_x86_64   网上:eth1为内网的网关使用网上类型为VMnet2;eth0为外网IP使用网卡类型为桥接

案例描述:在Iptables服务器上面做7层防火墙过虑限制客户端不能上QQ、用迅雷下载数据

1、在Iptables Server上开启路由转发功能:

1
2
3
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p            #执行此命令让其生效

2、查看nf_conntrack模块是否加载:

1
2
[root@localhost ~]# lsmod | grep -w nf_conntrack
nf_conntrack           79485  6 xt_layer7,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state

3、查看内核连接追踪功能是否开启:

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# sysctl -a | grep acct
kernel.acct = 4 2   30
######如果下面值为0,修改为1
net.netfilter.nf_conntrack_acct = 1
######打开下面文件加入到里面执行如下命令即可生效
[root@localhost ~]# vim /etc/sysctl.conf
net.netfilter.nf_conntrack_acct = 1
[root@localhost ~]# sysctl -p
######也可使用此项命令修改,但一重启系统便会失效
[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
2
[root@localhost ~]# iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto qq -j DROP
[root@localhost ~]# iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto xunlei -j DROP

验证如下图:

编译内核实现iptables防火墙layer7应用层过滤 (三)

编译内核实现iptables防火墙layer7应用层过滤 (三)

查看防火墙匹配规则是否匹配到数据流量,如下图:

到此终于把Iptables防火墙完美结局了,如果博友们做的过程中遇到问题,可以留言,会第一时间回复...

编译内核实现iptables防火墙layer7应用层过滤 (三)的更多相关文章

  1. 编译内核启用iptables及netfilter

    在Network Packet Filtering Framework(Netfilter)一节中还有两个额外的配置节——Core Netfilter Configuration(核心Netfilte ...

  2. 【服务器防护】centos iptables 防火墙设置 mac过滤

    1.阻止MAC地址为XX:XX:XX:XX:XX:XX主机的所有通信: iptables -A INPUT -s 192.168.1.21 -m mac --mac-source XX:XX:XX:X ...

  3. iptables防火墙详解(三)

    linux 高级路由 策略路由(mangle表) lartc(linux advanced routing and traffic control) http://www.lartc.org # rp ...

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

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

  5. linux iptables 防火墙简介

    iptables防火墙简介 Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的安全*的基于包过滤的防火墙工具,它的功能十分强大,使用非 ...

  6. Linux(13):期中架构(5)--- 前端部分:keepalived高可用 &amp&semi; HTTPS &amp&semi; iptables防火墙

    keepalived 高可用集群 1. keepalived服务概念说明 # 1.1 keepalived软件的作用? Keepalived软件起初是专为LVS负载均衡软件设计的, 用来管理并监控LV ...

  7. iptables防火墙的原理及应用

    简介 (netfilter, 位于Linux内核中的包过滤功能体系  ,称为Linux防火墙的“内核态”) iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防 ...

  8. Centos 7 关闭firewall防火墙启用iptables防火墙

    一.关闭firewall防火墙 1.停止firewall systemctl stop firewalld.service 2.禁止firewall开机启动 systemctl disable fir ...

  9. 网络安全之iptables防火墙

    1>各种传输方式到最后都会转化为能够通过网络发送的数据格式: 1>文本格式: 2>二进制格式:2>TCP三次握手连接,四次断开,连接时客户端是主动打开,服务器是被动 打开,处于 ...

随机推荐

  1. HDU 5410 CRB and His Birthday ——(完全背包变形)

    对于每个物品,如果购买,价值为A[i]*x+B[i]的背包问题. 先写了一发是WA的= =.代码如下: #include <stdio.h> #include <algorithm& ...

  2. sublime 3 快捷键

    来自(http://dengo.org/archives/970) Sublime text 3是我最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率. ...

  3. Android项目源码界面超级华丽的仿QQ最新版本

    这是一个我们比较熟悉的一款应用,高仿专仿最新QQ应用源码,也是一个高仿QQ最新版本的项目,界面超级华丽,使用了大量的自定义控件,项目里实现了部分功能,例如WIFI-FTP(把手机变成FTP服务端,可以 ...

  4. 金蝶K3无法创建数据库,请查看该文件夹的错误的解决方法。

    无法创建数据库! 检查你的文件夹C:\XXX\DATA是否存在.并且该系统是不低,或SQL Server服务的启动用户不具备<K3ERP\DBFILE>文件夹的写权限.请改动Windows ...

  5. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  6. Java programming problems

    1.使用循环把26个字母按字典顺序存入数组,在不使用另外数组的情况下将其逆序存放,在根据处理后的字符数组创建一个字符串并输出 public static void main(String[] args ...

  7. HTTP协议(二)之确保web安全的HTTPS

    一.概述 https并非是应用层的一种新协议.只是HTTP通信接口部分用SSL和TLS协议替代. 通常,HTTP直接和TCP通信.当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了. 简 ...

  8. vue2&period;0之element table的使用

    说明: 1.改变表头居中问题:    需要在el-table-column中添加  header-align="center" <el-table :data="t ...

  9. Swift5 语言参考&lpar;八&rpar; 模式

    模式表示单个值或复合值的结构.例如,元组的结构是两个元素的逗号分隔列表.因为模式表示值的结构而不是任何一个特定值,所以可以将它们与各种值匹配.例如,模式匹配元组和任何其他两元素元组.除了将模式与值匹配 ...

  10. python qq邮箱发送邮件

    使用qq发送邮件 # coding=utf8 """ qq邮箱发送邮件 """ import sys reload(sys) sys.set ...