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

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


一、编译内核,使之防火墙支持7层过滤

本实验采用的安装包

#netfilter-layer7-v2.23.tar.bz2 //netfilter-layer7补丁包
#iptables-1.4.20.tar.bz2     //iptables包
#l7-protocols-2009-05-28.tar.gz  //iptables支持的应用层协议包


1、获取并编译内核

[root@station34 ~]# useradd mockbuild //添加安装src格式的软件包需要的用户
[root@station34 ~]# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
[root@station34 ~]# cd rpmbuild/SOURCES
[root@station34 SOURCES]# tar linux-2.6.32-*.tar.gz -C /usr/src
[root@station34 SOURCES]# cd /usr/src
[root@station34 src]# ln -sv linux-2.6.32-431.5.1.el6 linux


2、给内核打补丁

[root@station34 ~]# tar xf netfilter-layer7-v2.23.tar.bz2
[root@station34 ~]# cd /usr/src/linux
[root@station34 linux]# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch //为内核打补丁
[root@station34 linux]# cp /boot/config-*  .config  //拷贝当前系统的config编译配置文件为模板编译内核
[root@station34 linux]# make menuconfig //配置内核参数


配置内核参数步骤图

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第1张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第2张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第3张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第4张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第5张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第6张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第7张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第8张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第9张图片


3、编译并安装内核

[root@station34 linux]# make
[root@station34 linux]# make modules_install
[root@station34 linux]# make install


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

编辑/boot/grub/grub.conf

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第10张图片

把default修改成0,重新启动

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第11张图片


5、重新编译iptables

[root@station34 ~]# tar xf iptables-1.4.20.tar.gz
[root@station34 ~]# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
[root@station34 ~]# cp /etc/rc.d/init.d/iptales /root
[root@station34 ~]# cp /etc/sysconfig/iptables-config /root
[root@station34 ~]# rpm -e iptables iptables-ipv6 --nodeps //卸载原来的iptables
[root@station34 iptables-1.4.20]# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
[root@station34 iptables-1.4.20]# make && make install
[root@station34 iptables-1.4.20]# cp /root/iptables /etc/rc.d/init.d
[root@station34 iptables-1.4.20]# cp /root/iptables-config /etc/sysconfig


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

[root@station34 ~]# tar xf l7-protocols-2009-05-28.tar.gz
[root@station34 ~]# cd l7-protocols-2009-05-28
[root@station34 l7-protocols-2009-05-28]# make install


二、使用layer7模块,实现七层访问过滤

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

支持的layer7应用层协议

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

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

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

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

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

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


本实验目的在Iptables服务器上面做7层防火墙过虑限制客户端不能上QQ,


实验环境:准备4台主机分别当作iptables服务器,内网服务器(2台),外网服务器

需求:让内网上的主机不能通过外网上QQ(SNAT+iptables),外网上的主机可以访问内网上的网站服务器(DNAT)


主机服务名 网卡ip 系统版本
iptables服务器

网卡1:172.16.251.34(连接外网)

网卡2:192.168.10.1(连接内网)

centos6.4
内网普通用户 网卡1:192.168.10.10 windows xp

内网httpd服务器

DNS服务器

网卡1:192.168.10.11 centos6.5
外网服务器 网卡1:172.16.254.58 windows 7


1、iptables服务器的配置

在iptables上配置2块网卡,

网卡1地址为172.16.251.34,用来连接外网

网卡2地址为192.168.10.1 ,用来连接内网    


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


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


     1.2 启用内核连接追踪功能(ACCT):首先装载nf_conntrack模块

[root@localhost ~]# modprobe  nf_conntrack
[root@localhost ~]# sysctl -w net.netfilter.nf_conntrack_acct = 1  //立即生效
永久生效,打开下面文件加入如下命令
[root@localhost ~]# vim /etc/sysctl.conf
net.netfilter.nf_conntrack_acct = 1 //添加这条命令
[root@localhost ~]# sysctl -p


  1.3 添加一条SNAT规则参实现让内网访问外部网络:

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.251.34


 1.4 设置规则:拒绝QQ登录

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


2、内网普通用户的配置

配置网卡ip为192.168.10.10

如图配置:

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第12张图片


可以浏览网页等上网活动,但不能登录QQ

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第13张图片

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第14张图片


3、DNAT的实现

     因为在iptables服务器上没有web服务,当外网用户要访问内网web服务时,外网用户只知道iptables服务器的地址,而不知道内网web服务器的地址,因此需要iptables服务器设置DNAT,来使外网用户可以访问内网web服务


1、在iptables服务器上添加DNAT规则

[root@station34 ~]# iptables -t nat -I PREROUTING 1 -d 172.16.251.34 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11


内网web服务器的网卡配置为

#ifconfig eth0 192.168.10.11
#route add default gw 192.168.10.1


在站点目录编辑个网页文件:

#vim /usr/local/apache/htdocs/index.html
#

Hello god


在外网主机上输入iptables的外网地址172.16.251.34

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第15张图片

从上图看出DNAT设置成功!



4、DNS视图功能实现

DNS视图功能可以自动识别访问的地址是内网地址还是外网地址
在web服务器上搭建DNS服务器

先设置web服务器的网关,使之指向iptables服务器的内网网卡地址192.168.10.1

[root@station160 ~]# route add -net 172.16.0.0/16 gw 192.168.10.1

这样web服务器也实现了SNAT,可以上外网了

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第16张图片


安装Bind

[root@station160 ~]# yum -y install bind


修改/etc/named.conf配置文件,使之支持Acl控制

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第17张图片


配置内网区域文件/etc/named.in.zones

zone "." IN {                //根要包含在view中
        type hint;
        file "named.ca";
};
zone "localhost.localdomain" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.empty";
        allow-update { none; };
};
zone "gulong.com" IN {         //添加这条记录
             type master;
             file "in.gulong.com.zone";
};


配置外网区域文件/etc/named.rfc1912.zones

zone "." IN {
        type hint;
        file "named.ca";
};
zone "localhost.localdomain" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.empty";
        allow-update { none; };
};
zone "gulong.com" IN {    //添加这条记录
             type master;
             file "out.gulong.com.zone";
};


创建内网记录文件/var/named/in.gulong.com.zone

$TTL 600
@            IN        SOA       dns.gulong.com    dnsadmin.gulong.com (
                            2014033001
                            6H
                            30M
                            15D
                            3D  )
             IN        NS  dns
dns          IN        A   192.168.10.11
www          IN        A   192.168.10.11    //内网用户访问是这个地址


创建外网记录文件/var/named/out.gulong.com.zone

$TTL 600
@            IN        SOA       dns.gulong.com    dnsadmin.gulong.com (
                            2014033001
                            6H
                            30M
                            15D
                            3D  )
             IN        NS  dns
dns          IN        A   192.168.10.11
www          IN        A   172.16.251.34 //外网用户访问时是这个地址


重启服务

#service named restart


在web服务器上测试www.gulong.com

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第18张图片


外网用户上测试

iptables实现七层访问过滤,SNAT与DNAT,DNS-View的实现_第19张图片


到此为止,iptables的相关内容已经差不多介绍完了,本人初学iptables,不足之处,请各位大牛多多指正!!