天天看点

iptables之三:基于iptables实现7层访问过滤

一、实现方法

   iptables它是一个典型的网络防火墙,也就是说,它最多也就只能过滤TCP/IP协议栈,对于像QQ,迅雷,酷狗,大智慧等这样的应用层协议,iptables是没有用武之地的;可什么事情都不是绝对的,这不,美国的一个大牛程序员就为iptables/netfilter开发了一个补丁,只要为内核打上layer7这个补丁,那么你就不会再为过滤QQ等应用层协议而忧愁了,实现起来就是分分钟钟的事。因为netfilter是工作于内核空间的,所以我们为其打上补丁后需重新编译内核。而目前官网提供的layer7版本比较低,如果想要实现其功能,只有两个方法:第一为内核降级,第二需编译内核源码。

二、实现必备软件包

1、内核源码包

2、layer7内核补丁

3、iptables源码包

4、l7-protocols协议包

   为了方便,我们把需要的包都放到/root/app下

<a href="http://s3.51cto.com/wyfs02/M02/23/B1/wKiom1M-nTLzmFu3AAAYXUiLtz4591.png" target="_blank"></a>

三、经验分享,血淋淋的教训(2天错误总结)

1、要同步系统时间到当前日期

 此时需要执行:

find . -type f | xargs -n 5 touch

    make clean

    make

2、保证磁盘空间要足够大

3、IPv4连接追踪功能要编译成模块,而非编入内核

四、实现过程

1、获取并编译内核

1)安装内核源码包需新建一个mockbuild用户,否则会报错

2)# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm

   安装内核rpm包后会在/root下生成一rpmbuild目录,在/root/rpmbuild/SOURCES下就会有内核源码包和一堆config

3)进入~/rpmbuild/SOURCES目录,解压tar包

<a href="http://s3.51cto.com/wyfs02/M01/23/B2/wKioL1M-nSfCdB53AACcsjvUlY8024.png" target="_blank"></a>

 为解压后的目录创建软链接,方便以后使用

<a href="http://s3.51cto.com/wyfs02/M00/23/B1/wKiom1M-nYvjAkWbAAAr7W7QZ78808.png" target="_blank"></a>

2、解压补丁包,拿到etfilter-layer7补丁

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKioL1M-naTiopFZAABPl9jba0I286.png" target="_blank"></a>

3、进入内核源码目录,为其打上layer7补丁

<a href="http://s3.51cto.com/wyfs02/M01/23/B1/wKiom1M-nfDjSAwhAACM6A35nVE569.png" target="_blank"></a>

4、以本地内核配置文件为模板,编译内核

1

2

<code>[root@nmshuishui linux]</code><code># cp /boot/config-2.6.32-358.el6.x86_64 .config</code>

<code>[root@nmshuishui linux]</code><code># make menuconfig</code>

(1)装载核心配置模块layer7

Networking support---&gt;Networking options---&gt;Network packet filtering framework(Netfilter)---&gt;core Netfilter Configuration---&gt;"layer7" match support

<a href="http://s3.51cto.com/wyfs02/M02/23/B1/wKiom1M-nhLy9xPbAACETnoX1hE197.png" target="_blank"></a>

(2)开启连接追踪

Networking support---&gt;Networking options---&gt;Network packet filtering framework(Netfilter)---&gt;core Netfilter Configuration---&gt;Netfilter connection tracking support

<a href="http://s3.51cto.com/wyfs02/M00/23/B1/wKiom1M-niiDSwBHAACAAJsqOJE306.png" target="_blank"></a>

(3)开启IPv4的NAT连接追踪功能

Networking support---&gt;Networking options---&gt;Network packet filtering framework(Netfilter)---&gt;IP:Netfilter Configuration---&gt;IPv4 connection tracking support (required for NAT)

(4)取消模块签名认证

   redhat的签名认证,是一种反盗版机制,如果不取消,则拒绝编译

Enable loadable module support---&gt;Module signature verification(EXPERIMENTAL)

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKioL1M-nmKR_aXfAABh6oyZUPQ500.png" target="_blank"></a>

(5)关闭内核签名检查

Cryptographic API---&gt;In-kernel signature checker(EXPERIMENTAL)

<a href="http://s3.51cto.com/wyfs02/M01/23/B2/wKiom1M-nqfSysxEAABcSI-7M9I031.png" target="_blank"></a>

(6)保存退出

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKioL1M-npDRcYHwAAATwN9PZu8931.png" target="_blank"></a>

5、编译并安装内核

3

<code># make -j 4</code>

<code># make modules_install</code>

<code># make install</code>

经过漫长的两个小时的编译,居然还没有编译完事,端起来电脑看,屏幕一直在滚动,终于发现了它好像一直就在那一个页面循环啊!

<a href="http://s3.51cto.com/wyfs02/M01/23/B2/wKioL1M-nq7g6U5qAAB54EnNGu0158.png" target="_blank"></a>

又经过了漫长的一夜的等待,回头一看,居然又报错了,真是天理难容啊!

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKiom1M-nu_imc0nAAA0LFZm5v4572.png" target="_blank"></a>

貌似是在说磁盘空间不足的问题,那就使用df -h查查看吧

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKioL1M-ntbSJlOlAAAZk2WffXA442.png" target="_blank"></a>

   果然是100%了,哎,又没做LVM,看来只能重做个系统了,给根分大点,再重新来一次。

