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

(0)
SilentlySilently
上一篇 2015-07-09 14:16
下一篇 2015-07-13 16:46

相关推荐

  • keepalived的初级使用

        1、双主模型的ipvs高可用   一、双主模型的ipvs高可用     1)网络结构图       2)、ipvs的类型是dr模型,调度算法是rr       RS1和RS2都是centos6.8 对RS1和RS2的配置:…

    Linux干货 2017-05-15
  • 抓包获取QQ好友IP地址

    作者:网海过客 原文连接:https://www.chinasa.net/archives/326.html 原理:通过抓包软件,抓取QQ进程,向QQ好向发送UDP数据包,获取QQ好友IP地址 抓包软件:科来网络分析系统 步骤: 1、打开抓包软件,选择网卡,本地进程分析。 2、向QQ好友发起语音通话 3、在抓包软件里,找到QQ进程,数据包,过滤UDP协议,在…

    Linux干货 2017-06-30
  • 超级用户切换普通用户后如何重置root密码

    今天在使用su命令切换root用户和普通用户使用中不小心改了root密码,在普通用户条件下怎么也切换不到root用户,于是通过搜索和尝试终于改了root密码,现以centos7为例总结如下: 1、首先进入开启菜单,按下e键进入编辑模式,找到ro那一行,将ro改为rw,在语言后面加上init=/bin/sh 2、根据提示按下ctrl-x键(注意选中x) 3、尝…

    Linux干货 2017-03-27
  • 计算机硬件及Linux简介

    计算机的组成 计算机主要分成五大部分:输入单元、控制单元、运算单元、存储器、输出单元。 其中,中央处理器(CPU)是一个具有特定功能的芯片,含有微指令集。包括控制单元与运算单元。 控制单元对程序进行控制,调度程序、数据、地址。运算单元负责对数据的各种逻辑运算和数字运算。 计算机的功能 包括但不限于 驱动程序:字面意思。 进程管理:计算机内部能够通过分配资源,…

    Linux干货 2016-10-30
  • N28-第四周博客作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。

    2、编辑/etc/group文件,添加组hadoop。

    3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。

    4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。

    5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。

    6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;

    7、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

    8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;

    9、找出/etc/passwd文件中的一位数或两位数;

    10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

    11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

    12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

    13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    Linux干货 2017-12-26
  • Bash Shell中的for循环和运算表达式应用

    Bash Shell中的for循环和运算表达式应用 1、写一个脚本 实现以下功能: 接受一个以上文件路径作为参数, 显示每个文件拥有的行数,总结说明本次共为几个文件统计了其行数。设定此脚本至少需要一个参数并给出提示,$#表示参数的个数。将脚本提供的所有参数组成一个列表放入for语句依次进行循环执行echo "$i has $(wc -l $i | …

    Linux干货 2016-12-13