iptables 实现应用层过滤

    在linux环境中,工作于内核空间的netfilter和工作于用户空间的iptables共同组成了其功能强大且操作灵活的防火墙系统,对进出主机或内外网之间的流量基于IP地址、通信协议、端口以及连接状态等进行管控,然而,对于一些使用非固定端口或者通信协议的应用程序,默认是没有办法做限制的,比如聊天软件QQ、下载工具迅雷等,不过我们可以通过增添模块的方式来实现应用程序管控。

    一、实验拓扑

        主机A使用网卡eth0通过路由器接入公网(internet),使用网卡eth1与主机B相连,主机B网关指向主机A的eth1网卡的ip地址,通过A代理访问internet。 

      blob.png   

    二、实验环境

       (1)、实验平台:Vmware Workstation 10

       (2)、系统平台:

               主机A:CentOS 6.5 x86_64

                  eth0:192.168.1.209

                  eth1:192.168.2.1

               主机B:Windows 7 64位旗舰版

                  eth0:192.168.2.2

    三、用到的软件以及版本 

        blob.png   

    四、实验目的

        在主机A上面给新内核打上l7layer netfilter补丁并进行编译,提供支持layer7的iptables,在主机A上配置l7layer过滤,使主机B不能登录QQ,以此来验证其应用层过滤功能。

    五、在主机A上做如下配置

        (1)、给内核打补丁

               由于我们下载的内核时rpm格式,首先我们先安装它,注意,此处需创建mockbuild用户,否则无法安装内核rpm包。

               blob.png

               安装完以后,在当前目录下生成目录 ~/rpmbuild,进入到./rpmbuild/SOURCES/目录下,查看其中文件

               blob.png

               将该目录中的内核归档文件展开至/usr/src下,并创建符号链接文件为linux

               # tar -xf linux-2.6.32-431.11.2.e16.tar.bz2 -C /usr/src 

               blob.png

               查看解压后的内核文件

               blob.png

               如上图我们可以看到Makefile文件,我们可以修改此文件来给我们新编译的内核做标记,以便在多内核同时存在的情况下启动系统是能到一眼认出我们需要启动的内核,做以下修改后,为本文新编译的内核添加-silently后缀。

               blob.png

               将blob.png补丁文件展开至/usr/src目录下并查看,

               blob.png

                使用上图标出的补丁文件对内核打补丁,注意,打补丁时将当前工作目录切换至内核文件所在目录(即本文上面创建的符号链接文件linux中)

                blob.png

                注意 此处打补丁命令patch的选项“-p1”是指当前工作目录相对需打补丁的文件目录有几层(本文件中切换至需打补丁文件所在目录,即仅有当前目录这一层,因此为p1)

        (2)、编译内核(注意,一下操作均在打完补丁后的内核文件所在目录中执行,本文即/usr/src/linux目录下)

                为方便实验基于当前系统的内核配置文件修改后进行编译,当前内核配置文件存在于/boot/下

                blob.png                

                启动menuconfig图形界面配置内核

                blob.png

                依下图顺序分别去掉模块签名认证和内核编译时的签名认证,如不取消,由于redhat内置密钥验证机制,编译玩的内核将会出现安装不通过的情况

                选择“启用模块装卸载支持”,回车进入

                blob.png

                选定图示行,按空格键取消“模块装载前面认证”

                blob.png

                返回到首页,选择图示行,回车进入

                blob.png

                选择“内核签名认证选项”,空格键取消

                blob.png

                返回首页,依下图顺序,选定l7laye netfilter模块,使新编译的内核拥有该模块

                blob.png

                blob.png

                blob.png

                blob.png  

                blob.png

                保存退出。

                一次执行如下操作,编译安装内核

                # make -j 2                 //指定使用两个cpu核心并行执行make操作

                # make modules_install      //安装内核配置文件种指定模块

                # make install              //安装新内核

                安装完成后,查看/boot/grub/grub.con,看以看到新内核已经生成配置信息。

                blob.png

                重启系统选择新内核启动。

                blob.png

        (3)、提供支持7layer模块的iptables,本文介绍两种方式,一种是编译安装,另一种是制作成rpm包来安装。

            A、将打完补丁后的iptables原文件制作成rpm包进行升级安装 

              本方式使用blob.png

              1、安装目标rpm包(本文使用iptables-1.4.7-11.e16.src.rpm

               # rpm -ivh iptables-1.4.7-11 //此步会在当前目录下生成rpmbuild目录

              2、为iptables打补丁使其支持7layer netfileter

               # cd rpmbuild/SOURCE/下    //此目录中有iptables的归档文件

               # tar -xf iptables-1.4.7.tar.bz2 //展开归档文件

               # cd iptables-1.4.7       //cd进展开后目录

               # cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* ./extensions/  //拷贝补丁文件至目标目录

              3、将打完补丁的新版本文件重新归档至~/rpmbuild/SOURCE/中(注意此处需提前移除源归档文件)

               # mv ~/rpmbuild/SOURCE/iptables-1.4.7.tar.bz2 /     //移除原归档文件 

               # tar -jcf iptables-1.4.7.tar.bz2 ~/rpmbuild/SOURCE/iptables-1.4.7/*  //将打完补丁后的文件重新打包成归档文件。

              4、修改spec文件,以便新做成的rpm包可以适用于我们新编译的内核

               # vim ~/rpmbuild/SPECS/iptables.spec

               blob.png

               blob.png

               blob.png

               blob.png

               上述修改完成后,谨记保存退出,然后创建rpm安装包

               # rpmbuild iptables.spec

               待执行完成后,查看rpmbuild目录

               # ls ~/rpmbuild

               blob.png

               上图示,创建rpm安装包是新创建的目录

               blob.png 

               上图可以看到,RPM包已经创建成功

              5、升级iptables为我们新创建的版本

               blob.png

               查看升级生成文件确认支持7layer netfilter模块

               # rpm -ql iptables 

               blob.png

               查看iptables详细安装信息,确认版本

               blob.png

            B、编译安装iptables

               本方式使用blob.png

              1、解压iptables源码归档包并为其打支持layer7 netfilter支持补丁

               # tar -xf iptables-1.4.20.tar.bz2

               # cd iptables-1.4.20

               \\注意,此处打补丁不同于上文为内核打补丁的方式,此处只需将/usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/=目录下的所有文件拷贝至~/iptables-1.4.20/extensions/目录下即可

               # cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* ~/iptables-1.4.20/extensions/ 

              2、备份系统已安装iptables的服务脚本文件和配置文件

               blob.png

               忽略依赖方式卸载旧版本iptables,为编译安装新iptables做准备

               blob.png

              3、编译安装iptables 

               # ./configure –prefix=/usr –with-ksource=/usr/src/linux

               # make && make install 

               还原服务脚本文件和主配置文件,注意,由于此编译安装的iptables版本安装路径不同于其默认安装路径,因此要对服务脚本文件做以下修改

               # cp /root/iptables /etc/rc.d/init.d/iptables 

               # cp /root/iptables-config /etc/sysconfig/iptables-config 

               # vim /etc/etc/rc.d/init.d/iptables 

               blob.png

    六、测试iptables应用层过滤

        (1)装载应用层过滤所需模块    

              1、为应用层过滤提供特征码(每个应用程序都有其特征码,netfilter增加了l7layer模块支持后,就是依此特征码来做流量过滤的)

               # tar -xf tar -xf l7-protocols-2009-05-28.tar.gz

               # cd  l7-protocols-2009-05-28

               # make install 

               blob.png

              2、由于l7layer过滤功能依赖于nf_conntract模块,故需要将其装载

               blob.png

               修改配置文件,启用nf_conntract模块,使其永久有效

               # vim /etc/sysctl.conf

               blob.png

               # sysctl -p //确认此模块生效

               blob.png

    

        (2)、编辑/etc/sysctl.conf,启用主机路由功能

               # vim /etc/sysctl.conf

               blob.png

               # sysctl -p //确认路由功能开启并生效       

               blob.png

               添加防火墙策略,让主机A成为主机B的上网代理服务器

               # iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT –to-source 192.168.1.211 

               blob.png

               测试主机C能正常上网以及登录QQ

               上网正常

               blob.png

               QQ也能正常登录

               blob.png

               在FORWARD链上配置netfilter策略,拒绝qq流量通过

               # iptables -A FORWARD -m layer7 –l7proto qq -j REJECT

               然后小退qq,重新登录

               blob.png

               可以看到,qq已经无法登录,查看相应规则

               blob.png

               看到有匹配到响应报文,应用层过滤已实现!

   

           

               

原创文章,作者:Silently,如若转载,请注明出处:http://www.178linux.com/6181