又经过漫长的一上午的艰苦等待,还是没有成功,居然又给报了一个错,说是找不到IPv4连接追踪模块?(气的忘截图了)突然想起来那我会编译的时候是直接编译到内核了,看来不行,那就改成模块方式(上面步骤中已经改正),再来!……又过了好久好久 终于OK了!

6、重启系统,启用新内核

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKioL1M-nv2CABYBAAAjrwWap5Y812.png" target="_blank"></a>

7、编译iptables

(1)为iptables打补丁

现在虽然内核支持layer7了,但是iptables并不支持layer7命令,所以我们还需要编译iptables,为iptables打补丁,让其能够支持layer7命令

<code># tar xf iptables-1.4.20.tar.gz</code>

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKiom1M-n1KB592vAACBi6kTKTk996.png" target="_blank"></a>

(2)备份iptables的服务脚本及配置文件

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKiom1M-n2Lw5o_RAAA4GRDRDkQ003.png" target="_blank"></a>

(3)卸载iptables

<code>rpm -e iptables iptables-ipv6 --nodeps</code>

(4)编译安装iptables

<code>.</code><code>/configure</code>  <code>--prefix=</code><code>/usr</code>  <code>--with-ksource=</code><code>/usr/src/linux</code>

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKioL1M-n1_wZJ2kAAAwnNyjj6E488.png" target="_blank"></a>

   编译时可能会出现这样一个界面,直接略过

<a href="http://s3.51cto.com/wyfs02/M02/23/B3/wKioL1M-4Qjij1YGAABZe-XfCMk850.png" target="_blank"></a>

(5)make &amp;&amp; make install

(6)为编译安装的iptables提供脚本及配置文件

<code>cp</code> <code>/root/app/iptables</code> <code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code>

<code>cp</code> <code>/root/app/iptables-config</code> <code>/etc/sysconfig/</code>

8、为layer7模块提供其所识别的协议的特征码

<code># tar zxvf l7-protocols-2009-05-28.tar.gz</code>

<code># cd l7-protocols-2009-05-28</code>

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKioL1M-n3ihvxxhAABYFuy5kDo253.png" target="_blank"></a>

9、如何使用layer7模块

(1)查看iptables的版本

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKiom1M-n7XCdp_9AAAWZBs0YOw494.png" target="_blank"></a>

(2)修改iptables的脚本

因为我们在编译安装的时候修改了脚本的安装路径,所以我们复制前的那个脚本中的会有一些问题需要改改

<code>vim </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/iptables</code>

(3)ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKiom1M-n_yBG7Y5AAA2ka0uZX4540.png" target="_blank"></a>

(4)启用连接追踪功能

这里需要在/etc/sysctl.conf中添加一条

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKioL1M-n-3AAKRmAAATP073Lts704.png" target="_blank"></a>

(5)iptables应用层过滤语法

因为我们为iptables打了补丁,使其能够支持应用层的过滤,所以就支持了新的语法格式

<code># iptables [specify table &amp; chain] -m layer7 --l7proto [protocol name] -j [action]</code>

五、应用层过滤测试(基于iptables实现应用层QQ协议过滤)

1、内网客户端环境

内网客户端win7一台,处于VMnet5段中

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKiom1M-p0iwM1qzAAB1JbqWlhg940.png" target="_blank"></a>

2、服务器端配置

(1)网卡分配

服务器配置两块网卡,一块用于外网(eth0:172.16.251.93),一块用于外网(eth1:192.168.1.104)

<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKiom1M-p5CBnmLXAABuVIecSMY018.png" target="_blank"></a>

(2)开启转发功能

为了使内网客户端能够通过此服务器上网,需开启转发功能

<a href="http://s3.51cto.com/wyfs02/M00/23/B3/wKioL1M-p5CRe9X_AAAaHlrGXjM441.png" target="_blank"></a>

这只是临时设置,重启失效,如果想永久生效,请修改配置文件/etc/sysctl.conf

(3)设置iptables规则,使内网客户端可以外网

方法一:设置源地址转换

<a href="http://s3.51cto.com/wyfs02/M02/23/B2/wKiom1M-p-fwLngyAAA--_atdFE784.png" target="_blank"></a>

方法二:设置内网源地址伪装

<a href="http://s3.51cto.com/wyfs02/M02/23/B3/wKioL1M-p9uyYCUAAABIkjLsBB4067.png" target="_blank"></a>

(4)l7规则前,内网客户端可正常登录QQ

<a href="http://s3.51cto.com/wyfs02/M01/23/B2/wKiom1M-qDqS8HdyAAVXPjeiI-s801.png" target="_blank"></a>

(5)基于iptables规则过滤QQ协议

<a href="http://s3.51cto.com/wyfs02/M00/23/B3/wKioL1M-qC_DvqihAAAlJV6Sduc903.png" target="_blank"></a>

(6)查看过滤结果

<a href="http://s3.51cto.com/wyfs02/M02/23/B3/wKioL1M-xNyDii20AAP95fcBvjs074.png" target="_blank"></a>

iptables之三:基于iptables实现7层访问过滤

本文转自 nmshuishui 51CTO博客,原文链接:http://blog.51cto.com/nmshuishui/1390828,如需转载请自行联系原作者

继续阅读